From 2fca6831186831a1f2aed27f40c734438ddea044 Mon Sep 17 00:00:00 2001 From: Samuel Nitsche Date: Wed, 23 May 2018 11:50:04 +0200 Subject: [PATCH 001/181] Test to verify there's a problem with cursor-comparison on 12.1 when there are several numbers with different precision and we make use of package-level nested table types --- .../test_expectations_cursor.pkb | 28 ++++++++++++++++++- .../test_expectations_cursor.pks | 13 +++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/test/core/expectations/compound_data/test_expectations_cursor.pkb b/test/core/expectations/compound_data/test_expectations_cursor.pkb index b805105e6..45f369e64 100644 --- a/test/core/expectations/compound_data/test_expectations_cursor.pkb +++ b/test/core/expectations/compound_data/test_expectations_cursor.pkb @@ -1040,6 +1040,32 @@ Rows: [ 2 differences ]% ut.expect(sqlcode).to_be_between(-31013,-31011); end; end; - + + procedure compare_number_pckg_type + as + l_expected sys_refcursor; + l_actual sys_refcursor; + l_expected_data t_num_tab; + begin + + l_expected_data(1).col1 := 2135; + l_expected_data(1).col4 := 2016; + l_expected_data(1).col5 := -1; + + open l_expected for select * + from table (l_expected_data); + open l_actual for select + 1 as col1 + ,2 as col2 + ,3 as col3 + ,2016 as col4 + ,-1 as col5 + from dual; + + ut3.ut.expect(l_actual).to_equal(a_expected => l_expected); + + ut.expect(expectations.failed_expectations_data()).not_to_be_null(); + end; + end; / diff --git a/test/core/expectations/compound_data/test_expectations_cursor.pks b/test/core/expectations/compound_data/test_expectations_cursor.pks index 4868b72ce..ae29ea5f9 100644 --- a/test/core/expectations/compound_data/test_expectations_cursor.pks +++ b/test/core/expectations/compound_data/test_expectations_cursor.pks @@ -198,6 +198,19 @@ create or replace package test_expectations_cursor is --%test( Fail on passing implicit column name as exclude filter ) procedure exclude_col_name_implicit; + + --%test( Comparing number types with different precisions works with package-type nested tables ) + procedure compare_number_pckg_type; + + type t_num_rec is record ( + col1 number(15,0), + col2 number(1,0), + col3 number(4,0), + col4 number(4,0), + col5 number(38,0)); + + + type t_num_tab is table of t_num_ec index by binary_integer; end; / From e528ebbadece32f35c72cba2521f286492a54a9e Mon Sep 17 00:00:00 2001 From: Samuel Nitsche Date: Wed, 23 May 2018 12:18:58 +0200 Subject: [PATCH 002/181] Typo --- .../expectations/compound_data/test_expectations_cursor.pks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/core/expectations/compound_data/test_expectations_cursor.pks b/test/core/expectations/compound_data/test_expectations_cursor.pks index ae29ea5f9..eb93bd08c 100644 --- a/test/core/expectations/compound_data/test_expectations_cursor.pks +++ b/test/core/expectations/compound_data/test_expectations_cursor.pks @@ -210,7 +210,7 @@ create or replace package test_expectations_cursor is col5 number(38,0)); - type t_num_tab is table of t_num_ec index by binary_integer; + type t_num_tab is table of t_num_rec index by binary_integer; end; / From 7a4827800e839d1e9f7aef910c1b5f1cb0060c10 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Thu, 14 Mar 2019 16:25:27 +0000 Subject: [PATCH 003/181] Initial checkin --- source/core/ut_expectation_processor.pkb | 7 +- source/core/ut_expectation_processor.pks | 2 + source/core/ut_utils.pkb | 13 +++ source/core/ut_utils.pks | 12 ++- .../data_values/ut_data_value_refcursor.tpb | 6 ++ .../expectations/test_expectations_cursor.pkb | 94 +++++++++++++++++++ .../expectations/test_expectations_cursor.pks | 9 ++ 7 files changed, 141 insertions(+), 2 deletions(-) diff --git a/source/core/ut_expectation_processor.pkb b/source/core/ut_expectation_processor.pkb index 170846125..f0b0a72a7 100644 --- a/source/core/ut_expectation_processor.pkb +++ b/source/core/ut_expectation_processor.pkb @@ -88,7 +88,12 @@ create or replace package body ut_expectation_processor as begin add_expectation_result(ut_expectation_result(ut_utils.gc_failure, null, a_message)); end; - + + procedure report_failure_no_caller(a_message in varchar2) is + begin + add_expectation_result(ut_expectation_result(ut_utils.gc_failure, null, a_message,false)); + end; + function get_session_parameters return tt_nls_params is l_session_params tt_nls_params; begin diff --git a/source/core/ut_expectation_processor.pks b/source/core/ut_expectation_processor.pks index f58de2441..017b6aaba 100644 --- a/source/core/ut_expectation_processor.pks +++ b/source/core/ut_expectation_processor.pks @@ -35,6 +35,8 @@ create or replace package ut_expectation_processor authid current_user as procedure add_expectation_result(a_expectation_result ut_expectation_result); procedure report_failure(a_message in varchar2); + + procedure report_failure_no_caller(a_message in varchar2); procedure set_xml_nls_params; diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 79d2df10f..11602ae1f 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -719,5 +719,18 @@ create or replace package body ut_utils is 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); + l_ora_search_pattern varchar2(500) := '^ORA'||a_ora_code||': (.*)$'; + begin + l_caller_stack_line := regexp_replace(srcstr => a_error_stack + ,pattern => l_ora_search_pattern + ,replacestr => null + ,position => 1 + ,occurrence => 1 + ,modifier => 'm'); + return l_caller_stack_line; + end; + end ut_utils; / diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index e4f0641d2..0c779fd09 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -105,6 +105,10 @@ create or replace package ut_utils authid definer is gc_dml_for_all constant pls_integer := -20215; pragma exception_init (ex_dml_for_all, -20215); + ex_xml_processing exception; + gc_xml_processing constant pls_integer := -19202; + pragma exception_init (ex_xml_processing, -19202); + gc_max_storage_varchar2_len constant integer := 4000; gc_max_output_string_length constant integer := 4000; gc_max_input_string_length constant integer := gc_max_output_string_length - 2; --we need to remove 2 chars for quotes around string @@ -353,6 +357,12 @@ create or replace package ut_utils authid definer is * Returns list of sub-type reporters for given list of super-type reporters */ function get_child_reporters(a_for_reporters ut_reporters_info := null) return ut_reporters_info; - + + /** + * Remove given ORA error from stack + */ + function remove_error_from_stack(a_error_stack varchar2, a_ora_code number) return varchar2; + + end ut_utils; / diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index 53c881693..24febc46c 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -96,6 +96,12 @@ create or replace type body ut_data_value_refcursor as exception when cursor_not_open then raise_application_error(-20155, 'Cursor is not open'); + when ut_utils.ex_xml_processing then + if l_cursor%isopen then + close l_cursor; + end if; + ut_expectation_processor.report_failure_no_caller('Failed to process ref_cursor with error'||chr(10)|| + ut_utils.remove_error_from_stack(sqlerrm,-19202)); when others then if l_cursor%isopen then close l_cursor; diff --git a/test/core/expectations/test_expectations_cursor.pkb b/test/core/expectations/test_expectations_cursor.pkb index 599745de7..e212bf076 100644 --- a/test/core/expectations/test_expectations_cursor.pkb +++ b/test/core/expectations/test_expectations_cursor.pkb @@ -2465,5 +2465,99 @@ Diff:% ut.expect(l_actual_message).to_be_like(l_expected_message); end; + procedure xml_error_actual is + c_price CONSTANT NUMBER(20,4):= 1357; + c_user CONSTANT varchar2(30):= 'TEST_USER'; + v_actual sys_refcursor; + v_expected sys_refcursor; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + open v_actual for + select cast(null as number(10)) as usd_price_amt, c_user as update_id + from dual where dummy = 1; + open v_expected for + select c_price as usd_price_amt, c_user as update_id from dual; + + ut3.ut.expect(v_actual).to_equal(v_expected); + --Assert + l_expected_message := q'[%Failed to process ref_cursor with error +%ORA-01722: invalid number +%Actual: refcursor [ count = ] was expected to equal: refcursor [ count = 1 ] +%Diff: +%Columns: +%Column [data-type: NUMBER] is missing. Expected column position: 1. +%Column [data-type: VARCHAR2] is missing. Expected column position: 2. +%Rows: [ 1 differences ] +%Row No. 1 - Missing: 1357TEST_USER]'; + + l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure xml_error_expected is + c_price CONSTANT NUMBER(20,4):= 1357; + c_user CONSTANT varchar2(30):= 'TEST_USER'; + v_actual sys_refcursor; + v_expected sys_refcursor; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + open v_expected for + select cast(null as number(10)) as usd_price_amt, c_user as update_id + from dual where dummy = 1; + open v_actual for + select c_price as usd_price_amt, c_user as update_id from dual; + + ut3.ut.expect(v_actual).to_equal(v_expected); + --Assert + l_expected_message := q'[%Failed to process ref_cursor with error +%ORA-01722: invalid number +%Actual: refcursor [ count = 1 ] was expected to equal: refcursor [ count = ] +%Diff: +%Columns: +%Column [data-type: NUMBER] is missing. Expected column position: 1. +%Column [data-type: VARCHAR2] is missing. Expected column position: 2. +%Rows: [ 1 differences ] +%Row No. 1 - Extra: 1357TEST_USER]'; + + l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure xml_error_both is + c_price CONSTANT NUMBER(20,4):= 1357; + c_user CONSTANT varchar2(30):= 'TEST_USER'; + v_actual sys_refcursor; + v_expected sys_refcursor; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + open v_actual for + select cast(null as number(10)) as usd_price_amt, c_user as update_id + from dual where dummy = 1; + open v_expected for + select cast(null as number(10)) as usd_price_amt, c_user as update_id + from dual where dummy = 1; + + ut3.ut.expect(v_actual).to_equal(v_expected); + --Assert + l_expected_message := q'[%Failed to process ref_cursor with error +%ORA-01722: invalid number +%Actual: refcursor [ count = 1 ] was expected to equal: refcursor [ count = ] +%Diff: +%Columns: +%Column [data-type: NUMBER] is missing. Expected column position: 1. +%Column [data-type: VARCHAR2] is missing. Expected column position: 2. +%Rows: [ 1 differences ] +%Row No. 1 - Extra: 1357TEST_USER]'; + + l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + end; / diff --git a/test/core/expectations/test_expectations_cursor.pks b/test/core/expectations/test_expectations_cursor.pks index c0195393e..26605addd 100644 --- a/test/core/expectations/test_expectations_cursor.pks +++ b/test/core/expectations/test_expectations_cursor.pks @@ -390,6 +390,15 @@ create or replace package test_expectations_cursor is --%test(Cursor to contain duplicates fail) procedure to_contain_duplicates_fail; + + --%test(Fail to process a cursor for actual) + procedure xml_error_actual; + + --%test(Fail to process a cursor for expected) + procedure xml_error_expected; + + --%test(Fail to process a cursor for both) + procedure xml_error_both; end; / From ad3ce1074ac0eb35516e581f4a44f3335fb69bfe Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sat, 16 Mar 2019 11:45:17 +0000 Subject: [PATCH 004/181] Adding handling of xml error --- .../data_values/ut_data_value_refcursor.tpb | 8 +-- .../expectations/test_expectations_cursor.pkb | 53 +++++++------------ 2 files changed, 24 insertions(+), 37 deletions(-) diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index a470b4f61..26a820fb7 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -100,8 +100,8 @@ create or replace type body ut_data_value_refcursor as if l_cursor%isopen then close l_cursor; end if; - ut_expectation_processor.report_failure_no_caller('Failed to process ref_cursor with error'||chr(10)|| - ut_utils.remove_error_from_stack(sqlerrm,-19202)); + ut_expectation_processor.report_failure_no_caller('SQL exception thrown when fetching data from cursor: '|| + ut_utils.remove_error_from_stack(sqlerrm,-19202)||chr(10)||'Check the query and data for errors.'); when others then if l_cursor%isopen then close l_cursor; @@ -117,7 +117,9 @@ create or replace type body ut_data_value_refcursor as dbms_lob.createtemporary(l_result, true); ut_utils.append_to_clob(l_result, 'Data-types:'||chr(10)); - ut_utils.append_to_clob( l_result, self.cursor_details.get_xml_children().getclobval() ); + if self.cursor_details.cursor_columns_info.count > 0 then + ut_utils.append_to_clob( l_result, self.cursor_details.get_xml_children().getclobval() ); + end if; ut_utils.append_to_clob(l_result,chr(10)||(self as ut_compound_data_value).to_string()); l_result_string := ut_utils.to_string(l_result,null); dbms_lob.freetemporary(l_result); diff --git a/test/core/expectations/test_expectations_cursor.pkb b/test/core/expectations/test_expectations_cursor.pkb index e904d8419..ed7dd5479 100644 --- a/test/core/expectations/test_expectations_cursor.pkb +++ b/test/core/expectations/test_expectations_cursor.pkb @@ -972,18 +972,21 @@ Rows: [ 4 differences ] procedure reports_on_exception_in_cursor as l_actual sys_refcursor; - l_error_code integer := -19202; --Error occurred in XML processing + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); begin --Act open l_actual for select 1/0 as error_column from dual connect by level < 10; - begin ut3.ut.expect(l_actual).to_be_empty(); --Assert - ut.fail('Expected '||l_error_code||' but nothing was raised'); - exception - when others then - ut.expect(sqlcode).to_equal(l_error_code); - end; + --Assert + l_expected_message := q'[%SQL exception thrown when fetching data from cursor:% +%ORA-01476: divisor is equal to zero% +%Check the query and data for errors.]'; + + l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); end; procedure exception_when_closed_cursor @@ -2481,15 +2484,9 @@ Diff:% ut3.ut.expect(v_actual).to_equal(v_expected); --Assert - l_expected_message := q'[%Failed to process ref_cursor with error -%ORA-01722: invalid number -%Actual: refcursor [ count = ] was expected to equal: refcursor [ count = 1 ] -%Diff: -%Columns: -%Column [data-type: NUMBER] is missing. Expected column position: 1. -%Column [data-type: VARCHAR2] is missing. Expected column position: 2. -%Rows: [ 1 differences ] -%Row No. 1 - Missing: 1357TEST_USER]'; + l_expected_message := q'[%SQL exception thrown when fetching data from cursor:% +%ORA-01722: invalid number% +%Check the query and data for errors.]'; l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; --Assert @@ -2512,15 +2509,9 @@ Diff:% ut3.ut.expect(v_actual).to_equal(v_expected); --Assert - l_expected_message := q'[%Failed to process ref_cursor with error -%ORA-01722: invalid number -%Actual: refcursor [ count = 1 ] was expected to equal: refcursor [ count = ] -%Diff: -%Columns: -%Column [data-type: NUMBER] is missing. Expected column position: 1. -%Column [data-type: VARCHAR2] is missing. Expected column position: 2. -%Rows: [ 1 differences ] -%Row No. 1 - Extra: 1357TEST_USER]'; + l_expected_message := q'[%SQL exception thrown when fetching data from cursor:% +%ORA-01722: invalid number% +%Check the query and data for errors.]'; l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; --Assert @@ -2544,15 +2535,9 @@ Diff:% ut3.ut.expect(v_actual).to_equal(v_expected); --Assert - l_expected_message := q'[%Failed to process ref_cursor with error -%ORA-01722: invalid number -%Actual: refcursor [ count = 1 ] was expected to equal: refcursor [ count = ] -%Diff: -%Columns: -%Column [data-type: NUMBER] is missing. Expected column position: 1. -%Column [data-type: VARCHAR2] is missing. Expected column position: 2. -%Rows: [ 1 differences ] -%Row No. 1 - Extra: 1357TEST_USER]'; + l_expected_message := q'[%SQL exception thrown when fetching data from cursor:% +%ORA-01722: invalid number% +%Check the query and data for errors.]'; l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; --Assert From 133ecaef7e57cfb0ed448118822aa05d6a88258a Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 22 Mar 2019 18:48:24 +0000 Subject: [PATCH 005/181] Adding new API user. --- .travis/install.sh | 30 +- development/cleanup.sh | 3 +- development/install.sh | 2 +- development/template.env.sh | 3 +- test/install_ut3_tester_helper.sql | 42 +++ test/install_ut3_user_tests.sql | 39 +++ test/{ => ut3_tester_helper}/core.pkb | 33 +++ test/{ => ut3_tester_helper}/core.pks | 11 + test/ut3_user/expectations/test_matchers.pkb | 271 +++++++++++++++++++ test/ut3_user/expectations/test_matchers.pks | 27 ++ 10 files changed, 446 insertions(+), 15 deletions(-) create mode 100644 test/install_ut3_tester_helper.sql create mode 100644 test/install_ut3_user_tests.sql rename test/{ => ut3_tester_helper}/core.pkb (70%) rename test/{ => ut3_tester_helper}/core.pks (52%) create mode 100644 test/ut3_user/expectations/test_matchers.pkb create mode 100644 test/ut3_user/expectations/test_matchers.pks diff --git a/.travis/install.sh b/.travis/install.sh index e37cfa35f..3cd476981 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -60,27 +60,33 @@ grant select any dictionary to $UT3_OWNER; grant create any procedure, drop any procedure, execute any procedure to $UT3_OWNER; SQL -#Create user that will own the tests +#Create user that will own the tests that are relevant to internal framework time "$SQLCLI" sys/$ORACLE_PWD@//$CONNECTION_STR AS SYSDBA <<-SQL set feedback off @create_utplsql_owner.sql $UT3_TESTER $UT3_TESTER_PASSWORD $UT3_TABLESPACE - ---needed for testing distributed transactions -grant create public database link to $UT3_TESTER; -grant drop public database link to $UT3_TESTER; -set feedback on ---Needed for testing coverage outside of main UT3 schema. -grant create any procedure, drop any procedure, execute any procedure, create any type, drop any type, execute any type, under any type, select any table, update any table, insert any table, delete any table, create any table, drop any table, alter any table, select any dictionary to $UT3_TESTER; -revoke execute on dbms_crypto from $UT3_TESTER; -grant create job to $UT3_TESTER; exit SQL -#Create additional UT3$USER# to test for special characters +#Create additional UT3$USER# to test for special characters and front end API testing time "$SQLCLI" sys/$ORACLE_PWD@//$CONNECTION_STR AS SYSDBA <<-SQL set feedback off @create_utplsql_owner.sql $UT3_USER $UT3_USER_PASSWORD $UT3_TABLESPACE ---Grant UT3 framework to UT3$USER# +--Grant UT3 framework to min user @create_user_grants.sql $UT3_OWNER $UT3_USER exit SQL + +#Create additional UT3_TESTER_HELPER that will provide a functions to allow min grant test user setup test +time "$SQLCLI" sys/$ORACLE_PWD@//$CONNECTION_STR AS SYSDBA <<-SQL +set feedback off +@create_utplsql_owner.sql $UT3_TESTER_HELPER $UT3_TESTER_HELPER_PASSWORD $UT3_TABLESPACE +--needed for testing distributed transactions +grant create public database link to $UT3_TESTER_HELPER; +grant drop public database link to $UT3_TESTER_HELPER; +set feedback on +--Needed for testing coverage outside of main UT3 schema. +grant create any procedure, drop any procedure, execute any procedure, create any type, drop any type, execute any type, under any type, select any table, update any table, insert any table, delete any table, create any table, drop any table, alter any table, select any dictionary to $UT3_TESTER_HELPER; +revoke execute on dbms_crypto from $UT3_TESTER_HELPER; +grant create job to $UT3_TESTER_HELPER; +exit +SQL diff --git a/development/cleanup.sh b/development/cleanup.sh index 3b6e22e53..086db6786 100755 --- a/development/cleanup.sh +++ b/development/cleanup.sh @@ -3,7 +3,7 @@ #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" -. development/env.sh +#. development/env.sh "${SQLCLI}" sys/${ORACLE_PWD}@//${CONNECTION_STR} AS SYSDBA <<-SQL set echo on @@ -21,6 +21,7 @@ end; drop user ${UT3_OWNER} cascade; drop user ${UT3_RELEASE_VERSION_SCHEMA} cascade; drop user ${UT3_TESTER} cascade; +drop user ${UT3_TESTER_HELPER} cascade; drop user ${UT3_USER} cascade; begin diff --git a/development/install.sh b/development/install.sh index 4104e2672..86d7e4da2 100755 --- a/development/install.sh +++ b/development/install.sh @@ -3,7 +3,7 @@ #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" -. development/env.sh +#. development/env.sh header="******************************************************************************************" if ! development/cleanup.sh; then diff --git a/development/template.env.sh b/development/template.env.sh index 94004c89d..b19f63ec7 100755 --- a/development/template.env.sh +++ b/development/template.env.sh @@ -16,4 +16,5 @@ export UT3_TESTER_PASSWORD=ut3 export UT3_TABLESPACE=users export UT3_USER="UT3\$USER#" export UT3_USER_PASSWORD=ut3 - +export UT3_TESTER_HELPER=ut3_tester_helper +export UT3_TESTER_HELPER_PASSWORD=ut3 diff --git a/test/install_ut3_tester_helper.sql b/test/install_ut3_tester_helper.sql new file mode 100644 index 000000000..0eabb98c9 --- /dev/null +++ b/test/install_ut3_tester_helper.sql @@ -0,0 +1,42 @@ +set define off +whenever sqlerror exit failure rollback +whenever oserror exit failure rollback + +alter session set plsql_optimize_level=0; +--Install ut3_tester_helper +@@ut3_tester_helper/core.pks + +@@ut3_tester_helper/core.pkb + + +grant execute on ut3_tester_helper.core to UT3$USER#; + +set linesize 200 +set define on +set verify off +column text format a100 +column error_count noprint new_value error_count + +prompt Validating installation + +set heading on +select type, name, sequence, line, position, text, count(1) over() error_count + from all_errors + where owner = USER + and name not like 'BIN$%' --not recycled + and name != 'UT_WITH_INVALID_BODY' + -- errors only. ignore warnings + and attribute = 'ERROR' + order by name, type, sequence +/ + +begin + if to_number('&&error_count') > 0 then + raise_application_error(-20000, 'Not all sources were successfully installed.'); + else + dbms_output.put_line('Installation completed successfully'); + end if; +end; +/ + +exit; diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql new file mode 100644 index 000000000..4890d002a --- /dev/null +++ b/test/install_ut3_user_tests.sql @@ -0,0 +1,39 @@ +set define off +whenever sqlerror exit failure rollback +whenever oserror exit failure rollback + +alter session set plsql_optimize_level=0; + +prompt Install user tests +@@ut3_user/expectations/test_matchers.pks +@@ut3_user/expectations/test_matchers.pkb + +set linesize 200 +set define on +set verify off +column text format a100 +column error_count noprint new_value error_count + +prompt Validating installation + +set heading on +select type, name, sequence, line, position, text, count(1) over() error_count + from all_errors + where owner = USER + and name not like 'BIN$%' --not recycled + and name != 'UT_WITH_INVALID_BODY' + -- errors only. ignore warnings + and attribute = 'ERROR' + order by name, type, sequence +/ + +begin + if to_number('&&error_count') > 0 then + raise_application_error(-20000, 'Not all sources were successfully installed.'); + else + dbms_output.put_line('Installation completed successfully'); + end if; +end; +/ + +exit; diff --git a/test/core.pkb b/test/ut3_tester_helper/core.pkb similarity index 70% rename from test/core.pkb rename to test/ut3_tester_helper/core.pkb index 60baa0190..9b70f3826 100644 --- a/test/core.pkb +++ b/test/ut3_tester_helper/core.pkb @@ -88,5 +88,38 @@ create or replace package body core is return l_glob_val; end; + function get_failed_expectations return ut3.ut_varchar2_list is + l_expectations_result ut3.ut_expectation_results := ut3.ut_expectation_processor.get_failed_expectations(); + l_result ut3.ut_varchar2_list; + begin + for i in 1..l_expectations_result.count loop + l_result := l_result multiset union l_expectations_result(i).get_result_lines(); + end loop; + return l_result; + end; + + function failed_expectations_data return anydata is + begin + return anydata.convertCollection(ut3.ut_expectation_processor.get_failed_expectations()); + end; + + function get_failed_expectations_n return number is + l_num_failed number; + l_results ut3.ut_expectation_results := ut3.ut_expectation_processor.get_failed_expectations(); + begin + l_num_failed := l_results.count; + return l_num_failed; + end; + + procedure clear_expectations is + begin + ut3.ut_expectation_processor.clear_expectations(); + end; + + function table_to_clob(a_results in ut3.ut_varchar2_list) return clob is + begin + return ut3.ut_utils.table_to_clob(a_results); + end; + end; / diff --git a/test/core.pks b/test/ut3_tester_helper/core.pks similarity index 52% rename from test/core.pks rename to test/ut3_tester_helper/core.pks index d23ab6be0..a722a9871 100644 --- a/test/core.pks +++ b/test/ut3_tester_helper/core.pks @@ -1,5 +1,8 @@ create or replace package core is + gc_success number := ut3.ut_utils.gc_success; + gc_failure number := ut3.ut_utils.gc_failure; + --%suite --%suitepath(utplsql) @@ -16,6 +19,14 @@ create or replace package core is function get_value(a_variable varchar2) return integer; function get_dbms_output_as_clob return clob; + + function get_failed_expectations return ut3.ut_varchar2_list; + + function get_failed_expectations_n return number; + + procedure clear_expectations; + + function table_to_clob(a_results in ut3.ut_varchar2_list) return clob; end; / diff --git a/test/ut3_user/expectations/test_matchers.pkb b/test/ut3_user/expectations/test_matchers.pkb new file mode 100644 index 000000000..114e34267 --- /dev/null +++ b/test/ut3_user/expectations/test_matchers.pkb @@ -0,0 +1,271 @@ +create or replace package body test_matchers is + + procedure cleanup_expectations is + begin + ut3_tester_helper.core.clear_expectations( ); + end; + + procedure exec_matcher(a_type varchar2, a_actual_value varchar2, a_expected_value varchar2, a_matcher varchar2, a_result integer, a_prefix varchar2 := null) is + l_statement varchar2(32767); + begin + l_statement := ' + declare + l_actual '||a_type||' := '||a_actual_value||'; + l_expected '||a_type||' := '||a_expected_value||'; + begin + ut3.ut.expect( l_actual ).'||a_prefix||'to_'||a_matcher||'( l_expected ); + end;'; + execute immediate l_statement; + if a_result = ut3_tester_helper.core.gc_success then + ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_equal(0); + else + ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_be_greater_than(0); + end if; + cleanup_expectations(); + end exec_matcher; + + procedure exec_be_between(a_type varchar2, a_actual_value varchar2, a_expected1_value varchar2, a_expected2_value varchar2,a_result integer) is + l_statement varchar2(32767); + begin + l_statement := ' + declare + l_actual_value '||a_type||' := '||a_actual_value||'; + l_lower '||a_type||' := '||a_expected1_value||'; + l_higher '||a_type||' := '||a_expected2_value||'; + begin + ut3.ut.expect(l_actual_value).to_be_between(l_lower, l_higher); + end;'; + execute immediate l_statement; + if a_result = ut3_tester_helper.core.gc_success then + ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_equal(0); + else + ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_be_greater_than(0); + end if; + cleanup_expectations(); + end exec_be_between; + + procedure exec_be_between2(a_type varchar2, a_actual_value varchar2, a_expected1_value varchar2, a_expected2_value varchar2,a_result integer, a_not_prefix varchar2 default null) is + l_statement varchar2(32767); + begin + l_statement := ' + declare + l_actual_value '||a_type||' := '||a_actual_value||'; + l_value1 '||a_type||' := '||a_expected1_value||'; + l_value2 '||a_type||' := '||a_expected2_value||'; + begin + ut3.ut.expect(l_actual_value).'||a_not_prefix||'to_be_between(l_value1, l_value2); + end;'; + execute immediate l_statement; + if a_result = ut3_tester_helper.core.gc_success then + ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_equal(0); + else + ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_be_greater_than(0); + end if; + cleanup_expectations(); + end exec_be_between2; + + procedure exec_be_like(a_type varchar2, a_value varchar2, a_pattern varchar2, a_escape varchar2, a_result integer, a_prefix varchar2 default null) is + begin + execute immediate + 'declare + l_actual ' || a_type || ' := '||a_value||'; + l_pattern varchar2(32767) := :pattern; + l_escape_char varchar2(32767) := :a_escape; + l_result integer; + begin + ut3.ut.expect( l_actual ).' || a_prefix ||q'[to_be_like(l_pattern, l_escape_char); + end;]' + using a_pattern, a_escape; + if a_result = ut3_tester_helper.core.gc_success then + ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_equal(0); + else + ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_be_greater_than(0); + end if; + cleanup_expectations(); + end; + + procedure exec_match(a_type varchar2, a_actual_value varchar2, a_pattern varchar2, a_modifiers varchar2, a_result integer, a_not_prefix varchar2 default null) is + l_statement varchar2(32767); + begin + l_statement := + 'declare + l_actual '||a_type||' := '||a_actual_value||'; + l_pattern varchar2(32767) := :a_pattern; + l_modifiers varchar2(32767) := :a_modifiers; + l_result integer; + begin + ut3.ut.expect( l_actual ).'||a_not_prefix||'to_match(l_pattern, l_modifiers); + end;'; + execute immediate l_statement using a_pattern, a_modifiers; + if a_result = ut3_tester_helper.core.gc_success then + ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_equal(0); + else + ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_be_greater_than(0); + end if; + cleanup_expectations(); + end; + + procedure test_be_between2 is + begin + + --failure when value out of range + exec_be_between2('date', 'sysdate', 'sysdate-2', 'sysdate-1', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('number', '2.0', '1.99', '1.999', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('varchar2(1)', '''c''', '''a''', '''b''', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('timestamp', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('timestamp with time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('interval year to month', '''2-2''', '''2-0''', '''2-1''', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 00:59:59''', ut3_tester_helper.core.gc_failure, ''); + + --success when value in range + exec_be_between2('date', 'sysdate', 'sysdate-1', 'sysdate+1', ut3_tester_helper.core.gc_success, ''); + exec_be_between2('number', '2.0', '1.99', '2.01', ut3_tester_helper.core.gc_success, ''); + exec_be_between2('varchar2(1)', '''b''', '''a''', '''c''', ut3_tester_helper.core.gc_success, ''); + exec_be_between2('timestamp', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_success, ''); + exec_be_between2('timestamp with local time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_success, ''); + exec_be_between2('timestamp with time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_success, ''); + exec_be_between2('interval year to month', '''2-1''', '''2-0''', '''2-2''', ut3_tester_helper.core.gc_success, ''); + exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 01:00:01''', ut3_tester_helper.core.gc_success, ''); + + --success when value not in range + exec_be_between2('date', 'sysdate', 'sysdate-2', 'sysdate-1', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_between2('number', '2.0', '1.99', '1.999', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_between2('varchar2(1)', '''c''', '''a''', '''b''', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_between2('timestamp', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_between2('timestamp with time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_between2('interval year to month', '''2-2''', '''2-0''', '''2-1''', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 00:59:59''', ut3_tester_helper.core.gc_success, 'not_'); + + --failure when value not out of range + exec_be_between2('date', 'sysdate', 'sysdate-1', 'sysdate+1', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('number', '2.0', '1.99', '2.01', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('varchar2(1)', '''b''', '''a''', '''c''', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('timestamp', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('timestamp with local time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('timestamp with time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('interval year to month', '''2-1''', '''2-0''', '''2-2''', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 01:00:01''', ut3_tester_helper.core.gc_failure, 'not_'); + + --failure when value is null + exec_be_between2('date', 'null', 'sysdate-1', 'sysdate+1', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('number', 'null', '1.99', '2.01', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('varchar2(1)', 'null', '''a''', '''c''', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('timestamp', 'null', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('timestamp with local time zone', 'null', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('timestamp with time zone', 'null', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('interval year to month', 'null', '''2-0''', '''2-2''', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('interval day to second', 'null', '''2 00:59:58''', '''2 01:00:01''', ut3_tester_helper.core.gc_failure, ''); + + exec_be_between2('date', 'null', 'sysdate-2', 'sysdate-1', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('number', 'null', '1.99', '1.999', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('varchar2(1)', 'null', '''a''', '''b''', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('timestamp', 'null', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('timestamp with local time zone', 'null', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('timestamp with time zone', 'null', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('interval year to month', 'null', '''2-0''', '''2-1''', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('interval day to second', 'null', '''2 00:59:58''', '''2 00:59:59''', ut3_tester_helper.core.gc_failure, 'not_'); + + --failure when lower bound is null + exec_be_between2('date', 'sysdate', 'null', 'sysdate+1', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('number', '2.0', 'null', '2.01', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('varchar2(1)', '''b''', 'null', '''c''', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('timestamp', 'systimestamp', 'null', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('timestamp with local time zone', 'systimestamp', 'null', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('timestamp with time zone', 'systimestamp', 'null', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('interval year to month', '''2-1''', 'null', '''2-2''', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('interval day to second', '''2 01:00:00''', 'null', '''2 01:00:01''', ut3_tester_helper.core.gc_failure, ''); + + exec_be_between2('date', 'sysdate', 'null', 'sysdate-1', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('number', '2.0', 'null', '1.999', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('varchar2(1)', '''b''', 'null', '''b''', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('timestamp', 'systimestamp+1', 'null', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'null', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('timestamp with time zone', 'systimestamp+1', 'null', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('interval year to month', '''2-2''', 'null', '''2-1''', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('interval day to second', '''2 01:00:00''', 'null', '''2 00:59:59''', ut3_tester_helper.core.gc_failure, 'not_'); + --Fails for unsupported data-type + exec_be_between2('clob', '''b''', '''a''', '''c''', ut3_tester_helper.core.gc_failure, ''); + end; + + procedure test_match is + begin + exec_match('varchar2(100)', '''Stephen''', '^Ste(v|ph)en$', '', ut3_tester_helper.core.gc_success); + exec_match('varchar2(100)', '''sTEPHEN''', '^Ste(v|ph)en$', 'i', ut3_tester_helper.core.gc_success); + exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', 'Ste(v|ph)en$', '', ut3_tester_helper.core.gc_success); + exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', 'Ste(v|ph)en$', 'i', ut3_tester_helper.core.gc_success); + + exec_match('varchar2(100)', '''Stephen''', '^Steven$', '', ut3_tester_helper.core.gc_failure); + exec_match('varchar2(100)', '''sTEPHEN''', '^Steven$', 'i', ut3_tester_helper.core.gc_failure); + exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', '^Stephen', '', ut3_tester_helper.core.gc_failure); + exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', '^Stephen', 'i', ut3_tester_helper.core.gc_failure); + + exec_match('varchar2(100)', '''Stephen''', '^Ste(v|ph)en$', '', ut3_tester_helper.core.gc_failure, 'not_'); + exec_match('varchar2(100)', '''sTEPHEN''', '^Ste(v|ph)en$', 'i', ut3_tester_helper.core.gc_failure, 'not_'); + exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', 'Ste(v|ph)en$', '', ut3_tester_helper.core.gc_failure, 'not_'); + exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', 'Ste(v|ph)en$', 'i', ut3_tester_helper.core.gc_failure, 'not_'); + + exec_match('varchar2(100)', '''Stephen''', '^Steven$', '', ut3_tester_helper.core.gc_success, 'not_'); + exec_match('varchar2(100)', '''sTEPHEN''', '^Steven$', 'i', ut3_tester_helper.core.gc_success, 'not_'); + exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', '^Stephen', '', ut3_tester_helper.core.gc_success, 'not_'); + exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', '^Stephen', 'i', ut3_tester_helper.core.gc_success, 'not_'); + --Fails for unsupported data-type + exec_match('number', '12345', '^123.*', 'i', ut3_tester_helper.core.gc_failure); + end; + + procedure test_be_like is + begin + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en%', '', ut3_tester_helper.core.gc_success); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en\_K%', '\', ut3_tester_helper.core.gc_success); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en%', '', ut3_tester_helper.core.gc_success); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en\_K%', '\', ut3_tester_helper.core.gc_success); + + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste_en%', '', ut3_tester_helper.core.gc_failure); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Stephe\__%', '\', ut3_tester_helper.core.gc_failure); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste_en%', '', ut3_tester_helper.core.gc_failure); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Stephe\__%', '\', ut3_tester_helper.core.gc_failure); + + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en%', '', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en\_K%', '\', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en%', '', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en\_K%', '\', ut3_tester_helper.core.gc_failure, 'not_'); + + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste_en%', '', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Stephe\__%', '\', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste_en%', '', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Stephe\__%', '\', ut3_tester_helper.core.gc_success, 'not_'); + + --Fails for unsupported data-type + exec_be_like('number', '12345', '123%', '', ut3_tester_helper.core.gc_failure); + end; + + procedure test_timestamp_between is + l_value timestamp := to_timestamp('1997-01-31 09:26:50.13','YYYY-MM-DD HH24.MI.SS.FF'); + l_value_lower timestamp := to_timestamp('1997-01-31 09:26:50.11','YYYY-MM-DD HH24.MI.SS.FF'); + l_value_upper timestamp := to_timestamp('1997-01-31 09:26:50.14','YYYY-MM-DD HH24.MI.SS.FF'); + begin + ut3.ut.expect(l_value).to_be_between(l_value_lower, l_value_upper); + ut3.ut.expect(l_value).not_to_be_between(l_value_upper, l_value_lower); + end; + + procedure test_timestamp_ltz_between is + l_value timestamp with local time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +02:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); + l_value_lower timestamp with local time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +03:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); + l_value_upper timestamp with local time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +01:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); + begin + ut3.ut.expect(l_value).to_be_between(l_value_lower, l_value_upper); + ut3.ut.expect(l_value).not_to_be_between(l_value_upper, l_value_lower); + end; + + procedure test_timestamp_tz_between is + l_value timestamp with time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +02:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); + l_value_lower timestamp with time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +03:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); + l_value_upper timestamp with time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +01:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); + begin + ut3.ut.expect(l_value).to_be_between(l_value_lower, l_value_upper); + ut3.ut.expect(l_value).not_to_be_between(l_value_upper, l_value_lower); + end; + +end test_matchers; +/ diff --git a/test/ut3_user/expectations/test_matchers.pks b/test/ut3_user/expectations/test_matchers.pks new file mode 100644 index 000000000..b8fc699ee --- /dev/null +++ b/test/ut3_user/expectations/test_matchers.pks @@ -0,0 +1,27 @@ +create or replace package test_matchers is + + --%suite(matchers) + --%suitepath(utplsql.core.expectations) + + --%aftereach + procedure cleanup_expectations; + + --%test + procedure test_be_between2; + --%test + procedure test_match; + + --%test + procedure test_be_like; + + --%test + procedure test_timestamp_between; + + --%test + procedure test_timestamp_ltz_between; + + --%test + procedure test_timestamp_tz_between; + +end test_matchers; +/ From 03cd30d03dd57a01b9ee7de75479ed66031e8b89 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 24 Mar 2019 12:39:56 +0000 Subject: [PATCH 006/181] Updated `install.md` --- docs/userguide/install.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 5e432e894..856147eb6 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -9,7 +9,7 @@ To download latest version of utPLSQL from github on both Unix/Linux as well as ```bash #!/bin/bash # Get the url to latest release "zip" file -UTPLSQL_DOWNLOAD_URL=$(curl --silent https://api.github.com/repos/utPLSQL/utPLSQL/releases/latest | awk '/browser_download_url/ { print $2 }' | grep ".zip" | sed 's/"//g') +UTPLSQL_DOWNLOAD_URL=$(curl --silent https://api.github.com/repos/utPLSQL/utPLSQL/releases/latest | awk '/browser_download_url/ { print $2 }' | grep ".zip\"" | sed 's/"//g') # Download the latest release "zip" file curl -Lk "${UTPLSQL_DOWNLOAD_URL}" -o utPLSQL.zip # Extract downloaded "zip" file @@ -19,7 +19,7 @@ unzip -q utPLSQL.zip You may download with a one-liner if that is more convenient. ```bash #!/bin/bash -curl -LOk $(curl --silent https://api.github.com/repos/utPLSQL/utPLSQL/releases/latest | awk '/browser_download_url/ { print $2 }' | grep ".zip" | sed 's/"//g') +curl -LOk $(curl --silent https://api.github.com/repos/utPLSQL/utPLSQL/releases/latest | awk '/browser_download_url/ { print $2 }' | grep ".zip\"" | sed 's/"//g') ``` ## Windows From 405bb7ce5c3459fe46d8d485222fafcb65bc1089 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 24 Mar 2019 12:48:42 +0000 Subject: [PATCH 007/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index c7e47af14..16e036afa 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 3c63c6178..5666e0a7e 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 4e72a7176..1bd2a7b6d 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 5deeab762..4428c63c4 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 0ed40c660..c93add857 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 0d1d34157..ac7734471 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 0b1c2b75e..862c84ac6 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index fc64798f4..32eb5d424 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 94d920114..1ddf12826 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 4493a89fa..3f207a7fd 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 853690426..a56bbac2b 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index f80a8ef70..e9c989dd9 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 5e432e894..6c2cfba87 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index d24d2ba1d..0f3bc2842 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 44f754cf6..902dd718b 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 8e8876485..9b4a64558 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 43a4c3a4a..3edd05d88 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2727--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.6.2728--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 0b757f0b2..6ea493401 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.6.2727-develop'; + gc_version constant varchar2(50) := 'v3.1.6.2728-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 9db8f4b513fe1e9f5cc82c1fcb3763585d9d6bef Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sat, 23 Mar 2019 20:24:01 +0000 Subject: [PATCH 008/181] Separating tests. --- test/api/test_ut_run.pkb | 1016 ----------- test/api/test_ut_run.pks | 148 -- .../test_annot_throws_exception.pkb | 375 ----- .../test_annot_throws_exception.pks | 76 - .../annotations/test_annotation_manager.pkb | 306 ---- .../annotations/test_annotation_manager.pks | 55 - .../annotations/test_annotation_parser.pkb | 461 ----- .../annotations/test_annotation_parser.pks | 42 - test/core/expectations.pkb | 67 - test/core/expectations.pks | 29 - .../binary/test_be_greater_or_equal.pkb | 263 --- .../binary/test_be_greater_or_equal.pks | 97 -- .../binary/test_be_greater_than.pkb | 263 --- .../binary/test_be_greater_than.pks | 97 -- .../binary/test_be_less_or_equal.pkb | 263 --- .../binary/test_be_less_or_equal.pks | 97 -- test/core/expectations/binary/test_equal.pkb | 264 --- test/core/expectations/binary/test_equal.pks | 38 - .../binary/test_expect_to_be_less_than.pkb | 263 --- .../binary/test_expect_to_be_less_than.pks | 97 -- .../expectations/test_expectation_anydata.pkb | 974 ----------- .../expectations/test_expectation_anydata.pks | 202 --- .../test_expectation_processor.pkb | 71 - .../test_expectation_processor.pks | 17 - test/core/expectations/test_matchers.pkb | 270 --- test/core/expectations/test_matchers.pks | 27 - .../unary/test_expect_not_to_be_null.pkb | 265 --- .../unary/test_expect_not_to_be_null.pks | 97 -- .../unary/test_expect_to_be_empty.pkb | 271 --- .../unary/test_expect_to_be_empty.pks | 93 - .../unary/test_expect_to_be_not_null.pkb | 264 --- .../unary/test_expect_to_be_not_null.pks | 97 -- .../unary/test_expect_to_be_null.pkb | 260 --- .../unary/test_expect_to_be_null.pks | 97 -- .../unary/test_expect_to_be_true_false.pkb | 139 -- .../unary/test_expect_to_be_true_false.pks | 58 - .../unary/test_expect_to_have_count.pkb | 210 --- .../unary/test_expect_to_have_count.pks | 61 - .../min_grant_user/test_min_grant_user.pkb | 71 - .../min_grant_user/test_min_grant_user.pks | 25 - test/core/reporters.pkb | 150 -- test/core/reporters.pks | 18 - test/core/reporters/test_coverage.pkb | 262 --- test/core/reporters/test_coverage.pks | 40 - .../test_cov_cobertura_reporter.pkb | 45 - .../test_cov_cobertura_reporter.pks | 10 - .../test_coverage_sonar_reporter.pkb | 39 - .../test_coverage_sonar_reporter.pks | 13 - .../test_coverage/test_coveralls_reporter.pkb | 85 - .../test_coverage/test_coveralls_reporter.pks | 13 - .../test_html_extended_reporter.pkb | 29 - .../test_html_extended_reporter.pks | 10 - .../test_html_proftab_reporter.pkb | 29 - .../test_html_proftab_reporter.pks | 10 - test/core/reporters/test_debug_reporter.pkb | 45 - test/core/reporters/test_debug_reporter.pks | 16 - .../reporters/test_documentation_reporter.pkb | 1 - .../reporters/test_documentation_reporter.pks | 10 - .../core/reporters/test_extended_coverage.pkb | 188 --- .../core/reporters/test_extended_coverage.pks | 22 - test/core/reporters/test_junit_reporter.pkb | 353 ---- test/core/reporters/test_junit_reporter.pks | 51 - .../core/reporters/test_realtime_reporter.pkb | 401 ----- .../core/reporters/test_realtime_reporter.pks | 55 - .../reporters/test_sonar_test_reporter.pkb | 36 - .../reporters/test_sonar_test_reporter.pks | 13 - .../core/reporters/test_teamcity_reporter.pkb | 131 -- .../core/reporters/test_teamcity_reporter.pks | 22 - .../reporters/test_tfs_junit_reporter.pkb | 207 --- .../reporters/test_tfs_junit_reporter.pks | 39 - test/core/test_file_mapper.pkb | 45 - test/core/test_file_mapper.pks | 13 - test/core/test_output_buffer.pkb | 95 -- test/core/test_output_buffer.pks | 19 - test/core/test_suite_builder.pkb | 1118 ------------ test/core/test_suite_builder.pks | 176 -- test/core/test_suite_manager.pkb | 1497 ----------------- test/core/test_suite_manager.pks | 175 -- test/core/test_ut_executable.pkb | 109 -- test/core/test_ut_executable.pks | 33 - test/core/test_ut_suite.pkb | 159 -- test/core/test_ut_suite.pks | 40 - test/core/test_ut_test.pkb | 697 -------- test/core/test_ut_test.pks | 94 -- test/core/test_ut_utils.pkb | 436 ----- test/core/test_ut_utils.pks | 132 -- test/helpers/other_dummy_object.tps | 16 - test/helpers/test_dummy_object_list.tps | 4 - test/helpers/test_event_list.tps | 2 - test/helpers/test_event_object.tps | 15 - test/helpers/test_tab_varchar2.tps | 12 - test/helpers/test_tab_varray.tps | 13 - test/helpers/ut3user#.test_cursor_grants.pkb | 114 -- test/helpers/ut3user#.test_cursor_grants.pks | 30 - test/helpers/ut_example_tests.pkb | 24 - test/helpers/ut_example_tests.pks | 8 - test/helpers/ut_test_table.sql | 11 - test/helpers/ut_with_invalid_body.pkb | 4 - test/helpers/ut_with_invalid_body.pks | 4 - test/helpers/ut_without_body.pks | 4 - test/install_and_run_tests.sh | 8 +- test/install_ut3_tester_helper.sql | 15 +- test/install_ut3_tester_tests.sql | 41 + test/install_ut3_user_tests.sql | 11 + .../test_before_after_annotations.pkb | 2 +- .../test_before_after_annotations.pks | 0 .../core}/core.pkb | 0 .../core}/core.pks | 2 +- test/ut3_tester_helper/main_helper.pkb | 90 + test/ut3_tester_helper/main_helper.pks | 27 + test/ut3_tester_helper/run_helper.pkb | 91 + test/ut3_tester_helper/run_helper.pks | 9 + .../test_dummy_object.tps | 0 test/{ => ut3_user}/api/test_ut_runner.pkb | 134 +- test/{ => ut3_user}/api/test_ut_runner.pks | 0 .../expectations/test_expectations_cursor.pkb | 348 ++-- .../expectations/test_expectations_cursor.pks | 7 +- test/ut3_user/expectations/test_matchers.pkb | 230 +-- 118 files changed, 651 insertions(+), 15692 deletions(-) delete mode 100644 test/api/test_ut_run.pkb delete mode 100644 test/api/test_ut_run.pks delete mode 100644 test/core/annotations/test_annot_throws_exception.pkb delete mode 100644 test/core/annotations/test_annot_throws_exception.pks delete mode 100644 test/core/annotations/test_annotation_manager.pkb delete mode 100644 test/core/annotations/test_annotation_manager.pks delete mode 100644 test/core/annotations/test_annotation_parser.pkb delete mode 100644 test/core/annotations/test_annotation_parser.pks delete mode 100644 test/core/expectations.pkb delete mode 100644 test/core/expectations.pks delete mode 100644 test/core/expectations/binary/test_be_greater_or_equal.pkb delete mode 100644 test/core/expectations/binary/test_be_greater_or_equal.pks delete mode 100644 test/core/expectations/binary/test_be_greater_than.pkb delete mode 100644 test/core/expectations/binary/test_be_greater_than.pks delete mode 100644 test/core/expectations/binary/test_be_less_or_equal.pkb delete mode 100644 test/core/expectations/binary/test_be_less_or_equal.pks delete mode 100644 test/core/expectations/binary/test_equal.pkb delete mode 100644 test/core/expectations/binary/test_equal.pks delete mode 100644 test/core/expectations/binary/test_expect_to_be_less_than.pkb delete mode 100644 test/core/expectations/binary/test_expect_to_be_less_than.pks delete mode 100644 test/core/expectations/test_expectation_anydata.pkb delete mode 100644 test/core/expectations/test_expectation_anydata.pks delete mode 100644 test/core/expectations/test_expectation_processor.pkb delete mode 100644 test/core/expectations/test_expectation_processor.pks delete mode 100644 test/core/expectations/test_matchers.pkb delete mode 100644 test/core/expectations/test_matchers.pks delete mode 100644 test/core/expectations/unary/test_expect_not_to_be_null.pkb delete mode 100644 test/core/expectations/unary/test_expect_not_to_be_null.pks delete mode 100644 test/core/expectations/unary/test_expect_to_be_empty.pkb delete mode 100644 test/core/expectations/unary/test_expect_to_be_empty.pks delete mode 100644 test/core/expectations/unary/test_expect_to_be_not_null.pkb delete mode 100644 test/core/expectations/unary/test_expect_to_be_not_null.pks delete mode 100644 test/core/expectations/unary/test_expect_to_be_null.pkb delete mode 100644 test/core/expectations/unary/test_expect_to_be_null.pks delete mode 100644 test/core/expectations/unary/test_expect_to_be_true_false.pkb delete mode 100644 test/core/expectations/unary/test_expect_to_be_true_false.pks delete mode 100644 test/core/expectations/unary/test_expect_to_have_count.pkb delete mode 100644 test/core/expectations/unary/test_expect_to_have_count.pks delete mode 100644 test/core/min_grant_user/test_min_grant_user.pkb delete mode 100644 test/core/min_grant_user/test_min_grant_user.pks delete mode 100644 test/core/reporters.pkb delete mode 100644 test/core/reporters.pks delete mode 100644 test/core/reporters/test_coverage.pkb delete mode 100644 test/core/reporters/test_coverage.pks delete mode 100644 test/core/reporters/test_coverage/test_cov_cobertura_reporter.pkb delete mode 100644 test/core/reporters/test_coverage/test_cov_cobertura_reporter.pks delete mode 100644 test/core/reporters/test_coverage/test_coverage_sonar_reporter.pkb delete mode 100644 test/core/reporters/test_coverage/test_coverage_sonar_reporter.pks delete mode 100644 test/core/reporters/test_coverage/test_coveralls_reporter.pkb delete mode 100644 test/core/reporters/test_coverage/test_coveralls_reporter.pks delete mode 100644 test/core/reporters/test_coverage/test_html_extended_reporter.pkb delete mode 100644 test/core/reporters/test_coverage/test_html_extended_reporter.pks delete mode 100644 test/core/reporters/test_coverage/test_html_proftab_reporter.pkb delete mode 100644 test/core/reporters/test_coverage/test_html_proftab_reporter.pks delete mode 100644 test/core/reporters/test_debug_reporter.pkb delete mode 100644 test/core/reporters/test_debug_reporter.pks delete mode 100644 test/core/reporters/test_documentation_reporter.pkb delete mode 100644 test/core/reporters/test_documentation_reporter.pks delete mode 100644 test/core/reporters/test_extended_coverage.pkb delete mode 100644 test/core/reporters/test_extended_coverage.pks delete mode 100644 test/core/reporters/test_junit_reporter.pkb delete mode 100644 test/core/reporters/test_junit_reporter.pks delete mode 100644 test/core/reporters/test_realtime_reporter.pkb delete mode 100644 test/core/reporters/test_realtime_reporter.pks delete mode 100644 test/core/reporters/test_sonar_test_reporter.pkb delete mode 100644 test/core/reporters/test_sonar_test_reporter.pks delete mode 100644 test/core/reporters/test_teamcity_reporter.pkb delete mode 100644 test/core/reporters/test_teamcity_reporter.pks delete mode 100644 test/core/reporters/test_tfs_junit_reporter.pkb delete mode 100644 test/core/reporters/test_tfs_junit_reporter.pks delete mode 100644 test/core/test_file_mapper.pkb delete mode 100644 test/core/test_file_mapper.pks delete mode 100644 test/core/test_output_buffer.pkb delete mode 100644 test/core/test_output_buffer.pks delete mode 100644 test/core/test_suite_builder.pkb delete mode 100644 test/core/test_suite_builder.pks delete mode 100644 test/core/test_suite_manager.pkb delete mode 100644 test/core/test_suite_manager.pks delete mode 100644 test/core/test_ut_executable.pkb delete mode 100644 test/core/test_ut_executable.pks delete mode 100644 test/core/test_ut_suite.pkb delete mode 100644 test/core/test_ut_suite.pks delete mode 100644 test/core/test_ut_test.pkb delete mode 100644 test/core/test_ut_test.pks delete mode 100644 test/core/test_ut_utils.pkb delete mode 100644 test/core/test_ut_utils.pks delete mode 100644 test/helpers/other_dummy_object.tps delete mode 100644 test/helpers/test_dummy_object_list.tps delete mode 100644 test/helpers/test_event_list.tps delete mode 100644 test/helpers/test_event_object.tps delete mode 100644 test/helpers/test_tab_varchar2.tps delete mode 100644 test/helpers/test_tab_varray.tps delete mode 100644 test/helpers/ut3user#.test_cursor_grants.pkb delete mode 100644 test/helpers/ut3user#.test_cursor_grants.pks delete mode 100644 test/helpers/ut_example_tests.pkb delete mode 100644 test/helpers/ut_example_tests.pks delete mode 100644 test/helpers/ut_test_table.sql delete mode 100644 test/helpers/ut_with_invalid_body.pkb delete mode 100644 test/helpers/ut_with_invalid_body.pks delete mode 100644 test/helpers/ut_without_body.pks create mode 100644 test/install_ut3_tester_tests.sql rename test/{ => ut3_tester}/core/annotations/test_before_after_annotations.pkb (99%) rename test/{ => ut3_tester}/core/annotations/test_before_after_annotations.pks (100%) rename test/{ut3_tester_helper => ut3_tester/core}/core.pkb (100%) rename test/{ut3_tester_helper => ut3_tester/core}/core.pks (94%) create mode 100644 test/ut3_tester_helper/main_helper.pkb create mode 100644 test/ut3_tester_helper/main_helper.pks create mode 100644 test/ut3_tester_helper/run_helper.pkb create mode 100644 test/ut3_tester_helper/run_helper.pks rename test/{helpers => ut3_tester_helper}/test_dummy_object.tps (100%) rename test/{ => ut3_user}/api/test_ut_runner.pkb (75%) rename test/{ => ut3_user}/api/test_ut_runner.pks (100%) rename test/{core => ut3_user}/expectations/test_expectations_cursor.pkb (84%) rename test/{core => ut3_user}/expectations/test_expectations_cursor.pks (98%) diff --git a/test/api/test_ut_run.pkb b/test/api/test_ut_run.pkb deleted file mode 100644 index 9e9fce0f7..000000000 --- a/test/api/test_ut_run.pkb +++ /dev/null @@ -1,1016 +0,0 @@ -create or replace package body test_ut_run is - - --%test(ut.version() returns version of the framework) - procedure ut_version is - begin - ut.expect(ut3.ut.version()).to_match('^v\d+\.\d+\.\d+\.\d+(-\w+)?$'); - end; - - --%test(ut.fail() marks test as failed) - procedure ut_fail is - begin - --Act - ut3.ut.fail('Testing failure message'); - --Assert - ut.expect( - xmltype(anydata.convertCollection(ut3.ut_expectation_processor.get_failed_expectations())).getClobVal() - ).to_be_like('%2%Testing failure message%'); - --Cleanup - ut3.ut_expectation_processor.clear_expectations(); - end; - - procedure create_ut3$user#_tests is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package ut3$user#.test_package_1 is - --%suite - --%suitepath(tests) - - --%test(Test1 from test package 1) - procedure test1; - - --%test(Test2 from test package 1) - procedure test2; - - procedure run(a_reporter ut3.ut_reporter_base := null); - procedure run(a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base); - procedure run(a_path varchar2, a_reporter ut3.ut_reporter_base := null); - procedure run(a_path varchar2, a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base); - procedure run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null); - procedure run(a_paths ut3.ut_varchar2_list, a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base); - function run(a_reporter ut3.ut_reporter_base := null) return ut3.ut_varchar2_list; - function run(a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) return ut3.ut_varchar2_list; - function run(a_path varchar2, a_reporter ut3.ut_reporter_base := null) return ut3.ut_varchar2_list; - function run(a_path varchar2, a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) return ut3.ut_varchar2_list; - function run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null) return ut3.ut_varchar2_list; - function run(a_paths ut3.ut_varchar2_list, a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) return ut3.ut_varchar2_list; - - end test_package_1; - ]'; - execute immediate q'[create or replace package body ut3$user#.test_package_1 is - procedure test1 is - begin - dbms_output.put_line('test_package_1.test1 executed'); - end; - procedure test2 is - begin - dbms_output.put_line('test_package_1.test2 executed'); - end; - - procedure run(a_reporter ut3.ut_reporter_base := null) is - begin - ut3.ut.run(a_reporter); - end; - procedure run(a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) is - begin - ut3.ut.run( - a_reporter, a_source_files => ut3.ut_varchar2_list(), - a_test_files => a_test_files - ); - end; - procedure run(a_path varchar2, a_reporter ut3.ut_reporter_base := null) is - begin - ut3.ut.run(a_path, a_reporter); - end; - procedure run(a_path varchar2, a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) is - begin - ut3.ut.run( - a_path, - a_reporter, a_source_files => ut3.ut_varchar2_list(), - a_test_files => a_test_files - ); - end; - procedure run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null) is - begin - ut3.ut.run(a_paths, a_reporter); - end; - procedure run(a_paths ut3.ut_varchar2_list, a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) is - begin - ut3.ut.run( - a_paths, - a_reporter, a_source_files => ut3.ut_varchar2_list(), - a_test_files => a_test_files - ); - end; - - function run(a_reporter ut3.ut_reporter_base := null) return ut3.ut_varchar2_list is - l_results ut3.ut_varchar2_list; - begin - select * bulk collect into l_results from table (ut3.ut.run(a_reporter)); - return l_results; - end; - function run(a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) return ut3.ut_varchar2_list is - l_results ut3.ut_varchar2_list; - begin - select * bulk collect into l_results from table ( - ut3.ut.run( - a_reporter, a_source_files => ut3.ut_varchar2_list(), - a_test_files => a_test_files - )); - return l_results; - end; - function run(a_path varchar2, a_reporter ut3.ut_reporter_base := null) return ut3.ut_varchar2_list is - l_results ut3.ut_varchar2_list; - begin - select * bulk collect into l_results from table (ut3.ut.run(a_path, a_reporter)); - return l_results; - end; - function run(a_path varchar2, a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) return ut3.ut_varchar2_list is - l_results ut3.ut_varchar2_list; - begin - select * bulk collect into l_results from table ( - ut3.ut.run( - a_path, - a_reporter, a_source_files => ut3.ut_varchar2_list(), - a_test_files => a_test_files - )); - return l_results; - end; - function run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null) return ut3.ut_varchar2_list is - l_results ut3.ut_varchar2_list; - begin - select * bulk collect into l_results from table (ut3.ut.run(a_paths, a_reporter)); - return l_results; - end; - function run(a_paths ut3.ut_varchar2_list, a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) return ut3.ut_varchar2_list is - l_results ut3.ut_varchar2_list; - begin - select * bulk collect into l_results from table ( - ut3.ut.run( - a_paths, - a_reporter, a_source_files => ut3.ut_varchar2_list(), - a_test_files => a_test_files - )); - return l_results; - end; - end test_package_1; - ]'; - - execute immediate q'[create or replace package ut3$user#.test_package_2 is - --%suite - --%suitepath(tests.test_package_1) - - --%test - procedure test1; - - --%test - procedure test2; - - end test_package_2; - ]'; - execute immediate q'[create or replace package body ut3$user#.test_package_2 is - procedure test1 is - begin - dbms_output.put_line('test_package_2.test1 executed'); - end; - procedure test2 is - begin - dbms_output.put_line('test_package_2.test2 executed'); - end; - end test_package_2; - ]'; - - execute immediate q'[create or replace package ut3$user#.test_package_3 is - --%suite - --%suitepath(tests2) - - --%test - procedure test1; - - --%test - procedure test2; - - end test_package_3; - ]'; - execute immediate q'[create or replace package body ut3$user#.test_package_3 is - procedure test1 is - begin - dbms_output.put_line('test_package_3.test1 executed'); - end; - procedure test2 is - begin - dbms_output.put_line('test_package_3.test2 executed'); - end; - end test_package_3; - ]'; - end; - - procedure drop_ut3$user#_tests is - pragma autonomous_transaction; - begin - execute immediate q'[drop package ut3$user#.test_package_1]'; - execute immediate q'[drop package ut3$user#.test_package_2]'; - execute immediate q'[drop package ut3$user#.test_package_3]'; - end; - - procedure run_proc_no_params is - l_results clob; - begin - execute immediate 'begin ut3$user#.test_package_1.run(); end;'; - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); - end; - - procedure run_proc_specific_reporter is - l_results clob; - begin - --Act - execute immediate 'begin ut3$user#.test_package_1.run(:a_reporter); end;' - using in ut3.ut_documentation_reporter(); - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); - end; - - procedure run_proc_cov_file_list is - l_results clob; - begin - --Act - execute immediate 'begin ut3$user#.test_package_1.run(a_test_files=>:a_test_files, a_reporter=>:a_reporter); end;' - using - in ut3.ut_varchar2_list('tests/ut3$user#.test_package_1.pkb','tests/ut3$user#.test_package_2.pkb','tests/ut3$user#.test_package_3.pkb'), - in ut3.ut_sonar_test_reporter(); - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%tests/ut3$user#.test_package_2.pkb%tests/ut3$user#.test_package_1.pkb%tests/ut3$user#.test_package_3.pkb%' ); - end; - - procedure run_proc_pkg_name is - l_results clob; - begin - execute immediate 'begin ut3$user#.test_package_1.run(:a_path); end;' - using in 'test_package_1'; - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%test_package_1%' ); - ut.expect( l_results ).not_to_be_like( '%test_package_2%' ); - ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); - end; - - procedure run_proc_pkg_name_file_list is - l_results clob; - begin - execute immediate 'begin ut3$user#.test_package_1.run(:a_path, :a_test_files, :a_reporter); end;' - using - in 'test_package_3', - in ut3.ut_varchar2_list('tests/ut3$user#.test_package_1.pkb','tests/ut3$user#.test_package_2.pkb','tests/ut3$user#.test_package_3.pkb'), - in ut3.ut_sonar_test_reporter(); - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%tests/ut3$user#.test_package_3.pkb%' ); - ut.expect( l_results ).not_to_be_like( '%tests/ut3$user#.test_package_1.pkb%' ); - ut.expect( l_results ).not_to_be_like( '%tests/ut3$user#.test_package_2.pkb%' ); - end; - - procedure run_proc_path_list is - l_results clob; - begin - execute immediate 'begin ut3$user#.test_package_1.run(:a_paths); end;' - using in ut3.ut_varchar2_list(':tests.test_package_1',':tests'); - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%test_package_1%' ); - ut.expect( l_results ).to_be_like( '%test_package_2%' ); - ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); - end; - - procedure run_proc_path_list_file_list is - l_results clob; - begin - execute immediate 'begin ut3$user#.test_package_1.run(:a_paths, :a_test_files, :a_reporter); end;' - using - in ut3.ut_varchar2_list(':tests.test_package_1',':tests'), - in ut3.ut_varchar2_list('tests/ut3$user#.test_package_1.pkb','tests/ut3$user#.test_package_2.pkb','tests/ut3$user#.test_package_3.pkb'), - in ut3.ut_sonar_test_reporter(); - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%tests/ut3$user#.test_package_1.pkb%' ); - ut.expect( l_results ).to_be_like( '%tests/ut3$user#.test_package_2.pkb%' ); - ut.expect( l_results ).not_to_be_like( '%tests/ut3$user#.test_package_3.pkb%' ); - end; - - procedure run_proc_null_reporter is - l_results clob; - begin - --Act - execute immediate 'begin ut3$user#.test_package_1.run(:a_reporter); end;' - using in cast(null as ut3.ut_reporter_base); - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%tests%test_package_1%test_package_2%tests2%test_package_3%' ); - end; - - procedure run_proc_null_path is - l_results clob; - begin - --Act - execute immediate 'begin ut3$user#.test_package_1.run(:a_path); end;' - using in cast(null as varchar2); - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); - end; - - procedure run_proc_null_path_list is - l_results clob; - l_paths ut3.ut_varchar2_list; - begin - --Act - execute immediate 'begin ut3$user#.test_package_1.run(:a_paths); end;' - using in l_paths; - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); - end; - - procedure run_proc_empty_path_list is - l_results clob; - begin - --Act - execute immediate 'begin ut3$user#.test_package_1.run(:a_paths); end;' - using in ut3.ut_varchar2_list(); - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); - end; - - procedure create_suite_with_commit is - pragma autonomous_transaction; - begin - execute immediate 'create or replace package test_commit_warning is - --%suite - --%suitepath(ut.run.transaction) - - --%test - procedure does_commit; - end;'; - execute immediate 'create or replace package body test_commit_warning is - procedure does_commit is - begin - ut3.ut.expect(1).to_equal(1); - commit; - end; - end;'; - end; - - procedure drop_suite_with_commit is - pragma autonomous_transaction; - begin - execute immediate 'drop package test_commit_warning'; - end; - - procedure run_proc_warn_on_commit is - l_results clob; - begin - ut3.ut.run('test_commit_warning'); - l_results := core.get_dbms_output_as_clob(); - ut.expect(l_results).to_be_like( - '%Unable to perform automatic rollback after test%'|| - 'An implicit or explicit commit/rollback occurred in procedures:%' || - 'does_commit%' || - 'Use the "--%rollback(manual)" annotation or remove commit/rollback/ddl statements that are causing the issue.%' - ); - end; - - procedure create_failing_beforeall_suite is - pragma autonomous_transaction; - begin - execute immediate 'create or replace package parent_suite is - --%suite - --%suitepath(ut.run.failing_setup) - - --%beforeall - procedure failing_setup; - end;'; - execute immediate 'create or replace package body parent_suite is - procedure failing_setup is - begin - raise no_data_found; - end; - end;'; - execute immediate 'create or replace package child_suite is - --%suite - --%suitepath(ut.run.failing_setup.parent_suite.some_sub_suite) - - --%test - procedure does_stuff; - end;'; - execute immediate 'create or replace package body child_suite is - procedure does_stuff is - begin - ut3.ut.expect(1).to_equal(1); - end; - end;'; - end; - - procedure drop_failing_beforeall_suite is - pragma autonomous_transaction; - begin - execute immediate 'drop package parent_suite'; - execute immediate 'drop package child_suite'; - end; - - procedure run_proc_fail_child_suites is - l_results clob; - begin - ut3.ut.run('child_suite'); - l_results := core.get_dbms_output_as_clob(); - ut.expect(l_results).to_be_like( - '%1) does_stuff%' || - 'ORA-01403: no data found%' || - 'ORA-06512: at "UT3_TESTER.PARENT_SUITE%' - ); - end; - - procedure transaction_setup is - pragma autonomous_transaction; - begin - execute immediate 'create table transaction_test_table(message varchar2(100))'; - execute immediate 'create or replace package test_transaction is - --%suite - - --%test - procedure insert_row; - - --%test - procedure insert_and_raise; - end; - '; - execute immediate 'create or replace package body test_transaction is - procedure insert_row is - begin - insert into transaction_test_table values (''2 - inside the test_transaction.insert_row test''); - end; - procedure insert_and_raise is - begin - insert into transaction_test_table values (''2 - inside the test_transaction.insert_row test''); - raise no_data_found; - end; - end; - '; - - end; - - procedure transaction_cleanup is - pragma autonomous_transaction; - begin - begin - execute immediate 'drop table transaction_test_table'; - exception - when others then null; - end; - begin - execute immediate 'drop package test_transaction'; - exception - when others then null; - end; - end; - - procedure run_proc_keep_test_data is - l_expected sys_refcursor; - l_actual sys_refcursor; - l_results clob; - begin - --Arrange - execute immediate ' - insert into transaction_test_table values (''1 - inside the test_ut_run.run_proc_keep_test_changes test'')'; - - --Act - ut3.ut.run('test_transaction.insert_row', a_force_manual_rollback => true); - l_results := core.get_dbms_output_as_clob(); - - --Assert - open l_expected for - select '1 - inside the test_ut_run.run_proc_keep_test_changes test' as message from dual - union all - select '2 - inside the test_transaction.insert_row test' from dual - order by 1; - - open l_actual for 'select * from transaction_test_table order by 1'; - - ut.expect( l_actual ).to_equal(l_expected); - end; - - procedure run_proc_keep_test_data_raise is - l_expected sys_refcursor; - l_actual sys_refcursor; - l_results clob; - begin - --Arrange - execute immediate ' - insert into transaction_test_table values (''1 - inside the test_ut_run.run_proc_keep_test_changes test'')'; - - --Act - ut3.ut.run('test_transaction.insert_and_raise', a_force_manual_rollback => true); - l_results := core.get_dbms_output_as_clob(); - - --Assert - open l_expected for - select '1 - inside the test_ut_run.run_proc_keep_test_changes test' as message from dual - union all - select '2 - inside the test_transaction.insert_row test' from dual - order by 1; - - open l_actual for 'select * from transaction_test_table order by 1'; - - ut.expect( l_actual ).to_equal(l_expected); - end; - - procedure run_proc_discard_test_data is - l_expected sys_refcursor; - l_actual sys_refcursor; - l_results clob; - begin - --Arrange - execute immediate ' - insert into transaction_test_table values (''1 - inside the test_ut_run.run_proc_keep_test_changes test'')'; - - --Act - ut3.ut.run('test_transaction.insert_row'); - l_results := core.get_dbms_output_as_clob(); - - --Assert - open l_expected for - select '1 - inside the test_ut_run.run_proc_keep_test_changes test' as message from dual; - - open l_actual for 'select * from transaction_test_table order by 1'; - - ut.expect( l_actual ).to_equal(l_expected); - end; - - procedure run_func_no_params is - l_results ut3.ut_varchar2_list; - begin - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(); end;' using out l_results; - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); - end; - - procedure run_func_specific_reporter is - l_results ut3.ut_varchar2_list; - begin - --Act - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(:a_reporter); end;' - using out l_results, in ut3.ut_documentation_reporter(); - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); - end; - - procedure run_func_cov_file_list is - l_results ut3.ut_varchar2_list; - begin - --Act - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(a_test_files=>:a_test_files, a_reporter=>:a_reporter); end;' - using out l_results, - in ut3.ut_varchar2_list('tests/ut3$user#.test_package_1.pkb','tests/ut3$user#.test_package_2.pkb','tests/ut3$user#.test_package_3.pkb'), - in ut3.ut_sonar_test_reporter(); - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%tests/ut3$user#.test_package_2.pkb%tests/ut3$user#.test_package_1.pkb%tests/ut3$user#.test_package_3.pkb%' ); - end; - - procedure run_func_pkg_name is - l_results ut3.ut_varchar2_list; - begin - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(:a_path); end;' - using out l_results, in 'test_package_1'; - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%test_package_1%' ); - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).not_to_be_like( '%test_package_2%' ); - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).not_to_be_like( '%test_package_3%' ); - end; - - procedure run_func_pkg_name_file_list is - l_results ut3.ut_varchar2_list; - begin - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(:a_path, :a_test_files, :a_reporter); end;' - using out l_results, - in 'test_package_3', - in ut3.ut_varchar2_list('tests/ut3$user#.test_package_1.pkb','tests/ut3$user#.test_package_2.pkb','tests/ut3$user#.test_package_3.pkb'), - in ut3.ut_sonar_test_reporter(); - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%tests/ut3$user#.test_package_3.pkb%' ); - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).not_to_be_like( '%tests/ut3$user#.test_package_1.pkb%' ); - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).not_to_be_like( '%tests/ut3$user#.test_package_2.pkb%' ); - end; - - procedure run_func_path_list is - l_results ut3.ut_varchar2_list; - begin - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(:a_paths); end;' - using out l_results, in ut3.ut_varchar2_list(':tests.test_package_1',':tests'); - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%test_package_1%' ); - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%test_package_2%' ); - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).not_to_be_like( '%test_package_3%' ); - end; - - procedure run_func_path_list_file_list is - l_results ut3.ut_varchar2_list; - begin - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(:a_paths, :a_test_files, :a_reporter); end;' - using out l_results, - in ut3.ut_varchar2_list(':tests.test_package_1',':tests'), - in ut3.ut_varchar2_list('tests/ut3$user#.test_package_1.pkb','tests/ut3$user#.test_package_2.pkb','tests/ut3$user#.test_package_3.pkb'), - in ut3.ut_sonar_test_reporter(); - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%tests/ut3$user#.test_package_1.pkb%' ); - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%tests/ut3$user#.test_package_2.pkb%' ); - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).not_to_be_like( '%tests/ut3$user#.test_package_3.pkb%' ); - end; - - procedure run_func_null_reporter is - l_results ut3.ut_varchar2_list; - begin - --Act - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(:a_reporter); end;' - using out l_results, in cast(null as ut3.ut_reporter_base); - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%tests%test_package_1%test_package_2%tests2%test_package_3%' ); - end; - - procedure run_func_null_path is - l_results ut3.ut_varchar2_list; - begin - --Act - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(:a_path); end;' - using out l_results, in cast(null as varchar2); - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); - end; - - procedure run_func_null_path_list is - l_results ut3.ut_varchar2_list; - l_paths ut3.ut_varchar2_list; - begin - --Act - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(:a_paths); end;' - using out l_results, in l_paths; - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); - end; - - procedure run_func_empty_path_list is - l_results ut3.ut_varchar2_list; - begin - --Act - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(:a_paths); end;' - using out l_results, in ut3.ut_varchar2_list(); - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); - end; - - procedure run_func_cov_file_lst_null_rep is - l_results ut3.ut_varchar2_list; - begin - --Act - execute immediate 'begin :l_results := ut3$user#.test_package_1.run(a_test_files=>:a_test_files, a_reporter=>:a_reporter); end;' - using out l_results, - in ut3.ut_varchar2_list('tests/ut3$user#.test_package_1.pkb','tests/ut3$user#.test_package_2.pkb','tests/ut3$user#.test_package_3.pkb'), - in cast(null as ut3.ut_reporter_base); - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); - end; - - procedure run_func_empty_suite is - l_results ut3.ut_varchar2_list; - l_expected varchar2(32767); - pragma autonomous_transaction; - begin - --Arrange - execute immediate q'[create or replace package empty_suite as - -- %suite - - procedure not_a_test; - end;]'; - execute immediate q'[create or replace package body empty_suite as - procedure not_a_test is begin null; end; - end;]'; - l_expected := '%empty_suite%0 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'; - --Act - select * bulk collect into l_results from table(ut3.ut.run('empty_suite')); - - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( l_expected ); - - --Cleanup - execute immediate q'[drop package empty_suite]'; - end; - - procedure create_db_link is - l_service_name varchar2(100); - pragma autonomous_transaction; - begin - select global_name into l_service_name from global_name; - execute immediate - 'create public database link db_loopback connect to ut3_tester identified by ut3 - using ''(DESCRIPTION= - (ADDRESS=(PROTOCOL=TCP) - (HOST='||sys_context('userenv','SERVER_HOST')||') - (PORT=1521) - ) - (CONNECT_DATA=(SERVICE_NAME='||l_service_name||')))'''; - end; - - procedure drop_db_link is - begin - execute immediate 'drop public database link db_loopback'; - exception - when others then - null; - end; - - procedure create_test_suite is - pragma autonomous_transaction; - begin - create_db_link; - execute immediate q'[ - create or replace package stateful_package as - function get_state return varchar2; - end; - ]'; - execute immediate q'[ - create or replace package body stateful_package as - g_state varchar2(1) := 'A'; - function get_state return varchar2 is begin return g_state; end; - end; - ]'; - execute immediate q'[ - create or replace package test_stateful as - --%suite - --%suitepath(test_state) - - --%test - --%beforetest(acquire_state_via_db_link,rebuild_stateful_package) - procedure failing_stateful_test; - - procedure rebuild_stateful_package; - procedure acquire_state_via_db_link; - - end; - ]'; - execute immediate q'{ - create or replace package body test_stateful as - - procedure failing_stateful_test is - begin - ut3.ut.expect(stateful_package.get_state@db_loopback).to_equal('abc'); - end; - - procedure rebuild_stateful_package is - pragma autonomous_transaction; - begin - execute immediate q'[ - create or replace package body stateful_package as - g_state varchar2(3) := 'abc'; - function get_state return varchar2 is begin return g_state; end; - end; - ]'; - end; - - procedure acquire_state_via_db_link is - begin - dbms_output.put_line('stateful_package.get_state@db_loopback='||stateful_package.get_state@db_loopback); - end; - end; - }'; - - end; - - procedure raise_in_invalid_state is - l_results ut3.ut_varchar2_list; - l_expected varchar2(32767); - begin - --Arrange - l_expected := 'test_state - test_stateful - failing_stateful_test [% sec] (FAILED - 1)% -Failures:% - 1) failing_stateful_test - ORA-04068: existing state of packages (DB_LOOPBACK%) has been discarded - ORA-04061: existing state of package body "UT3_TESTER.STATEFUL_PACKAGE" has been invalidated - ORA-04065: not executed, altered or dropped package body "UT3_TESTER.STATEFUL_PACKAGE"% - ORA-06512: at line 6% -1 tests, 0 failed, 1 errored, 0 disabled, 0 warning(s)%'; - - --Act - select * bulk collect into l_results from table(ut3.ut.run('test_stateful')); - - --Assert - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( l_expected ); - ut.fail('Expected exception but nothing was raised'); - exception - when others then - ut.expect( ut3.ut_utils.table_to_clob(l_results) ).to_be_like( l_expected ); - ut.expect(sqlcode).to_equal(-4068); - end; - - procedure drop_test_suite is - pragma autonomous_transaction; - begin - drop_db_link; - execute immediate 'drop package stateful_package'; - execute immediate 'drop package test_stateful'; - end; - - procedure run_in_invalid_state is - l_results ut3.ut_varchar2_list; - l_actual clob; - l_expected varchar2(32767); - begin - select * bulk collect into l_results from table(ut3.ut.run('failing_invalid_spec')); - - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like('%Call params for % are not valid: package does not exist or is invalid: %FAILING_INVALID_SPEC%'); - - end; - - procedure compile_invalid_package is - ex_compilation_error exception; - pragma exception_init(ex_compilation_error,-24344); - pragma autonomous_transaction; - begin - begin - execute immediate q'[ - create or replace package failing_invalid_spec as - --%suite - gv_glob_val non_existing_table.id%type := 0; - - --%test - procedure test1; - end;]'; - exception when ex_compilation_error then null; - end; - begin - execute immediate q'[ - create or replace package body failing_invalid_spec as - procedure test1 is begin ut.expect(1).to_equal(1); end; - end;]'; - exception when ex_compilation_error then null; - end; - end; - procedure drop_invalid_package is - pragma autonomous_transaction; - begin - execute immediate 'drop package failing_invalid_spec'; - end; - - procedure run_and_revalidate_specs is - l_results ut3.ut_varchar2_list; - l_actual clob; - l_is_invalid number; - begin - execute immediate q'[select count(1) from all_objects o where o.owner = :object_owner and o.object_type = 'PACKAGE' - and o.status = 'INVALID' and o.object_name= :object_name]' into l_is_invalid - using user,'INVALID_PCKAG_THAT_REVALIDATES'; - - select * bulk collect into l_results from table(ut3.ut.run('invalid_pckag_that_revalidates')); - - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(1).to_equal(l_is_invalid); - ut.expect(l_actual).to_be_like('%invalid_pckag_that_revalidates%invalidspecs [% sec]% -%Finished in % seconds% -%1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'); - - end; - - procedure generate_invalid_spec is - ex_compilation_error exception; - pragma exception_init(ex_compilation_error,-24344); - pragma autonomous_transaction; - begin - - execute immediate q'[ - create or replace package parent_specs as - c_test constant varchar2(1) := 'Y'; - end;]'; - - execute immediate q'[ - create or replace package invalid_pckag_that_revalidates as - --%suite - g_var varchar2(1) := parent_specs.c_test; - - --%test(invalidspecs) - procedure test1; - end;]'; - - execute immediate q'[ - create or replace package body invalid_pckag_that_revalidates as - procedure test1 is begin ut.expect('Y').to_equal(g_var); end; - end;]'; - - -- That should invalidate test package and we can then revers - execute immediate q'[ - create or replace package parent_specs as - c_test_error constant varchar2(1) := 'Y'; - end;]'; - - execute immediate q'[ - create or replace package parent_specs as - c_test constant varchar2(1) := 'Y'; - end;]'; - - end; - procedure drop_invalid_spec is - pragma autonomous_transaction; - begin - execute immediate 'drop package invalid_pckag_that_revalidates'; - execute immediate 'drop package parent_specs'; - end; - - procedure run_and_report_warnings is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - - select * bulk collect into l_results from table(ut3.ut.run('bad_annotations')); - l_actual := ut3.ut_utils.table_to_clob(l_results); - - ut.expect(l_actual).to_be_like('%Invalid annotation "--%context". Cannot find following "--%endcontext". Annotation ignored.% -%1 tests, 0 failed, 0 errored, 0 disabled, 1 warning(s)%'); - - end; - - procedure create_bad_annot is - pragma autonomous_transaction; - begin - execute immediate q'[ - create or replace package bad_annotations as - --%suite - - --%context - - --%test(invalidspecs) - procedure test1; - - end;]'; - - execute immediate q'[ - create or replace package body bad_annotations as - procedure test1 is begin ut.expect(1).to_equal(1); end; - end;]'; - - end; - - procedure drop_bad_annot is - pragma autonomous_transaction; - begin - execute immediate 'drop package bad_annotations'; - end; - - procedure savepoints_on_db_links is - l_results clob; - begin - ut3.ut.run('test_distributed_savepoint'); - l_results := core.get_dbms_output_as_clob(); - ut.expect(l_results).to_be_like('%1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'); - end; - - procedure create_suite_with_link is - pragma autonomous_transaction; - begin - create_db_link; - execute immediate 'create table tst(id number(18,0))'; - execute immediate q'[ - create or replace package test_distributed_savepoint is - --%suite - --%suitepath(alltests) - - --%beforeall - procedure setup; - - --%test - procedure test; - end;]'; - - execute immediate q'[ - create or replace package body test_distributed_savepoint is - - g_expected constant integer := 1; - - procedure setup is - begin - insert into tst@db_loopback values(g_expected); - end; - - procedure test is - l_actual integer := 0; - begin - select id into l_actual from tst@db_loopback; - - ut.expect(l_actual).to_equal(g_expected); - end; - - end;]'; - end; - - procedure drop_suite_with_link is - pragma autonomous_transaction; - begin - drop_db_link; - execute immediate 'drop table tst'; - execute immediate 'drop package test_distributed_savepoint'; - end; - -end; -/ diff --git a/test/api/test_ut_run.pks b/test/api/test_ut_run.pks deleted file mode 100644 index 55d19e866..000000000 --- a/test/api/test_ut_run.pks +++ /dev/null @@ -1,148 +0,0 @@ -create or replace package test_ut_run is - --%suite(ut.run) - --%suitepath(utplsql.api) - - - --%test(ut.version() returns version of the framework) - procedure ut_version; - - --%test(ut.fail() marks test as failed) - procedure ut_fail; - - procedure create_ut3$user#_tests; - procedure drop_ut3$user#_tests; - - --%context(ut_run_procedure) - --%displayname(ut.run() procedure options) - --%beforeall(create_ut3$user#_tests) - --%afterall(drop_ut3$user#_tests) - - --%test(Runs all tests in current schema with default reporter when no parameters given) - procedure run_proc_no_params; - --%test(Runs all tests in current schema with specified reporter) - procedure run_proc_specific_reporter; - --%test(Runs all tests in current schema with coverage file list) - procedure run_proc_cov_file_list; - - --%test(Runs given package only with package name given as path) - procedure run_proc_pkg_name; - --%test(Runs all from given package with package name given as path and coverage file list) - procedure run_proc_pkg_name_file_list; - --%test(Runs tests from given paths only with paths list) - procedure run_proc_path_list; - --%test(Runs tests from given paths only with paths list and coverage file list) - procedure run_proc_path_list_file_list; - --%test(Runs all tests in current schema using default reporter when null reporter given) - procedure run_proc_null_reporter; - --%test(Runs all tests in current schema with null path provided) - procedure run_proc_null_path; - --%test(Runs all tests in current schema with null path list given) - procedure run_proc_null_path_list; - --%test(Runs all tests in current schema with empty path list given) - procedure run_proc_empty_path_list; - - procedure create_suite_with_commit; - procedure drop_suite_with_commit; - --%test(Reports a warning if transaction was invalidated by test with automatic rollback) - --%beforetest(create_suite_with_commit) - --%aftertest(drop_suite_with_commit) - procedure run_proc_warn_on_commit; - - - procedure create_failing_beforeall_suite; - procedure drop_failing_beforeall_suite; - --%test(Marks child suite as failed when parent's suite beforeall fails) - --%beforetest(create_failing_beforeall_suite) - --%aftertest(drop_failing_beforeall_suite) - procedure run_proc_fail_child_suites; - - --%test(Savepoints are working properly on distributed transactions - Issue #839) - --%beforetest(create_suite_with_link) - --%aftertest(drop_suite_with_link) - procedure savepoints_on_db_links; - procedure create_suite_with_link; - procedure drop_suite_with_link; - - --%endcontext - - --%context(run_proc_transaction_control) - - --%beforeall - procedure transaction_setup; - --%afterall - procedure transaction_cleanup; - --%test(Leaves transaction open and uncommitted with a_force_manual_rollback) - procedure run_proc_keep_test_data; - --%test(Leaves transaction open and uncommitted with a_force_manual_rollback with exceptions) - procedure run_proc_keep_test_data_raise; - --%test(Does not impact current transaction when ran without a_force_manual_rollback) - procedure run_proc_discard_test_data; - - --%endcontext - - - --%context(ut_run_function) - --%displayname(ut.run() function options) - --%beforeall(create_ut3$user#_tests) - --%afterall(drop_ut3$user#_tests) - - --%test(Runs all tests in current schema with default reporter when no parameters given) - procedure run_func_no_params; - --%test(Runs all tests in current schema with specified reporter) - procedure run_func_specific_reporter; - --%test(Runs all tests in current schema with coverage file list) - procedure run_func_cov_file_list; - - --%test(Runs given package only with package name given as path) - procedure run_func_pkg_name; - --%test(Runs all from given package with package name given as path and coverage file list) - procedure run_func_pkg_name_file_list; - --%test(Runs tests from given paths with paths list) - procedure run_func_path_list; - --%test(Runs tests from given paths with paths list and coverage file list) - procedure run_func_path_list_file_list; - --%test(Runs all tests in current schema using default reporter when null reporter given) - procedure run_func_null_reporter; - --%test(Runs all tests in current schema with null path provided) - procedure run_func_null_path; - --%test(Runs all tests in current schema with null path list given) - procedure run_func_null_path_list; - --%test(Runs all tests in current schema with empty path list given) - procedure run_func_empty_path_list; - --%test(Runs all tests in current schema with coverage file list and default reporter) - procedure run_func_cov_file_lst_null_rep; - --%test(Executes successfully an empty suite) - procedure run_func_empty_suite; - - --disabled(Makes session wait for lock on 18.1 due to library cache pin wait) - --%test(ut.run - raises after completing all tests if a test fails with ORA-04068 or ORA-04061) - --%beforetest(create_test_suite) - --%aftertest(drop_test_suite) - procedure raise_in_invalid_state; - procedure create_test_suite; - procedure drop_test_suite; - - --%test(ut.run - Does not execute suite when specified package is not valid) - --%beforetest(compile_invalid_package) - --%aftertest(drop_invalid_package) - procedure run_in_invalid_state; - procedure compile_invalid_package; - procedure drop_invalid_package; - - --%test(Invalidate package specs via rebuild but still execute package) - --%beforetest(generate_invalid_spec) - --%aftertest(drop_invalid_spec) - procedure run_and_revalidate_specs; - procedure generate_invalid_spec; - procedure drop_invalid_spec; - - --%test(Provides warnings on invalid annotations) - --%beforetest(create_bad_annot) - --%aftertest(drop_bad_annot) - procedure run_and_report_warnings; - procedure create_bad_annot; - procedure drop_bad_annot; - --%endcontext - -end; -/ diff --git a/test/core/annotations/test_annot_throws_exception.pkb b/test/core/annotations/test_annot_throws_exception.pkb deleted file mode 100644 index 1ad4f19a5..000000000 --- a/test/core/annotations/test_annot_throws_exception.pkb +++ /dev/null @@ -1,375 +0,0 @@ -create or replace package body test_annot_throws_exception -is - g_tests_results clob; - - procedure recollect_tests_results is - pragma autonomous_transaction; - - l_package_spec varchar2(32737); - l_package_body varchar2(32737); - l_exception_spec varchar2(32737); - l_test_results ut3.ut_varchar2_list; - begin - l_exception_spec := q'[ - create or replace package exc_pkg is - c_e_single_exc constant number := -20200; - c_e_dummy constant varchar2(10) := 'dummy'; - c_e_varch_exc constant varchar2(10) := '-20201'; - c_e_list_1 number := -20202; - c_e_list_2 constant number := -20203; - c_e_diff_exc constant number := -20204; - c_e_mix_list constant number := -20205; - c_e_mix_missin constant number := -20206; - - e_some_exception exception; - pragma exception_init(e_some_exception, -20207); - - end;]'; - - l_package_spec := ' - create package annotated_package_with_throws is - --%suite(Dummy package to test annotation throws) - - --%test(Throws same annotated exception) - --%throws(-20145) - procedure raised_same_exception; - - --%test(Throws one of the listed exceptions) - --%throws(-20145,-20146, -20189 ,-20563) - procedure raised_one_listed_exception; - - --%test(Leading zero is ignored in exception list) - --%throws(-01476) - procedure leading_0_exception_no; - - --%test(Throws diff exception) - --%throws(-20144) - procedure raised_diff_exception; - - --%test(Throws empty) - --%throws() - procedure empty_throws; - - --%test(Ignores annotation and fails when exception was thrown) - --%throws(hello,784#,0-=234,,u1234) - procedure bad_paramters_with_except; - - --%test(Ignores annotation and succeeds when no exception thrown) - --%throws(hello,784#,0-=234,,u1234) - procedure bad_paramters_without_except; - - --%test(Detects a valid exception number within many invalid ones) - --%throws(7894562, operaqk, -=1, -1, pow74d, posdfk3) - procedure one_valid_exception_number; - - --%test(Gives failure when a exception is expected and nothing is thrown) - --%throws(-20459, -20136, -20145) - procedure nothing_thrown; - - --%test(Single exception defined as a constant number in package) - --%throws(exc_pkg.c_e_single_exc) - procedure single_exc_const_pkg; - - --%test(Gives success when one of annotated exception using constant is thrown) - --%throws(exc_pkg.c_e_list_1,exc_pkg.c_e_list_2) - procedure list_of_exc_constant; - - --%test(Gives failure when the raised exception is different that the annotated one using variable) - --%throws(exc_pkg.c_e_diff_exc) - procedure fail_not_match_exc; - - --%test(Success when one of exception from mixed list of number and constant is thrown) - --%throws(exc_pkg.c_e_mix_list,-20105) - procedure mixed_exc_list; - - --%test(Success when match exception even if other variable on list dont exists) - --%throws(exc_pkg.c_e_mix_missin,utter_rubbish) - procedure mixed_list_notexi; - - --%test(Success resolve and match named exception defined in pragma exception init) - --%throws(exc_pkg.e_some_exception) - procedure named_exc_pragma; - - --%test(Success resolve and match oracle named exception) - --%throws(NO_DATA_FOUND) - procedure named_exc_ora; - - --%test(Success resolve and match oracle named exception dup val index) - --%throws(DUP_VAL_ON_INDEX) - procedure named_exc_ora_dup_ind; - - --%test(Success map no data 100 to -1403) - --%throws(-1403) - procedure nodata_exc_ora; - - --%test(Success for exception defined as varchar) - --%throws(exc_pkg.c_e_varch_exc) - procedure defined_varchar_exc; - - --%test(Non existing constant exception) - --%throws(dummy.c_dummy); - procedure non_existing_const; - - --%test(Bad exception constant) - --%throws(exc_pkg.c_e_dummy); - procedure bad_exc_const; - - end; - '; - - l_package_body := ' - create package body annotated_package_with_throws is - procedure raised_same_exception is - begin - raise_application_error(-20145, ''Test error''); - end; - - procedure raised_one_listed_exception is - begin - raise_application_error(-20189, ''Test error''); - end; - - procedure leading_0_exception_no is - x integer; - begin - x := 1 / 0; - end; - - procedure raised_diff_exception is - begin - raise_application_error(-20143, ''Test error''); - end; - - procedure empty_throws is - begin - raise_application_error(-20143, ''Test error''); - end; - - procedure bad_paramters_with_except is - begin - raise_application_error(-20143, ''Test error''); - end; - - procedure bad_paramters_without_except is - begin - null; - end; - - procedure one_valid_exception_number is - begin - raise dup_val_on_index; - end; - - procedure nothing_thrown is - begin - null; - end; - - procedure single_exc_const_pkg is - begin - raise_application_error(exc_pkg.c_e_single_exc,''Test''); - end; - - procedure list_of_exc_constant is - begin - raise_application_error(exc_pkg.c_e_list_1,''Test''); - end; - - procedure fail_not_match_exc is - begin - raise NO_DATA_FOUND; - end; - - procedure mixed_exc_list is - begin - raise_application_error(exc_pkg.c_e_mix_list,''Test''); - end; - - procedure mixed_list_notexi is - begin - raise_application_error(exc_pkg.c_e_mix_missin,''Test''); - end; - - procedure named_exc_pragma is - begin - raise exc_pkg.e_some_exception; - end; - - procedure named_exc_ora is - begin - raise NO_DATA_FOUND; - end; - - procedure named_exc_ora_dup_ind is - begin - raise DUP_VAL_ON_INDEX; - end; - - procedure nodata_exc_ora is - begin - raise NO_DATA_FOUND; - end; - - procedure defined_varchar_exc is - begin - raise_application_error(exc_pkg.c_e_varch_exc,''Test''); - end; - - procedure non_existing_const is - begin - raise_application_error(-20143, ''Test error''); - end; - - procedure bad_exc_const is - begin - raise_application_error(-20143, ''Test error''); - end; - - end; - '; - - execute immediate l_exception_spec; - execute immediate l_package_spec; - execute immediate l_package_body; - - - select * bulk collect into l_test_results from table(ut3.ut.run(('annotated_package_with_throws'))); - - g_tests_results := ut3.ut_utils.table_to_clob(l_test_results); - end; - - procedure throws_same_annotated_except is - begin - ut.expect(g_tests_results).to_match('^\s*Throws same annotated exception \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('raised_same_exception'); - end; - - procedure throws_one_of_annotated_excpt is - begin - ut.expect(g_tests_results).to_match('^\s*Throws one of the listed exceptions \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('raised_one_listed_exception'); - end; - - procedure throws_with_leading_zero is - begin - ut.expect(g_tests_results).to_match('^\s*Leading zero is ignored in exception list \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('leading_0_exception_no'); - end; - - procedure throws_diff_annotated_except is - begin - ut.expect(g_tests_results).to_match('^\s*Throws diff exception \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); - ut.expect(g_tests_results).to_match('raised_diff_exception\s+Actual: -20143 was expected to equal: -20144\s+ORA-20143: Test error\s+ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); - end; - - procedure throws_empty is - begin - ut.expect(g_tests_results).to_match('^\s*Throws empty \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); - ut.expect(g_tests_results).to_match('empty_throws\s*ORA-20143: Test error\s*ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); - end; - - procedure bad_paramters_with_except is - begin - ut.expect(g_tests_results).to_match('^\s*Ignores annotation and fails when exception was thrown \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); - ut.expect(g_tests_results).to_match('bad_paramters_with_except\s*ORA-20143: Test error\s*ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); - end; - - procedure bad_paramters_without_except is - begin - ut.expect(g_tests_results).to_match('^\s*Ignores annotation and succeeds when no exception thrown \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('bad_paramters_without_except'); - end; - - procedure one_valid_exception_number is - begin - ut.expect(g_tests_results).to_match('^\s*Detects a valid exception number within many invalid ones \[[\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('one_valid_exception_number'); - end; - - procedure nothing_thrown is - begin - ut.expect(g_tests_results).to_match('^\s*Gives failure when a exception is expected and nothing is thrown \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); - ut.expect(g_tests_results).to_match('nothing_thrown\s*Expected one of exceptions \(-20459, -20136, -20145\) but nothing was raised.'); - end; - - procedure single_exc_const_pkg is - begin - ut.expect(g_tests_results).to_match('^\s*Single exception defined as a constant number in package \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('single_exc_const_pkg'); - end; - - procedure list_of_exc_constant is - begin - ut.expect(g_tests_results).to_match('^\s*Gives success when one of annotated exception using constant is thrown \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('list_of_exc_constant'); - end; - - procedure fail_not_match_exc is - begin - ut.expect(g_tests_results).to_match('^\s*Gives failure when the raised exception is different that the annotated one using variable \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); - ut.expect(g_tests_results).to_match('fail_not_match_exc\s+Actual: -1403 was expected to equal: -20204\s+ORA-01403: no data found\s+ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); - end; - - procedure mixed_exc_list is - begin - ut.expect(g_tests_results).to_match('^\s*Success when one of exception from mixed list of number and constant is thrown \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('mixed_exc_list'); - end; - - procedure mixed_list_notexi is - begin - ut.expect(g_tests_results).to_match('^\s*Success when match exception even if other variable on list dont exists \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('mixed_list_notexi'); - end; - - procedure named_exc_pragma is - begin - ut.expect(g_tests_results).to_match('^\s*Success resolve and match named exception defined in pragma exception init \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('mixed_list_notexi'); - end; - - procedure named_exc_ora is - begin - ut.expect(g_tests_results).to_match('^\s*Success resolve and match oracle named exception \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('named_exc_ora'); - end; - - procedure named_exc_ora_dup_ind is - begin - ut.expect(g_tests_results).to_match('^\s*Success resolve and match oracle named exception dup val index \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('named_exc_ora_dup_ind'); - end; - - procedure nodata_exc_ora is - begin - ut.expect(g_tests_results).to_match('^\s*Success map no data 100 to -1403 \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('nodata_exc_ora'); - end; - - procedure defined_varchar_exc is - begin - ut.expect(g_tests_results).to_match('^\s*Success for exception defined as varchar \[[,\.0-9]+ sec\]\s*$','m'); - ut.expect(g_tests_results).not_to_match('defined_varchar_exc'); - end; - - procedure non_existing_const is - begin - ut.expect(g_tests_results).to_match('^\s*Non existing constant exception \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); - ut.expect(g_tests_results).to_match('non_existing_const\s*ORA-20143: Test error\s*ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); - end; - - procedure bad_exc_const is - begin - ut.expect(g_tests_results).to_match('^\s*Bad exception constant \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); - ut.expect(g_tests_results).to_match('bad_exc_const\s*ORA-20143: Test error\s*ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); - end; - - procedure drop_test_package is - pragma autonomous_transaction; - begin - execute immediate 'drop package annotated_package_with_throws'; - execute immediate 'drop package exc_pkg'; - end; - -end; -/ diff --git a/test/core/annotations/test_annot_throws_exception.pks b/test/core/annotations/test_annot_throws_exception.pks deleted file mode 100644 index 54e814b55..000000000 --- a/test/core/annotations/test_annot_throws_exception.pks +++ /dev/null @@ -1,76 +0,0 @@ -create or replace package test_annot_throws_exception -is - --%suite(annotations - throws) - --%suitepath(utplsql.core.annotations) - - --%beforeall - procedure recollect_tests_results; - - --%test(Gives success when annotated number exception is thrown) - procedure throws_same_annotated_except; - - --%test(Gives success when one of the annotated number exceptions is thrown) - procedure throws_one_of_annotated_excpt; - - --%test(Gives success when annotated number exceptions has leading zero) - procedure throws_with_leading_zero; - - --%test(Gives failure when the raised exception is different that the annotated one) - procedure throws_diff_annotated_except; - - --%test(Ignores when the annotation throws is empty) - procedure throws_empty; - - --%test(Ignores when only bad parameters are passed, the test raise a exception and it shows errored test) - procedure bad_paramters_with_except; - - --%test(Ignores when only bad parameters are passed, the test does not raise a exception and it shows successful test) - procedure bad_paramters_without_except; - - --%test(Detects a valid exception number within many invalid ones) - procedure one_valid_exception_number; - - --%test(Gives failure when a exception is expected and nothing is thrown) - procedure nothing_thrown; - - --%test(Single exception defined as a constant number in package) - procedure single_exc_const_pkg; - - --%test(Gives success when one of annotated exception using constant is thrown) - procedure list_of_exc_constant; - - --%test(Gives failure when the raised exception is different that the annotated one using variable) - procedure fail_not_match_exc; - - --%test(Success when one of exception from mixed list of number and constant is thrown) - procedure mixed_exc_list; - - --%test(Success when match exception even if other variable on list dont exists) - procedure mixed_list_notexi; - - --%test(Success resolve and match named exception defined in pragma exception init) - procedure named_exc_pragma; - - --%test(Success resolve and match oracle named exception no data) - procedure named_exc_ora; - - --%test(Success resolve and match oracle named exception dup val index) - procedure named_exc_ora_dup_ind; - - --%test(Success map no data 100 to -1403) - procedure nodata_exc_ora; - - --%test(Success for exception defined as varchar) - procedure defined_varchar_exc; - - --%test(Non existing constant exception) - procedure non_existing_const; - - --%test(Bad exception constant) - procedure bad_exc_const; - - --%afterall - procedure drop_test_package; - -end; -/ diff --git a/test/core/annotations/test_annotation_manager.pkb b/test/core/annotations/test_annotation_manager.pkb deleted file mode 100644 index 804980a39..000000000 --- a/test/core/annotations/test_annotation_manager.pkb +++ /dev/null @@ -1,306 +0,0 @@ -create or replace package body test_annotation_manager is - - procedure create_dummy_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package dummy_package as - procedure some_dummy_procedure; - end;]'; - end; - - procedure drop_dummy_package is - pragma autonomous_transaction; - begin - execute immediate q'[drop package dummy_package]'; - end; - - procedure recompile_dummy_package is - pragma autonomous_transaction; - begin - execute immediate q'[alter package dummy_package compile]'; - end; - - procedure create_dummy_test_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package dummy_test_package as - --%suite(dummy_test_suite) - --%rollback(manual) - - --%test(dummy_test) - --%beforetest(some_procedure) - procedure some_dummy_test_procedure; - end;]'; - execute immediate q'[grant execute on dummy_test_package to public]'; - end; - - procedure modify_dummy_test_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package dummy_test_package as - --%suite(dummy_test_suite) - - --%test(dummy_test) - procedure some_dummy_test_procedure; - end;]'; - end; - - procedure drop_dummy_test_package is - pragma autonomous_transaction; - begin - execute immediate q'[drop package dummy_test_package]'; - end; - - procedure recompile_dummy_test_package is - pragma autonomous_transaction; - begin - execute immediate q'[alter package dummy_test_package compile]'; - end; - - procedure create_parse_proc_as_ut3$user# is - pragma autonomous_transaction; - begin - execute immediate q'[ - create or replace procedure ut3$user#.parse_annotations is - begin - ut3.ut_annotation_manager.rebuild_annotation_cache('UT3_TESTER','PACKAGE'); - end;]'; - end; - - procedure parse_dummy_test_as_ut3$user# is - pragma autonomous_transaction; - begin - execute immediate 'begin ut3$user#.parse_annotations; end;'; - end; - - procedure drop_parse_proc_as_ut3$user# is - pragma autonomous_transaction; - begin - execute immediate 'drop procedure ut3$user#.parse_annotations'; - end; - - procedure cleanup_annotation_cache is - pragma autonomous_transaction; - begin - delete from ut3.ut_annotation_cache_info - where object_owner = user and object_type = 'PACKAGE' and object_name in ('DUMMY_PACKAGE','DUMMY_TEST_PACKAGE'); - commit; - end; - - - procedure add_new_package is - l_actual_cache_id integer; - l_actual integer; - l_start_date date; - begin - --Act - l_start_date := sysdate; - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE'); - --Assert - select max(cache_id) - into l_actual_cache_id - from ut3.ut_annotation_cache_info - where object_owner = user and object_type = 'PACKAGE' and object_name = 'DUMMY_PACKAGE' - and parse_time >= l_start_date; - - ut.expect(l_actual_cache_id).to_be_not_null; - - select count(1) - into l_actual - from ut3.ut_annotation_cache - where cache_id = l_actual_cache_id; - - ut.expect(l_actual).to_equal(0); - - end; - - procedure update_modified_package is - l_actual_cache_id integer; - l_actual integer; - l_start_date date; - begin - --Arrange - l_start_date := sysdate; - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE'); - recompile_dummy_package(); - l_start_date := sysdate; - $if dbms_db_version.version >= 18 $then - dbms_session.sleep(1); - $else - dbms_lock.sleep(1); - $end - --Act - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE'); - --Assert - select max(cache_id) - into l_actual_cache_id - from ut3.ut_annotation_cache_info - where object_owner = user and object_type = 'PACKAGE' and object_name = 'DUMMY_PACKAGE' - and parse_time >= l_start_date; - - ut.expect(l_actual_cache_id).to_be_not_null; - - select count(1) - into l_actual - from ut3.ut_annotation_cache - where cache_id = l_actual_cache_id; - - ut.expect(l_actual).to_equal(0); - end; - - - procedure add_new_test_package is - l_actual_cache_id integer; - l_actual sys_refcursor; - l_expected sys_refcursor; - l_start_date date; - begin - --Arrange - l_start_date := sysdate; - --Act - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE'); - --Assert - select max(cache_id) - into l_actual_cache_id - from ut3.ut_annotation_cache_info - where object_owner = user and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE' - and parse_time >= l_start_date; - - ut.expect(l_actual_cache_id).to_be_not_null; - - open l_actual for - select annotation_position, annotation_name, annotation_text, subobject_name - from ut3.ut_annotation_cache where cache_id = l_actual_cache_id - order by annotation_position; - - open l_expected for - select 2 as annotation_position, 'suite' as annotation_name, - 'dummy_test_suite' as annotation_text, '' as subobject_name - from dual union all - select 3, 'rollback' , 'manual', '' as subobject_name - from dual union all - select 5, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name - from dual union all - select 6, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name - from dual; - - ut.expect(l_actual).to_equal(l_expected); - end; - - - procedure update_modified_test_package is - l_actual_cache_id integer; - l_actual sys_refcursor; - l_expected sys_refcursor; - l_start_date date; - begin - --Arrange - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE'); - l_start_date := sysdate; - modify_dummy_test_package(); - --Act - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE'); - --Assert - select max(cache_id) - into l_actual_cache_id - from ut3.ut_annotation_cache_info - where object_owner = user and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE' - and parse_time >= l_start_date; - - ut.expect(l_actual_cache_id).to_be_not_null; - - open l_actual for - select annotation_position, annotation_name, annotation_text, subobject_name - from ut3.ut_annotation_cache where cache_id = l_actual_cache_id - order by annotation_position; - - open l_expected for - select 2 as annotation_position, 'suite' as annotation_name, - 'dummy_test_suite' as annotation_text, to_char(null) as subobject_name - from dual union all - select 4, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name - from dual; - - ut.expect(l_actual).to_equal(l_expected); - end; - - - procedure keep_dropped_data_in_cache is - l_actual_cache_id integer; - l_actual sys_refcursor; - l_expected sys_refcursor; - l_start_date date; - begin - parse_dummy_test_as_ut3$user#(); - l_start_date := sysdate; - drop_dummy_test_package(); - --Act - parse_dummy_test_as_ut3$user#(); - --Assert - select max(cache_id) - into l_actual_cache_id - from ut3.ut_annotation_cache_info - where object_owner = user and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE' - and parse_time >= l_start_date; - - ut.expect(l_actual_cache_id).not_to_be_null(); - - open l_actual for - select annotation_position, annotation_name, annotation_text, subobject_name - from ut3.ut_annotation_cache where cache_id = l_actual_cache_id - order by annotation_position; - - open l_expected for - select 2 as annotation_position, 'suite' as annotation_name, - 'dummy_test_suite' as annotation_text, '' as subobject_name - from dual union all - select 3, 'rollback' , 'manual', '' as subobject_name - from dual union all - select 5, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name - from dual union all - select 6, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name - from dual; - - ut.expect(l_actual).to_equal(l_expected); - end; - - procedure no_data_for_dropped_object is - l_actual sys_refcursor; - begin - --Arrange - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE'); - drop_dummy_test_package(); - --Act - open l_actual for - select * from table(ut3.ut_annotation_manager.get_annotated_objects(user,'PACKAGE')) - where object_name = 'DUMMY_TEST_PACKAGE'; - --Assert - ut.expect(l_actual).to_be_empty(); - end; - - procedure cleanup_dropped_data_in_cache is - l_cache_count integer; - l_actual sys_refcursor; - l_expected sys_refcursor; - l_start_date date; - begin - --Arrange - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE'); - l_start_date := sysdate; - drop_dummy_test_package(); - --Act - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE'); - --Assert - select count(1) - into l_cache_count - from ut3.ut_annotation_cache_info - where object_owner = user - and object_type = 'PACKAGE' - and object_name = 'DUMMY_TEST_PACKAGE'; - - ut.expect(l_cache_count).to_equal(0); - - end; - -end test_annotation_manager; -/ diff --git a/test/core/annotations/test_annotation_manager.pks b/test/core/annotations/test_annotation_manager.pks deleted file mode 100644 index 0726c8256..000000000 --- a/test/core/annotations/test_annotation_manager.pks +++ /dev/null @@ -1,55 +0,0 @@ -create or replace package test_annotation_manager is - - --%suite(ut_annotation_manager) - --%suitepath(utplsql.core.annotations) - - --%aftereach - procedure cleanup_annotation_cache; - - procedure create_dummy_package; - - procedure drop_dummy_package; - - procedure create_dummy_test_package; - - procedure create_parse_proc_as_ut3$user#; - - procedure drop_parse_proc_as_ut3$user#; - - procedure drop_dummy_test_package; - - --%test(Adds new package to annotation cache info) - --%beforetest(create_dummy_package) - --%aftertest(drop_dummy_package) - procedure add_new_package; - - --%test(Updates annotation cache info for modified package) - --%beforetest(create_dummy_package) - --%aftertest(drop_dummy_package) - procedure update_modified_package; - - --%test(Adds annotations to cache for unit test package) - --%beforetest(create_dummy_test_package) - --%aftertest(drop_dummy_test_package) - procedure add_new_test_package; - - --%test(Updates annotations in cache for modified test package) - --%beforetest(create_dummy_test_package) - --%aftertest(drop_dummy_test_package) - procedure update_modified_test_package; - - --%test(Keeps annotations in cache when object was removed but user can't see whole schema) - --%beforetest(create_dummy_test_package,create_parse_proc_as_ut3$user#) - --%aftertest(drop_parse_proc_as_ut3$user#) - procedure keep_dropped_data_in_cache; - - --%test(Does not return data for dropped object) - --%beforetest(create_dummy_test_package) - procedure no_data_for_dropped_object; - - --%test(Remove object from cache when object dropped and user can see whole schema) - --%beforetest(create_dummy_test_package) - procedure cleanup_dropped_data_in_cache; - -end test_annotation_manager; -/ diff --git a/test/core/annotations/test_annotation_parser.pkb b/test/core/annotations/test_annotation_parser.pkb deleted file mode 100644 index 5345e3a50..000000000 --- a/test/core/annotations/test_annotation_parser.pkb +++ /dev/null @@ -1,461 +0,0 @@ -create or replace package body test_annotation_parser is - - procedure test_proc_comments is - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - - begin - l_source := 'PACKAGE test_tt AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - -- %ann1(Name of suite) - -- wrong line - -- %ann2(some_value) - procedure foo; - END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - - l_expected := ut3.ut_annotations( - ut3.ut_annotation(2,'suite',null, null), - ut3.ut_annotation(3,'displayname','Name of suite',null), - ut3.ut_annotation(4,'suitepath','all.globaltests',null), - ut3.ut_annotation(6,'ann1','Name of suite',null), - ut3.ut_annotation(8,'ann2','some_value','foo') - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - end; - - procedure include_floating_annotations is - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - begin - l_source := 'PACKAGE test_tt AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - -- %ann1(Name of suite) - -- %ann2(all.globaltests) - - --%test - procedure foo; - - -- %ann3(Name of suite) - -- %ann4(all.globaltests) - - --%test - procedure bar; - END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 2, 'suite', null, null ), - ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), - ut3.ut_annotation( 6, 'ann1', 'Name of suite', null ), - ut3.ut_annotation( 7, 'ann2', 'all.globaltests', null ), - ut3.ut_annotation( 9, 'test', null, 'foo'), - ut3.ut_annotation( 12, 'ann3', 'Name of suite', null ), - ut3.ut_annotation( 13, 'ann4', 'all.globaltests', null ), - ut3.ut_annotation( 15, 'test', null, 'bar') - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - end; - - procedure parse_complex_with_functions is - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - - begin - l_source := 'PACKAGE test_tt AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - --%test - procedure foo; - - - --%beforeeach - procedure foo2; - - --test comment - -- wrong comment - - - /* - describtion of the procedure - */ - --%beforeeach(key=testval) - PROCEDURE foo3(a_value number default null); - - --%all - function foo4(a_val number default null - , a_par varchar2 default := ''asdf''); - END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 2, 'suite', null, null ), - ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), - ut3.ut_annotation( 6, 'test', null, 'foo' ), - ut3.ut_annotation( 10, 'beforeeach', null,'foo2' ), - ut3.ut_annotation( 20, 'beforeeach', 'key=testval','foo3' ), - ut3.ut_annotation( 23, 'all', null,'foo4' ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - end; - - procedure no_procedure_annotation is - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - - begin - l_source := 'PACKAGE test_tt AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - procedure foo; - END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 2, 'suite', null, null ), - ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - end; - - procedure parse_accessible_by is - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - - begin - l_source := 'PACKAGE test_tt accessible by (foo) AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - procedure foo; - END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 2, 'suite', null, null ), - ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - end; - - procedure complex_package_declaration is - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - - begin - l_source := 'PACKAGE test_tt - ACCESSIBLE BY (calling_proc) - authid current_user - AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - procedure foo; - END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 5, 'suite', null, null ), - ut3.ut_annotation( 6, 'displayname', 'Name of suite', null ), - ut3.ut_annotation( 7, 'suitepath', 'all.globaltests', null ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - end; - - procedure complex_text is - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - - begin - l_source := 'PACKAGE test_tt AS - -- %suite - --%displayname(name = Name of suite) - -- %suitepath(key=all.globaltests,key2=foo,"--%some text") - - procedure foo; - END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 2, 'suite', null, null ), - ut3.ut_annotation( 3, 'displayname', 'name = Name of suite', null ), - ut3.ut_annotation( 4, 'suitepath', 'key=all.globaltests,key2=foo,"--%some text"', null ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - end; - - procedure ignore_annotations_in_comments is - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - - begin - l_source := 'PACKAGE test_tt AS - /* - Some comment - -- inlined - -- %ignored - */ - -- %suite - --%displayname(Name of suite) - -- %suitepath(all.globaltests) - - procedure foo; - END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 7, 'suite', null, null ), - ut3.ut_annotation( 8, 'displayname', 'Name of suite', null ), - ut3.ut_annotation( 9, 'suitepath', 'all.globaltests', null ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - end; - - procedure ignore_wrapped_package is - l_source dbms_preprocessor.source_lines_t; - l_actual ut3.ut_annotations; - begin - --Arrange - l_source(1) := 'create or replace PACKAGE tst_wrapped_pck wrapped -a000000 -369 -abcd -abcd -abcd -abcd -abcd -abcd -abcd -abcd -abcd -abcd -abcd -abcd -abcd -abcd -abcd -9 -34 6d -bg9Jaf2KguofrwaqloE8yvbggKcwg5m49TOf9b9cFj7R9JaW8lYWWi70llr/K6V0iwlp5+eb -v58yvbLAXLi9gYHwoIvAgccti+Cmpg0DKLY= --- %some_annotation_like_text -'; - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - --Assert - ut.expect(anydata.convertCollection(l_actual)).to_be_empty(); - end; - - procedure brackets_in_desc is - - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - begin - l_source := 'PACKAGE test_tt AS - -- %suite(Name of suite (including some brackets) and some more text) -END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 2, 'suite', 'Name of suite (including some brackets) and some more text', null ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - end; - - procedure test_space_before_annot_params is - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - - begin - l_source := 'PACKAGE test_tt AS - /* - Some comment - -- inlined - */ - -- %suite - -- %suitepath (all.globaltests) - - procedure foo; -END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 6, 'suite', null, null ), - ut3.ut_annotation( 7, 'suitepath', 'all.globaltests', null ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - end; - - procedure test_windows_newline - as - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - begin - l_source := 'PACKAGE test_tt AS - -- %suite - -- %displayname(Name of suite)' || chr(13) || chr(10) - || ' -- %suitepath(all.globaltests) - END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 2, 'suite', null, null ), - ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - end; - - procedure test_annot_very_long_name - as - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - begin - l_source := 'PACKAGE very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_did_it AS - -- %suite - -- %displayname(Name of suite) - -- %suitepath(all.globaltests) - - --%test - procedure very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it; - END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 2, 'suite', null, null ), - ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), - ut3.ut_annotation( 6, 'test', null, 'very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it' ) - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - end; - - procedure test_upper_annot is - l_source clob; - l_actual ut3.ut_annotations; - l_expected ut3.ut_annotations; - begin - l_source := 'PACKAGE test_tt AS - -- %SUITE - -- %DISPLAYNAME(Name of suite) - -- %SUITEPATH(all.globaltests) - - -- %ANN1(Name of suite) - -- %ANN2(all.globaltests) - - --%TEST - procedure foo; - - -- %ANN3(Name of suite) - -- %ANN4(all.globaltests) - - --%TEST - procedure bar; - END;'; - - --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); - - --Assert - l_expected := ut3.ut_annotations( - ut3.ut_annotation( 2, 'suite', null, null ), - ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), - ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), - ut3.ut_annotation( 6, 'ann1', 'Name of suite', null ), - ut3.ut_annotation( 7, 'ann2', 'all.globaltests', null ), - ut3.ut_annotation( 9, 'test', null, 'foo'), - ut3.ut_annotation( 12, 'ann3', 'Name of suite', null ), - ut3.ut_annotation( 13, 'ann4', 'all.globaltests', null ), - ut3.ut_annotation( 15, 'test', null, 'bar') - ); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - end; - -end test_annotation_parser; -/ diff --git a/test/core/annotations/test_annotation_parser.pks b/test/core/annotations/test_annotation_parser.pks deleted file mode 100644 index 19b98ae63..000000000 --- a/test/core/annotations/test_annotation_parser.pks +++ /dev/null @@ -1,42 +0,0 @@ -create or replace package test_annotation_parser is - - --%suite(ut_annotation_parser) - --%suitepath(utplsql.core.annotations) - - --%test(Treats procedure level annotations as package level, if mixed with comments) - procedure test_proc_comments; - --%test(Includes floating annotations between procedures and package) - procedure include_floating_annotations; - --%test(Parses complex annotations on procedures and functions) - procedure parse_complex_with_functions; - --%test(Parses package annotations without any procedure annotations) - procedure no_procedure_annotation; - --%test(Parses package level annotations with Accessible by) - procedure parse_accessible_by; - --%test(Parses package level annotations with multiline declaration) - procedure complex_package_declaration; - --%test(Parses complex text in annotation) - procedure complex_text; - --%test(Ignores content of multi-line comments) - procedure ignore_annotations_in_comments; - - --%test(Ignores wrapped package and does not raise exception) - procedure ignore_wrapped_package; - - --%test(Parses package level annotations with annotation params containing brackets) - procedure brackets_in_desc; - - --%test(Parses annotation text even with spaces before brackets) - procedure test_space_before_annot_params; - - -- %test(Parses source-code with Windows-style newline) - procedure test_windows_newline; - - -- %test(Parses annotations with very long object names) - procedure test_annot_very_long_name; - - -- %test(Parses upper case annotations) - procedure test_upper_annot; - -end test_annotation_parser; -/ diff --git a/test/core/expectations.pkb b/test/core/expectations.pkb deleted file mode 100644 index cc2bae436..000000000 --- a/test/core/expectations.pkb +++ /dev/null @@ -1,67 +0,0 @@ -create or replace package body expectations is - - function unary_expectation_block( - a_matcher_name varchar2, - a_data_type varchar2, - a_data_value varchar2 - ) return varchar2 is - l_execute varchar2(32000); - begin - l_execute := ' - declare - l_expected '||a_data_type||' := '||a_data_value||'; - begin - --act - execute the expectation - ut3.ut.expect(l_expected).'||a_matcher_name||'(); - end;'; - return l_execute; - end; - - function unary_expectation_object_block( - a_matcher_name varchar2, - a_object_name varchar2, - a_object_value varchar2, - a_object_type varchar2 - ) return varchar2 is - begin - return ' - declare - l_object '||a_object_name||' := '||a_object_value||'; - begin - ut3.ut.expect(anydata.convert'||a_object_type||'(l_object)).'||a_matcher_name||'(); - end;'; - end; - - function binary_expectation_block( - a_matcher_name varchar2, - a_actual_data_type varchar2, - a_actual_data varchar2, - a_expected_data_type varchar2, - a_expected_data varchar2 - ) return varchar2 - is - l_execute varchar2(32000); - begin - l_execute := ' - declare - l_actual '||a_actual_data_type||' := '||a_actual_data||'; - l_expected '||a_expected_data_type||' := '||a_expected_data||'; - begin - --act - execute the expectation - ut3.ut.expect( l_actual ).'||a_matcher_name||'(l_expected); - end;'; - return l_execute; - end; - - function failed_expectations_data return anydata is - begin - return anydata.convertCollection(ut3.ut_expectation_processor.get_failed_expectations()); - end; - - procedure cleanup_expectations is - begin - ut3.ut_expectation_processor.clear_expectations(); - end; - -end expectations; -/ diff --git a/test/core/expectations.pks b/test/core/expectations.pks deleted file mode 100644 index 9abc29400..000000000 --- a/test/core/expectations.pks +++ /dev/null @@ -1,29 +0,0 @@ -create or replace package expectations is - - function unary_expectation_block( - a_matcher_name varchar2, - a_data_type varchar2, - a_data_value varchar2 - ) return varchar2; - - function unary_expectation_object_block( - a_matcher_name varchar2, - a_object_name varchar2, - a_object_value varchar2, - a_object_type varchar2 - ) return varchar2; - - function binary_expectation_block( - a_matcher_name varchar2, - a_actual_data_type varchar2, - a_actual_data varchar2, - a_expected_data_type varchar2, - a_expected_data varchar2 - ) return varchar2; - - function failed_expectations_data return anydata; - - procedure cleanup_expectations; - -end expectations; -/ diff --git a/test/core/expectations/binary/test_be_greater_or_equal.pkb b/test/core/expectations/binary/test_be_greater_or_equal.pkb deleted file mode 100644 index f41878643..000000000 --- a/test/core/expectations/binary/test_be_greater_or_equal.pkb +++ /dev/null @@ -1,263 +0,0 @@ -create or replace package body test_be_greater_or_equal is - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - function to_greater_equal_block( - a_data_type varchar2, - a_actual varchar2, - a_expected varchar2 - ) return varchar2 is - begin - return expectations.binary_expectation_block( - 'to_be_greater_or_equal', a_data_type, a_actual, a_data_type, a_expected - ); - end; - - function not_to_greater_equal_block( - a_data_type varchar2, - a_actual varchar2, - a_expected varchar2 - ) return varchar2 is - begin - return expectations.binary_expectation_block( - 'not_to_be_greater_or_equal', a_data_type, a_actual, a_data_type, a_expected - ); - end; - - procedure actual_date_greater is - begin - --Act - execute immediate to_greater_equal_block('date', 'sysdate', 'sysdate-1'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_number_greater is - begin - --Act - execute immediate to_greater_equal_block('number', '2.0', '1.99'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_interval_ym_greater is - begin - --Act - execute immediate to_greater_equal_block('interval year to month', '''2-1''', '''2-0'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_interval_ds_greater is - begin - --Act - execute immediate to_greater_equal_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_greater is - begin - --Act - execute immediate to_greater_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_tz_greater is - begin - --Act - execute immediate to_greater_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_ltz_greater is - begin - --Act - execute immediate to_greater_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_date_equal is - begin - --Act - execute immediate to_greater_equal_block('date', 'sysdate', 'sysdate'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_number_equal is - begin - --Act - execute immediate to_greater_equal_block('number', '2.0', '2.00'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_interval_ym_equal is - begin - --Act - execute immediate to_greater_equal_block('interval year to month', '''2-1''', '''2-1'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_interval_ds_equal is - begin - --Act - execute immediate to_greater_equal_block('interval day to second', '''2 01:00:00''', '''2 01:00:00'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_equal is - begin - --Act - execute immediate to_greater_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_tz_equal is - begin - --Act - execute immediate to_greater_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_ltz_equal is - begin - --Act - execute immediate to_greater_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_date_less is - begin - --Act - execute immediate to_greater_equal_block('date', 'sysdate-1', 'sysdate'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_number_less is - begin - --Act - execute immediate to_greater_equal_block('number', '1.0', '1.01'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_interval_ym_less is - begin - --Act - execute immediate to_greater_equal_block('interval year to month', '''2-1''', '''2-2'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_interval_ds_less is - begin - --Act - execute immediate to_greater_equal_block('interval day to second', '''2 00:59:58''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_less is - begin - --Act - execute immediate to_greater_equal_block('timestamp', 'to_timestamp(''1997 12'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_tz_less is - begin - --Act - execute immediate to_greater_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_ltz_less is - begin - --Act - execute immediate to_greater_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_date_greater is - begin - --Act - execute immediate not_to_greater_equal_block('date', 'sysdate', 'sysdate-1'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_number_greater is - begin - --Act - execute immediate not_to_greater_equal_block('number', '2.0', '1.99'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_interval_ym_greater is - begin - --Act - execute immediate not_to_greater_equal_block('interval year to month', '''2-1''', '''2-0'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_interval_ds_greater is - begin - --Act - execute immediate not_to_greater_equal_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_timestamp_greater is - begin - --Act - execute immediate not_to_greater_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_timestamp_tz_gretr is - begin - --Act - execute immediate not_to_greater_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_timestamp_ltz_gretr is - begin - --Act - execute immediate not_to_greater_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_clob is - begin - --Act - ut3.ut.expect(to_clob('3')).to_( ut3.be_greater_or_equal(3) ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - -end; -/ diff --git a/test/core/expectations/binary/test_be_greater_or_equal.pks b/test/core/expectations/binary/test_be_greater_or_equal.pks deleted file mode 100644 index 077dff59c..000000000 --- a/test/core/expectations/binary/test_be_greater_or_equal.pks +++ /dev/null @@ -1,97 +0,0 @@ -create or replace package test_be_greater_or_equal is - - --%suite((not)to_be_greater_or_equal) - --%suitepath(utplsql.core.expectations.binary) - - --%aftereach - procedure cleanup_expectations; - - --%test(Gives success when actual date is greater than expected) - procedure actual_date_greater; - - --%test(Gives success when actual number is greater than expected) - procedure actual_number_greater; - - --%test(Gives success when actual interval year to month is greater than expected) - procedure actual_interval_ym_greater; - - --%test(Gives success when actual interval day to second is greater than expected) - procedure actual_interval_ds_greater; - - --%test(Gives success when actual timestamp is greater than expected) - procedure actual_timestamp_greater; - - --%test(Gives success when actual timestamp with time zone is greater than expected) - procedure actual_timestamp_tz_greater; - - --%test(Gives success when actual timestamp with local time zone is greater than expected) - procedure actual_timestamp_ltz_greater; - - --%test(Gives success when actual date is equal expected) - procedure actual_date_equal; - - --%test(Gives success when actual number is equal expected) - procedure actual_number_equal; - - --%test(Gives success when actual interval year to month is equal expected) - procedure actual_interval_ym_equal; - - --%test(Gives success when actual interval day to second is equal expected) - procedure actual_interval_ds_equal; - - --%test(Gives success when actual timestamp is equal expected) - procedure actual_timestamp_equal; - - --%test(Gives success when actual timestamp with time zone is equal expected) - procedure actual_timestamp_tz_equal; - - --%test(Gives success when actual timestamp with local time zone is equal expected) - procedure actual_timestamp_ltz_equal; - - --%test(Gives failure when actual date is less than expected) - procedure actual_date_less; - - --%test(Gives failure when actual number is less than expected) - procedure actual_number_less; - - --%test(Gives failure when actual interval year to month is less than expected) - procedure actual_interval_ym_less; - - --%test(Gives failure when actual interval day to second is less than expected) - procedure actual_interval_ds_less; - - --%test(Gives failure when actual timestamp is less than expected) - procedure actual_timestamp_less; - - --%test(Gives failure when actual timestamp with time zone is less than expected) - procedure actual_timestamp_tz_less; - - --%test(Gives failure when actual timestamp with local time zone is less than expected) - procedure actual_timestamp_ltz_less; - - --%test(Negated - Gives failure when actual date is greater than expected) - procedure not_actual_date_greater; - - --%test(Negated - Gives failure when actual number is greater than expected) - procedure not_actual_number_greater; - - --%test(Negated - Gives failure when actual interval year to month is greater than expected) - procedure not_actual_interval_ym_greater; - - --%test(Negated - Gives failure when actual interval day to second is greater than expected) - procedure not_actual_interval_ds_greater; - - --%test(Negated - Gives failure when actual timestamp is greater than expected) - procedure not_actual_timestamp_greater; - - --%test(Negated - Gives failure when actual timestamp with time zone is greater than expected) - procedure not_actual_timestamp_tz_gretr; - - --%test(Negated - Gives failure when actual timestamp with local time zone is greater than expected) - procedure not_actual_timestamp_ltz_gretr; - - --%test(Gives failure when running against CLOB) - procedure actual_clob; - -end; -/ diff --git a/test/core/expectations/binary/test_be_greater_than.pkb b/test/core/expectations/binary/test_be_greater_than.pkb deleted file mode 100644 index 5863b11b1..000000000 --- a/test/core/expectations/binary/test_be_greater_than.pkb +++ /dev/null @@ -1,263 +0,0 @@ -create or replace package body test_be_greater_than is - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - function to_greater_than_block( - a_data_type varchar2, - a_actual varchar2, - a_expected varchar2 - ) return varchar2 is - begin - return expectations.binary_expectation_block( - 'to_be_greater_than', a_data_type, a_actual, a_data_type, a_expected - ); - end; - - function not_to_greater_than_block( - a_data_type varchar2, - a_actual varchar2, - a_expected varchar2 - ) return varchar2 is - begin - return expectations.binary_expectation_block( - 'not_to_be_greater_than', a_data_type, a_actual, a_data_type, a_expected - ); - end; - - procedure actual_date_greater is - begin - --Act - execute immediate to_greater_than_block('date', 'sysdate', 'sysdate-1'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_number_greater is - begin - --Act - execute immediate to_greater_than_block('number', '2.0', '1.99'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_interval_ym_greater is - begin - --Act - execute immediate to_greater_than_block('interval year to month', '''2-1''', '''2-0'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_interval_ds_greater is - begin - --Act - execute immediate to_greater_than_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_greater is - begin - --Act - execute immediate to_greater_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_tz_greater is - begin - --Act - execute immediate to_greater_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_ltz_greater is - begin - --Act - execute immediate to_greater_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_date_equal is - begin - --Act - execute immediate to_greater_than_block('date', 'sysdate', 'sysdate'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_number_equal is - begin - --Act - execute immediate to_greater_than_block('number', '2.0', '2.00'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_interval_ym_equal is - begin - --Act - execute immediate to_greater_than_block('interval year to month', '''2-1''', '''2-1'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_interval_ds_equal is - begin - --Act - execute immediate to_greater_than_block('interval day to second', '''2 01:00:00''', '''2 01:00:00'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_equal is - begin - --Act - execute immediate to_greater_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_tz_equal is - begin - --Act - execute immediate to_greater_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_ltz_equal is - begin - --Act - execute immediate to_greater_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_date_less is - begin - --Act - execute immediate to_greater_than_block('date', 'sysdate-1', 'sysdate'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_number_less is - begin - --Act - execute immediate to_greater_than_block('number', '1.0', '1.01'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_interval_ym_less is - begin - --Act - execute immediate to_greater_than_block('interval year to month', '''2-1''', '''2-2'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_interval_ds_less is - begin - --Act - execute immediate to_greater_than_block('interval day to second', '''2 00:59:58''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_less is - begin - --Act - execute immediate to_greater_than_block('timestamp', 'to_timestamp(''1997 12'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_tz_less is - begin - --Act - execute immediate to_greater_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_ltz_less is - begin - --Act - execute immediate to_greater_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_date_greater is - begin - --Act - execute immediate not_to_greater_than_block('date', 'sysdate', 'sysdate-1'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_number_greater is - begin - --Act - execute immediate not_to_greater_than_block('number', '2.0', '1.99'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_interval_ym_greater is - begin - --Act - execute immediate not_to_greater_than_block('interval year to month', '''2-1''', '''2-0'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_interval_ds_greater is - begin - --Act - execute immediate not_to_greater_than_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_timestamp_greater is - begin - --Act - execute immediate not_to_greater_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_timestamp_tz_gretr is - begin - --Act - execute immediate not_to_greater_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_actual_timestamp_ltz_gretr is - begin - --Act - execute immediate not_to_greater_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_clob is - begin - --Act - ut3.ut.expect(to_clob('3')).to_( ut3.be_greater_than(2) ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - -end; -/ diff --git a/test/core/expectations/binary/test_be_greater_than.pks b/test/core/expectations/binary/test_be_greater_than.pks deleted file mode 100644 index 6a1dfcc3e..000000000 --- a/test/core/expectations/binary/test_be_greater_than.pks +++ /dev/null @@ -1,97 +0,0 @@ -create or replace package test_be_greater_than is - - --%suite((not)to_be_greater_than) - --%suitepath(utplsql.core.expectations.binary) - - --%aftereach - procedure cleanup_expectations; - - --%test(Gives success when actual date is greater than expected) - procedure actual_date_greater; - - --%test(Gives success when actual number is greater than expected) - procedure actual_number_greater; - - --%test(Gives success when actual interval year to month is greater than expected) - procedure actual_interval_ym_greater; - - --%test(Gives success when actual interval day to second is greater than expected) - procedure actual_interval_ds_greater; - - --%test(Gives success when actual timestamp is greater than expected) - procedure actual_timestamp_greater; - - --%test(Gives success when actual timestamp with time zone is greater than expected) - procedure actual_timestamp_tz_greater; - - --%test(Gives success when actual timestamp with local time zone is greater than expected) - procedure actual_timestamp_ltz_greater; - - --%test(Gives failure when actual date is equal expected) - procedure actual_date_equal; - - --%test(Gives failure when actual number is equal expected) - procedure actual_number_equal; - - --%test(Gives failure when actual interval year to month is equal expected) - procedure actual_interval_ym_equal; - - --%test(Gives failure when actual interval day to second is equal expected) - procedure actual_interval_ds_equal; - - --%test(Gives failure when actual timestamp is equal expected) - procedure actual_timestamp_equal; - - --%test(Gives failure when actual timestamp with time zone is equal expected) - procedure actual_timestamp_tz_equal; - - --%test(Gives failure when actual timestamp with local time zone is equal expected) - procedure actual_timestamp_ltz_equal; - - --%test(Gives failure when actual date is less than expected) - procedure actual_date_less; - - --%test(Gives failure when actual number is less than expected) - procedure actual_number_less; - - --%test(Gives failure when actual interval year to month is less than expected) - procedure actual_interval_ym_less; - - --%test(Gives failure when actual interval day to second is less than expected) - procedure actual_interval_ds_less; - - --%test(Gives failure when actual timestamp is less than expected) - procedure actual_timestamp_less; - - --%test(Gives failure when actual timestamp with time zone is less than expected) - procedure actual_timestamp_tz_less; - - --%test(Gives failure when actual timestamp with local time zone is less than expected) - procedure actual_timestamp_ltz_less; - - --%test(Negated - Gives failure when actual date is greater than expected) - procedure not_actual_date_greater; - - --%test(Negated - Gives failure when actual number is greater than expected) - procedure not_actual_number_greater; - - --%test(Negated - Gives failure when actual interval year to month is greater than expected) - procedure not_actual_interval_ym_greater; - - --%test(Negated - Gives failure when actual interval day to second is greater than expected) - procedure not_actual_interval_ds_greater; - - --%test(Negated - Gives failure when actual timestamp is greater than expected) - procedure not_actual_timestamp_greater; - - --%test(Negated - Gives failure when actual timestamp with time zone is greater than expected) - procedure not_actual_timestamp_tz_gretr; - - --%test(Negated - Gives failure when actual timestamp with local time zone is greater than expected) - procedure not_actual_timestamp_ltz_gretr; - - --%test(Gives failure when running against CLOB) - procedure actual_clob; - -end; -/ diff --git a/test/core/expectations/binary/test_be_less_or_equal.pkb b/test/core/expectations/binary/test_be_less_or_equal.pkb deleted file mode 100644 index c72e0039b..000000000 --- a/test/core/expectations/binary/test_be_less_or_equal.pkb +++ /dev/null @@ -1,263 +0,0 @@ -create or replace package body test_be_less_or_equal is - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - function to_less_or_equal_block( - a_data_type varchar2, - a_actual varchar2, - a_expected varchar2 - ) return varchar2 is - begin - return expectations.binary_expectation_block( - 'to_be_less_or_equal', a_data_type, a_actual, a_data_type, a_expected - ); - end; - - function not_to_less_or_equal_block( - a_data_type varchar2, - a_actual varchar2, - a_expected varchar2 - ) return varchar2 is - begin - return expectations.binary_expectation_block( - 'not_to_be_less_or_equal', a_data_type, a_actual, a_data_type, a_expected - ); - end; - - procedure actual_date_greater is - begin - --Act - execute immediate to_less_or_equal_block('date', 'sysdate', 'sysdate-1'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty(); - end; - - procedure actual_number_greater is - begin - --Act - execute immediate to_less_or_equal_block('number', '2.0', '1.99'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty(); - end; - - procedure actual_interval_ym_greater is - begin - --Act - execute immediate to_less_or_equal_block('interval year to month', '''2-1''', '''2-0'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty(); - end; - - procedure actual_interval_ds_greater is - begin - --Act - execute immediate to_less_or_equal_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty(); - end; - - procedure actual_timestamp_greater is - begin - --Act - execute immediate to_less_or_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty(); - end; - - procedure actual_timestamp_tz_greater is - begin - --Act - execute immediate to_less_or_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty(); - end; - - procedure actual_timestamp_ltz_greater is - begin - --Act - execute immediate to_less_or_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty(); - end; - - procedure actual_date_equal is - begin - --Act - execute immediate to_less_or_equal_block('date', 'sysdate', 'sysdate'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_number_equal is - begin - --Act - execute immediate to_less_or_equal_block('number', '2.0', '2.00'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_interval_ym_equal is - begin - --Act - execute immediate to_less_or_equal_block('interval year to month', '''2-1''', '''2-1'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_interval_ds_equal is - begin - --Act - execute immediate to_less_or_equal_block('interval day to second', '''2 01:00:00''', '''2 01:00:00'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_timestamp_equal is - begin - --Act - execute immediate to_less_or_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_timestamp_tz_equal is - begin - --Act - execute immediate to_less_or_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_timestamp_ltz_equal is - begin - --Act - execute immediate to_less_or_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_date_less is - begin - --Act - execute immediate to_less_or_equal_block('date', 'sysdate-1', 'sysdate'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_number_less is - begin - --Act - execute immediate to_less_or_equal_block('number', '1.0', '1.01'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_interval_ym_less is - begin - --Act - execute immediate to_less_or_equal_block('interval year to month', '''2-1''', '''2-2'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_interval_ds_less is - begin - --Act - execute immediate to_less_or_equal_block('interval day to second', '''2 00:59:58''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_timestamp_less is - begin - --Act - execute immediate to_less_or_equal_block('timestamp', 'to_timestamp(''1997 12'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_timestamp_tz_less is - begin - --Act - execute immediate to_less_or_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_timestamp_ltz_less is - begin - --Act - execute immediate to_less_or_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure not_actual_date_greater is - begin - --Act - execute immediate not_to_less_or_equal_block('date', 'sysdate', 'sysdate-1'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure not_actual_number_greater is - begin - --Act - execute immediate not_to_less_or_equal_block('number', '2.0', '1.99'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure not_actual_interval_ym_greater is - begin - --Act - execute immediate not_to_less_or_equal_block('interval year to month', '''2-1''', '''2-0'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure not_actual_interval_ds_greater is - begin - --Act - execute immediate not_to_less_or_equal_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure not_actual_timestamp_greater is - begin - --Act - execute immediate not_to_less_or_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure not_actual_timestamp_tz_gretr is - begin - --Act - execute immediate not_to_less_or_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure not_actual_timestamp_ltz_gretr is - begin - --Act - execute immediate not_to_less_or_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - end; - - procedure actual_clob is - begin - --Act - ut3.ut.expect(to_clob('3')).to_( ut3.be_less_or_equal(3) ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - -end; -/ diff --git a/test/core/expectations/binary/test_be_less_or_equal.pks b/test/core/expectations/binary/test_be_less_or_equal.pks deleted file mode 100644 index a6ab01664..000000000 --- a/test/core/expectations/binary/test_be_less_or_equal.pks +++ /dev/null @@ -1,97 +0,0 @@ -create or replace package test_be_less_or_equal is - - --%suite((not)to_be_less_or_equal) - --%suitepath(utplsql.core.expectations.binary) - - --%aftereach - procedure cleanup_expectations; - - --%test(Gives failure when actual date is greater than expected) - procedure actual_date_greater; - - --%test(Gives failure when actual number is greater than expected) - procedure actual_number_greater; - - --%test(Gives failure when actual interval year to month is greater than expected) - procedure actual_interval_ym_greater; - - --%test(Gives failure when actual interval day to second is greater than expected) - procedure actual_interval_ds_greater; - - --%test(Gives failure when actual timestamp is greater than expected) - procedure actual_timestamp_greater; - - --%test(Gives failure when actual timestamp with time zone is greater than expected) - procedure actual_timestamp_tz_greater; - - --%test(Gives failure when actual timestamp with local time zone is greater than expected) - procedure actual_timestamp_ltz_greater; - - --%test(Gives success when actual date is equal expected) - procedure actual_date_equal; - - --%test(Gives success when actual number is equal expected) - procedure actual_number_equal; - - --%test(Gives success when actual interval year to month is equal expected) - procedure actual_interval_ym_equal; - - --%test(Gives success when actual interval day to second is equal expected) - procedure actual_interval_ds_equal; - - --%test(Gives success when actual timestamp is equal expected) - procedure actual_timestamp_equal; - - --%test(Gives success when actual timestamp with time zone is equal expected) - procedure actual_timestamp_tz_equal; - - --%test(Gives success when actual timestamp with local time zone is equal expected) - procedure actual_timestamp_ltz_equal; - - --%test(Gives success when actual date is less than expected) - procedure actual_date_less; - - --%test(Gives success when actual number is less than expected) - procedure actual_number_less; - - --%test(Gives success when actual interval year to month is less than expected) - procedure actual_interval_ym_less; - - --%test(Gives success when actual interval day to second is less than expected) - procedure actual_interval_ds_less; - - --%test(Gives success when actual timestamp is less than expected) - procedure actual_timestamp_less; - - --%test(Gives success when actual timestamp with time zone is less than expected) - procedure actual_timestamp_tz_less; - - --%test(Gives success when actual timestamp with local time zone is less than expected) - procedure actual_timestamp_ltz_less; - - --%test(Negated - Gives success when actual date is greater than expected) - procedure not_actual_date_greater; - - --%test(Negated - Gives success when actual number is greater than expected) - procedure not_actual_number_greater; - - --%test(Negated - Gives success when actual interval year to month is greater than expected) - procedure not_actual_interval_ym_greater; - - --%test(Negated - Gives success when actual interval day to second is greater than expected) - procedure not_actual_interval_ds_greater; - - --%test(Negated - Gives success when actual timestamp is greater than expected) - procedure not_actual_timestamp_greater; - - --%test(Negated - Gives success when actual timestamp with time zone is greater than expected) - procedure not_actual_timestamp_tz_gretr; - - --%test(Negated - Gives success when actual timestamp with local time zone is greater than expected) - procedure not_actual_timestamp_ltz_gretr; - - --%test(Gives failure when running against CLOB) - procedure actual_clob; - -end; -/ diff --git a/test/core/expectations/binary/test_equal.pkb b/test/core/expectations/binary/test_equal.pkb deleted file mode 100644 index dd7dd7a82..000000000 --- a/test/core/expectations/binary/test_equal.pkb +++ /dev/null @@ -1,264 +0,0 @@ -create or replace package body test_equal is - - procedure reset_nulls_equal is - begin - ut3.ut_expectation_processor.nulls_Are_equal(ut3.ut_expectation_processor.gc_default_nulls_are_equal); - end; - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - function to_equal_block( - a_matcher_name varchar2, - a_actual_type varchar2, - a_expected_type varchar2, - a_actual varchar2, - a_expected varchar2, - a_nulls_equal boolean := null - ) return varchar2 is - l_nulls_equal varchar2(10); - begin - l_nulls_equal := case when a_nulls_equal then 'true' when not a_nulls_equal then 'false' else 'null' end; - return ' - declare - l_actual '||a_actual_type||' := '||a_actual||'; - l_expected '||a_expected_type||' := '||a_expected||'; - begin - ut3.ut.expect( l_actual ).'||a_matcher_name||'(l_expected, a_nulls_are_equal=>'||l_nulls_equal||'); - end;'; - end; - - procedure test_to_equal_success( - a_actual_type varchar2, - a_expected_type varchar2, - a_actual varchar2, - a_expected varchar2, - a_nulls_equal boolean := null - ) is - begin - execute immediate - to_equal_block( 'to_equal', a_actual_type, a_expected_type, a_actual, a_expected, a_nulls_equal ); - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty(); - cleanup_expectations; - end; - - procedure test_to_equal_success( - a_actual_type varchar2, - a_actual varchar2, - a_expected varchar2, - a_nulls_equal boolean := null - ) is - begin - test_to_equal_success(a_actual_type, a_actual_type, a_actual, a_expected, a_nulls_equal); - end; - - - procedure test_to_equal_fail( - a_actual_type varchar2, - a_expected_type varchar2, - a_actual varchar2, - a_expected varchar2, - a_nulls_equal boolean := null - ) is - begin - execute immediate - to_equal_block( 'to_equal', a_actual_type, a_expected_type, a_actual, a_expected, a_nulls_equal ); - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty(); - cleanup_expectations; - end; - - procedure test_not_to_equal_fail( - a_actual_type varchar2, - a_expected_type varchar2, - a_actual varchar2, - a_expected varchar2, - a_nulls_equal boolean := null - ) is - begin - execute immediate - to_equal_block( 'not_to_equal', a_actual_type, a_expected_type, a_actual, a_expected, a_nulls_equal ); - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty(); - cleanup_expectations; - end; - - procedure test_to_equal_fail( - a_actual_type varchar2, - a_actual varchar2, - a_expected varchar2, - a_nulls_equal boolean := null - ) is - begin - test_to_equal_fail(a_actual_type, a_actual_type, a_actual, a_expected, a_nulls_equal); - end; - - procedure equal_fail_on_type_diff is - begin - test_to_equal_fail('boolean', 'integer', 'true', '1'); - test_to_equal_fail('integer', 'boolean', '1', 'true'); - test_to_equal_fail('blob', 'clob', 'to_blob(''ABC'')', '''ABC'''); - test_to_equal_fail('clob', 'blob', '''ABC''', 'to_blob(''ABC'')'); - test_to_equal_fail('clob', 'anydata', '''ABC''', 'null'); - test_to_equal_fail('anydata', 'sys_refcursor', 'null', 'null'); - test_to_equal_fail('sys_refcursor', 'anydata', 'null', 'null'); - test_to_equal_fail('clob', 'varchar2(4000)', '''Abc''', '''Abc'''); - test_to_equal_fail('date', 'timestamp', 'sysdate', 'sysdate'); - test_to_equal_fail('date', 'timestamp with local time zone', 'sysdate', 'sysdate'); - test_to_equal_fail('timestamp', 'date', 'sysdate', 'sysdate'); - test_to_equal_fail('timestamp with local time zone', 'timestamp', 'sysdate', 'sysdate'); - test_to_equal_fail('timestamp with local time zone', 'timestamp with time zone', 'sysdate', 'sysdate'); - test_to_equal_fail('number', 'varchar2(4000)', '1', '''1'''); - test_to_equal_fail('varchar2(4000)', 'number', '''1''', '1'); - test_to_equal_fail('varchar2(4000)', 'boolean', '''true''', 'true'); - test_to_equal_fail('interval day to second', 'interval year to month', '''2 01:00:00''', '''1-1'''); - test_to_equal_fail('interval year to month', 'interval day to second', '''1-1''', '''2 01:00:00'''); - end; - - procedure not_equal_fail_on_type_diff is - begin - test_not_to_equal_fail('boolean', 'integer', 'true', '1'); - test_not_to_equal_fail('integer', 'boolean', '1', 'true'); - test_not_to_equal_fail('blob', 'clob', 'to_blob(''ABC'')', '''ABC'''); - test_not_to_equal_fail('clob', 'blob', '''ABC''', 'to_blob(''ABC'')'); - test_not_to_equal_fail('clob', 'anydata', '''ABC''', 'null'); - test_not_to_equal_fail('anydata', 'sys_refcursor', 'null', 'null'); - test_not_to_equal_fail('sys_refcursor', 'anydata', 'null', 'null'); - test_not_to_equal_fail('clob', 'varchar2(4000)', '''Abc''', '''Abc'''); - test_not_to_equal_fail('date', 'timestamp', 'sysdate', 'sysdate'); - test_not_to_equal_fail('date', 'timestamp with local time zone', 'sysdate', 'sysdate'); - test_not_to_equal_fail('timestamp', 'date', 'sysdate', 'sysdate'); - test_not_to_equal_fail('timestamp with local time zone', 'timestamp', 'sysdate', 'sysdate'); - test_not_to_equal_fail('timestamp with local time zone', 'timestamp with time zone', 'sysdate', 'sysdate'); - test_not_to_equal_fail('number', 'varchar2(4000)', '1', '''1'''); - test_not_to_equal_fail('varchar2(4000)', 'number', '''1''', '1'); - test_not_to_equal_fail('varchar2(4000)', 'boolean', '''true''', 'true'); - test_not_to_equal_fail('interval day to second', 'interval year to month', '''2 01:00:00''', '''1-1'''); - test_not_to_equal_fail('interval year to month', 'interval day to second', '''1-1''', '''2 01:00:00'''); - end; - - procedure failure_on_data_diff is - begin - test_to_equal_fail('blob', 'to_blob(''abc'')', 'to_blob(''abd'')'); - test_to_equal_fail('boolean', 'false', 'true'); - test_to_equal_fail('boolean', 'true', 'false'); - test_to_equal_fail('clob', '''Abc''', '''abc'''); - test_to_equal_fail('date', 'sysdate', 'sysdate-1'); - test_to_equal_fail('number', '0.1', '0.3'); - test_to_equal_fail('timestamp', 'systimestamp', 'systimestamp'); - test_to_equal_fail('timestamp with local time zone', 'systimestamp', 'systimestamp'); - test_to_equal_fail('timestamp with time zone', 'systimestamp', 'systimestamp'); - test_to_equal_fail('varchar2(4000)', '''Abc''', '''abc'''); - test_to_equal_fail('interval day to second', '''2 01:00:00''', '''2 01:00:01'''); - test_to_equal_fail('interval year to month', '''1-1''', '''1-2'''); - end; - - procedure failure_on_actual_null is - begin - test_to_equal_fail('blob', 'NULL', 'to_blob(''abc'')'); - test_to_equal_fail('boolean', 'NULL', 'true'); - test_to_equal_fail('clob', 'NULL', '''abc'''); - test_to_equal_fail('date', 'NULL', 'sysdate'); - test_to_equal_fail('number', 'NULL', '1'); - test_to_equal_fail('timestamp', 'NULL', 'systimestamp'); - test_to_equal_fail('timestamp with local time zone', 'NULL', 'systimestamp'); - test_to_equal_fail('timestamp with time zone', 'NULL', 'systimestamp'); - test_to_equal_fail('varchar2(4000)', 'NULL', '''abc'''); - test_to_equal_fail('interval day to second', 'NULL', '''2 01:00:00'''); - test_to_equal_fail('interval year to month', 'NULL', '''1-1'''); - end; - - procedure failure_on_expected_null is - begin - test_to_equal_fail('blob', 'to_blob(''abc'')', 'NULL'); - test_to_equal_fail('boolean', 'true', 'NULL'); - test_to_equal_fail('clob', '''abc''', 'NULL'); - test_to_equal_fail('date', 'sysdate', 'NULL'); - test_to_equal_fail('number', '1234', 'NULL'); - test_to_equal_fail('timestamp', 'systimestamp', 'NULL'); - test_to_equal_fail('timestamp with local time zone', 'systimestamp', 'NULL'); - test_to_equal_fail('timestamp with time zone', 'systimestamp', 'NULL'); - test_to_equal_fail('varchar2(4000)', '''abc''', 'NULL'); - test_to_equal_fail('interval day to second', '''2 01:00:00''', 'NULL'); - test_to_equal_fail('interval year to month', '''1-1''', 'NULL'); - end; - - procedure failure_on_both_null_with_parm is - begin - test_to_equal_fail('blob', 'NULL', 'NULL', false); - test_to_equal_fail('boolean', 'NULL', 'NULL', false); - test_to_equal_fail('clob', 'NULL', 'NULL', false); - test_to_equal_fail('date', 'NULL', 'NULL', false); - test_to_equal_fail('number', 'NULL', 'NULL', false); - test_to_equal_fail('timestamp', 'NULL', 'NULL', false); - test_to_equal_fail('timestamp with local time zone', 'NULL', 'NULL', false); - test_to_equal_fail('timestamp with time zone', 'NULL', 'NULL', false); - test_to_equal_fail('varchar2(4000)', 'NULL', 'NULL', false); - test_to_equal_fail('interval day to second', 'NULL', 'NULL', false); - test_to_equal_fail('interval year to month', 'NULL', 'NULL', false); - end; - - procedure failure_on_both_null_with_conf is - begin - ut3.ut_expectation_processor.nulls_Are_equal(false); - test_to_equal_fail('blob', 'NULL', 'NULL'); - test_to_equal_fail('boolean', 'NULL', 'NULL'); - test_to_equal_fail('clob', 'NULL', 'NULL'); - test_to_equal_fail('date', 'NULL', 'NULL'); - test_to_equal_fail('number', 'NULL', 'NULL'); - test_to_equal_fail('timestamp', 'NULL', 'NULL'); - test_to_equal_fail('timestamp with local time zone', 'NULL', 'NULL'); - test_to_equal_fail('timestamp with time zone', 'NULL', 'NULL'); - test_to_equal_fail('varchar2(4000)', 'NULL', 'NULL'); - test_to_equal_fail('interval day to second', 'NULL', 'NULL'); - test_to_equal_fail('interval year to month', 'NULL', 'NULL'); - end; - - procedure success_on_equal_data is - begin - test_to_equal_success('blob', 'to_blob(''Abc'')', 'to_blob(''abc'')'); - test_to_equal_success('boolean', 'true', 'true'); - test_to_equal_success('clob', '''Abc''', '''Abc'''); - test_to_equal_success('date', 'sysdate', 'sysdate'); - test_to_equal_success('number', '12345', '12345'); - test_to_equal_success('timestamp(9)', 'to_Timestamp(''2016 123456789'',''yyyy ff'')', 'to_Timestamp(''2016 123456789'',''yyyy ff'')'); - test_to_equal_success('timestamp(9) with local time zone', 'to_Timestamp(''2016 123456789'',''yyyy ff'')', 'to_Timestamp(''2016 123456789'',''yyyy ff'')'); - test_to_equal_success('timestamp(9) with time zone', 'to_Timestamp(''2016 123456789'',''yyyy ff'')', 'to_Timestamp(''2016 123456789'',''yyyy ff'')'); - test_to_equal_success('varchar2(4000)', '''Abc''', '''Abc'''); - test_to_equal_success('interval day to second', '''2 01:00:00''', '''2 01:00:00'''); - test_to_equal_success('interval year to month', '''1-1''', '''1-1'''); - end; - - procedure success_on_both_null is - begin - test_to_equal_success('blob', 'NULL', 'NULL'); - test_to_equal_success('boolean', 'NULL', 'NULL'); - test_to_equal_success('clob', 'NULL', 'NULL'); - test_to_equal_success('date', 'NULL', 'NULL'); - test_to_equal_success('number', 'NULL', 'NULL'); - test_to_equal_success('timestamp', 'NULL', 'NULL'); - test_to_equal_success('timestamp with local time zone', 'NULL', 'NULL'); - test_to_equal_success('timestamp with time zone', 'NULL', 'NULL'); - test_to_equal_success('varchar2(4000)', 'NULL', 'NULL'); - test_to_equal_success('interval day to second', 'NULL', 'NULL'); - test_to_equal_success('interval year to month', 'NULL', 'NULL'); - end; - - procedure success_on_both_null_with_parm is - begin - ut3.ut_expectation_processor.nulls_Are_equal(false); - test_to_equal_success('blob', 'NULL', 'NULL', true); - test_to_equal_success('boolean', 'NULL', 'NULL', true); - test_to_equal_success('clob', 'NULL', 'NULL', true); - test_to_equal_success('date', 'NULL', 'NULL', true); - test_to_equal_success('number', 'NULL', 'NULL', true); - test_to_equal_success('timestamp', 'NULL', 'NULL', true); - test_to_equal_success('timestamp with local time zone', 'NULL', 'NULL', true); - test_to_equal_success('timestamp with time zone', 'NULL', 'NULL', true); - test_to_equal_success('varchar2(4000)', 'NULL', 'NULL', true); - test_to_equal_success('interval day to second', 'NULL', 'NULL', true); - test_to_equal_success('interval year to month', 'NULL', 'NULL', true); - end; - -end; -/ diff --git a/test/core/expectations/binary/test_equal.pks b/test/core/expectations/binary/test_equal.pks deleted file mode 100644 index c0280c288..000000000 --- a/test/core/expectations/binary/test_equal.pks +++ /dev/null @@ -1,38 +0,0 @@ -create or replace package test_equal is - - --%suite((not)to_be_equal) - --%suitepath(utplsql.core.expectations.binary) - - procedure reset_nulls_equal; - - --%aftereach - procedure cleanup_expectations; - - --%test(Gives failure for different data types) - procedure equal_fail_on_type_diff; - --%test(Negated - gives failure for different data types) - procedure not_equal_fail_on_type_diff; - --%test(Gives failure for different data values) - procedure failure_on_data_diff; - --%test(Gives failure when actual is null) - procedure failure_on_actual_null; - --%test(Gives failure when expected is null) - procedure failure_on_expected_null; - --%test(Gives failure when both values are null and argument nulls_are_equal is false) - procedure failure_on_both_null_with_parm; - - --%test(Gives failure when both values are null and configuration nulls_are_equal is false) - --%aftertest(reset_nulls_equal) - procedure failure_on_both_null_with_conf; - - --%test(Gives success for equal values) - procedure success_on_equal_data; - --%test(Gives success when both values are null) - procedure success_on_both_null; - - --%test(Gives success when both values are null and argument nulls_are_equal is true) - --%aftertest(reset_nulls_equal) - procedure success_on_both_null_with_parm; - -end; -/ diff --git a/test/core/expectations/binary/test_expect_to_be_less_than.pkb b/test/core/expectations/binary/test_expect_to_be_less_than.pkb deleted file mode 100644 index 8f1278db4..000000000 --- a/test/core/expectations/binary/test_expect_to_be_less_than.pkb +++ /dev/null @@ -1,263 +0,0 @@ -create or replace package body test_expect_to_be_less_than is - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - function to_be_less_than_block( - a_data_type varchar2, - a_actual varchar2, - a_expected varchar2 - ) return varchar2 is - begin - return expectations.binary_expectation_block( - 'to_be_less_than', a_data_type, a_actual, a_data_type, a_expected - ); - end; - - function not_to_be_less_than_block( - a_data_type varchar2, - a_actual varchar2, - a_expected varchar2 - ) return varchar2 is - begin - return expectations.binary_expectation_block( - 'not_to_be_less_than', a_data_type, a_actual, a_data_type, a_expected - ); - end; - - procedure actual_date_greater is - begin - --Act - execute immediate to_be_less_than_block('date', 'sysdate', 'sysdate-1'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_number_greater is - begin - --Act - execute immediate to_be_less_than_block('number', '2.0', '1.99'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_interval_ym_greater is - begin - --Act - execute immediate to_be_less_than_block('interval year to month', '''2-1''', '''2-0'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_interval_ds_greater is - begin - --Act - execute immediate to_be_less_than_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_greater is - begin - --Act - execute immediate to_be_less_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_tz_greater is - begin - --Act - execute immediate to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_ltz_greater is - begin - --Act - execute immediate to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_date_equal is - begin - --Act - execute immediate to_be_less_than_block('date', 'sysdate', 'sysdate'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_number_equal is - begin - --Act - execute immediate to_be_less_than_block('number', '2.0', '2.00'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_interval_ym_equal is - begin - --Act - execute immediate to_be_less_than_block('interval year to month', '''2-1''', '''2-1'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_interval_ds_equal is - begin - --Act - execute immediate to_be_less_than_block('interval day to second', '''2 01:00:00''', '''2 01:00:00'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_equal is - begin - --Act - execute immediate to_be_less_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_tz_equal is - begin - --Act - execute immediate to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_timestamp_ltz_equal is - begin - --Act - execute immediate to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure actual_date_less is - begin - --Act - execute immediate to_be_less_than_block('date', 'sysdate-1', 'sysdate'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_number_less is - begin - --Act - execute immediate to_be_less_than_block('number', '1.0', '1.01'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_interval_ym_less is - begin - --Act - execute immediate to_be_less_than_block('interval year to month', '''2-1''', '''2-2'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_interval_ds_less is - begin - --Act - execute immediate to_be_less_than_block('interval day to second', '''2 00:59:58''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_less is - begin - --Act - execute immediate to_be_less_than_block('timestamp', 'to_timestamp(''1997 12'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_tz_less is - begin - --Act - execute immediate to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_timestamp_ltz_less is - begin - --Act - execute immediate to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure not_actual_date_greater is - begin - --Act - execute immediate not_to_be_less_than_block('date', 'sysdate', 'sysdate-1'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure not_actual_number_greater is - begin - --Act - execute immediate not_to_be_less_than_block('number', '2.0', '1.99'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure not_actual_interval_ym_greater is - begin - --Act - execute immediate not_to_be_less_than_block('interval year to month', '''2-1''', '''2-0'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure not_actual_interval_ds_greater is - begin - --Act - execute immediate not_to_be_less_than_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure not_actual_timestamp_greater is - begin - --Act - execute immediate not_to_be_less_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure not_actual_timestamp_tz_gretr is - begin - --Act - execute immediate not_to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure not_actual_timestamp_ltz_gretr is - begin - --Act - execute immediate not_to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure actual_clob is - begin - --Act - ut3.ut.expect(to_clob('3')).to_( ut3.be_less_than(4) ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - -end; -/ diff --git a/test/core/expectations/binary/test_expect_to_be_less_than.pks b/test/core/expectations/binary/test_expect_to_be_less_than.pks deleted file mode 100644 index 67e6b8776..000000000 --- a/test/core/expectations/binary/test_expect_to_be_less_than.pks +++ /dev/null @@ -1,97 +0,0 @@ -create or replace package test_expect_to_be_less_than is - - --%suite((not)to_be_less_than) - --%suitepath(utplsql.core.expectations.binary) - - --%aftereach - procedure cleanup_expectations; - - --%test(Gives failure when actual date is greater than expected) - procedure actual_date_greater; - - --%test(Gives failure when actual number is greater than expected) - procedure actual_number_greater; - - --%test(Gives failure when actual interval year to month is greater than expected) - procedure actual_interval_ym_greater; - - --%test(Gives failure when actual interval day to second is greater than expected) - procedure actual_interval_ds_greater; - - --%test(Gives failure when actual timestamp is greater than expected) - procedure actual_timestamp_greater; - - --%test(Gives failure when actual timestamp with time zone is greater than expected) - procedure actual_timestamp_tz_greater; - - --%test(Gives failure when actual timestamp with local time zone is greater than expected) - procedure actual_timestamp_ltz_greater; - - --%test(Gives failure when actual date is equal expected) - procedure actual_date_equal; - - --%test(Gives failure when actual number is equal expected) - procedure actual_number_equal; - - --%test(Gives failure when actual interval year to month is equal expected) - procedure actual_interval_ym_equal; - - --%test(Gives failure when actual interval day to second is equal expected) - procedure actual_interval_ds_equal; - - --%test(Gives failure when actual timestamp is equal expected) - procedure actual_timestamp_equal; - - --%test(Gives failure when actual timestamp with time zone is equal expected) - procedure actual_timestamp_tz_equal; - - --%test(Gives failure when actual timestamp with local time zone is equal expected) - procedure actual_timestamp_ltz_equal; - - --%test(Gives success when actual date is less than expected) - procedure actual_date_less; - - --%test(Gives success when actual number is less than expected) - procedure actual_number_less; - - --%test(Gives success when actual interval year to month is less than expected) - procedure actual_interval_ym_less; - - --%test(Gives success when actual interval day to second is less than expected) - procedure actual_interval_ds_less; - - --%test(Gives success when actual timestamp is less than expected) - procedure actual_timestamp_less; - - --%test(Gives success when actual timestamp with time zone is less than expected) - procedure actual_timestamp_tz_less; - - --%test(Gives success when actual timestamp with local time zone is less than expected) - procedure actual_timestamp_ltz_less; - - --%test(Negated - Gives success when actual date is greater than expected) - procedure not_actual_date_greater; - - --%test(Negated - Gives success when actual number is greater than expected) - procedure not_actual_number_greater; - - --%test(Negated - Gives success when actual interval year to month is greater than expected) - procedure not_actual_interval_ym_greater; - - --%test(Negated - Gives success when actual interval day to second is greater than expected) - procedure not_actual_interval_ds_greater; - - --%test(Negated - Gives success when actual timestamp is greater than expected) - procedure not_actual_timestamp_greater; - - --%test(Negated - Gives success when actual timestamp with time zone is greater than expected) - procedure not_actual_timestamp_tz_gretr; - - --%test(Negated - Gives success when actual timestamp with local time zone is greater than expected) - procedure not_actual_timestamp_ltz_gretr; - - --%test(Gives failure when running against CLOB) - procedure actual_clob; - -end; -/ diff --git a/test/core/expectations/test_expectation_anydata.pkb b/test/core/expectations/test_expectation_anydata.pkb deleted file mode 100644 index 0b3a93261..000000000 --- a/test/core/expectations/test_expectation_anydata.pkb +++ /dev/null @@ -1,974 +0,0 @@ -create or replace package body test_expectation_anydata is - - g_test_expected anydata; - g_test_actual anydata; - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - procedure cleanup is - begin - g_test_expected := null; - g_test_actual := null; - cleanup_expectations(); - end; - - procedure fail_on_different_type_null is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - g_test_expected := anydata.convertObject( cast(null as test_dummy_object) ); - g_test_actual := anydata.convertObject( cast(null as other_dummy_object) ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - l_expected_message := q'[%Actual (ut3_tester.other_dummy_object) cannot be compared to Expected (ut3_tester.test_dummy_object) using matcher 'equal'.]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure fail_on_different_type is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - g_test_expected := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - g_test_actual := anydata.convertObject( other_dummy_object(1, 'A', '0') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - l_expected_message := q'[%Actual (ut3_tester.other_dummy_object) cannot be compared to Expected (ut3_tester.test_dummy_object) using matcher 'equal'.]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure fail_on_different_object_data is - begin - --Arrange - g_test_expected := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - g_test_actual := anydata.convertObject( test_dummy_object(1, null, '0') ); - --Act - ut3.ut.expect( g_test_actual ).not_to_equal( g_test_expected ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_on_one_object_null is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - g_test_expected := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - g_test_actual := anydata.convertObject( cast(null as test_dummy_object) ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - l_expected_message := q'[%Actual: ut3_tester.test_dummy_object was expected to equal: ut3_tester.test_dummy_object -%Diff: -%Rows: [ 1 differences ] -%Row No. 1 - Missing: 1A0]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - - end; - - procedure fail_on_collection_vs_object is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - g_test_expected := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - g_test_actual := anydata.convertCollection( test_dummy_object_list(test_dummy_object(1, 'A', '0')) ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - l_expected_message := q'[%Actual (ut3_tester.test_dummy_object_list) cannot be compared to Expected (ut3_tester.test_dummy_object) using matcher 'equal'.]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure fail_on_null_vs_empty_coll is - l_null_list test_dummy_object_list; - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - g_test_expected := anydata.convertCollection( test_dummy_object_list() ); - g_test_actual := anydata.convertCollection( l_null_list ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - l_expected_message := q'[%Actual: ut3_tester.test_dummy_object_list [ count = ] was expected to equal: ut3_tester.test_dummy_object_list [ count = 0 ] -%Diff: -%Rows: [ all different ] -%All rows are different as the columns position is not matching.]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - - end; - - procedure fail_on_one_collection_null is - l_null_list test_dummy_object_list; - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - g_test_expected := anydata.convertCollection( test_dummy_object_list(test_dummy_object(1, 'A', '0')) ); - g_test_actual := anydata.convertCollection( l_null_list ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - l_expected_message := q'[%Actual: ut3_tester.test_dummy_object_list [ count = ] was expected to equal: ut3_tester.test_dummy_object_list [ count = 1 ] -%Diff: -%Rows: [ 1 differences ] -%Row No. 1 - Missing: 1A0]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure fail_on_one_collection_empty is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - g_test_expected := anydata.convertCollection( test_dummy_object_list(test_dummy_object(1, 'A', '0')) ); - g_test_actual := anydata.convertCollection( test_dummy_object_list() ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - l_expected_message := q'[%Actual: ut3_tester.test_dummy_object_list [ count = 0 ] was expected to equal: ut3_tester.test_dummy_object_list [ count = 1 ] -%Diff: -%Rows: [ 1 differences ] -%Row No. 1 - Missing: 1A0]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - - end; - - procedure fail_on_different_coll_data is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - l_obj test_dummy_object := test_dummy_object(1, 'A', '0'); - begin - --Arrange - g_test_expected := anydata.convertCollection( test_dummy_object_list(l_obj) ); - g_test_actual := anydata.convertCollection( test_dummy_object_list(l_obj, l_obj) ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - l_expected_message := q'[%Actual: ut3_tester.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester.test_dummy_object_list [ count = 1 ] -%Diff: -%Rows: [ 1 differences ] -%Row No. 2 - Extra: 1A0]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - --%test(Gives success when both anydata are NULL) - procedure success_on_both_anydata_null is - --Arrange - l_null_anydata anydata; - begin - --Act - ut3.ut.expect( l_null_anydata ).to_equal( l_null_anydata ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure success_on_both_object_null is - --Arrange - l_null_object test_dummy_object; - l_anydata anydata := anydata.convertObject(l_null_object); - begin - --Act - ut3.ut.expect( l_anydata ).to_equal( l_anydata ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure success_on_both_coll_null is - --Arrange - l_null_collection test_dummy_object_list; - l_anydata anydata := anydata.convertCollection(l_null_collection); - begin - --Act - ut3.ut.expect( l_anydata ).to_equal( l_anydata ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure success_on_same_coll_data is - begin - --Arrange - g_test_expected := anydata.convertCollection( test_dummy_object_list(test_dummy_object(1, 'A', '0')) ); - g_test_actual := anydata.convertCollection( test_dummy_object_list(test_dummy_object(1, 'A', '0')) ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_on_coll_different_order is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - l_first_obj test_dummy_object := test_dummy_object(1, 'A', '0'); - l_second_obj test_dummy_object := test_dummy_object(2, 'b', '1'); - begin - --Arrange - g_test_expected := anydata.convertCollection( test_dummy_object_list(l_first_obj, l_second_obj) ); - g_test_actual := anydata.convertCollection( test_dummy_object_list(l_second_obj, l_first_obj) ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure success_on_same_object_data is - begin - --Arrange - g_test_expected := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - g_test_actual := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure exclude_attributes_as_list is - l_list ut3.ut_varchar2_list; - begin - --Arrange - l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','/TEST_DUMMY_OBJECT/ID'); - g_test_expected := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); - g_test_actual := anydata.convertObject( test_dummy_object(id=>3, "name"=>'A',"Value"=>'1') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_list ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure exclude_attributes_as_csv is - l_list varchar2(100); - begin - --Arrange - l_list := 'TEST_DUMMY_OBJECT/Value,TEST_DUMMY_OBJECT/ID'; - g_test_expected := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); - g_test_actual := anydata.convertObject( test_dummy_object(id=>2, "name"=>'A',"Value"=>'1') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_list ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure exclude_attributes_xpath is - l_xpath varchar2(100); - begin - --Arrange - l_xpath := '//TEST_DUMMY_OBJECT/Value|//TEST_DUMMY_OBJECT/ID'; - g_test_expected := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); - g_test_actual := anydata.convertObject( test_dummy_object(id=>2, "name"=>'A',"Value"=>'1') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_xpath ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure exclude_ignores_invalid_attrib is - l_exclude varchar2(100); - begin - --Arrange - l_exclude := 'BadAttributeName'; - g_test_expected := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); - g_test_actual := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_exclude ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure include_attributes_as_list is - l_list ut3.ut_varchar2_list; - begin - --Arrange - l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','TEST_DUMMY_OBJECT/ID'); - g_test_expected := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); - g_test_actual := anydata.convertObject( test_dummy_object(id=>1, "name"=>'b',"Value"=>'0') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_list ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure include_attributes_as_csv is - l_xpath varchar2(100); - begin - --Arrange - l_xpath := 'TEST_DUMMY_OBJECT/key,TEST_DUMMY_OBJECT/ID'; - g_test_expected := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); - g_test_actual := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_xpath ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure include_attributes_xpath is - l_xpath varchar2(100); - begin - --Arrange - l_xpath := '//TEST_DUMMY_OBJECT/key|//TEST_DUMMY_OBJECT/ID'; - g_test_expected := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); - g_test_actual := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_xpath ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure include_ignores_invalid_attrib is - l_include varchar2(100); - begin - --Arrange - l_include := ' BadAttributeName, TEST_DUMMY_OBJECT/ID '; - g_test_expected := anydata.convertObject( test_dummy_object(id=>1, "name"=>'B',"Value"=>'0') ); - g_test_actual := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_include ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure include_exclude_attributes_csv is - l_exclude varchar2(100); - l_include varchar2(100); - begin - --Arrange - l_include := 'TEST_DUMMY_OBJECT/key,TEST_DUMMY_OBJECT/ID,TEST_DUMMY_OBJECT/Value'; - l_exclude := '//TEST_DUMMY_OBJECT/key|//TEST_DUMMY_OBJECT/Value'; - g_test_expected := anydata.convertObject( test_dummy_object(id=>1, "name"=>'B',"Value"=>'0') ); - g_test_actual := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).exclude( l_exclude ).include( l_include ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure include_exclude_attrib_list is - l_exclude ut3.ut_varchar2_list; - l_include ut3.ut_varchar2_list; - l_expected varchar2(32767); - l_actual varchar2(32767); - begin - --Arrange - l_include := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/key','TEST_DUMMY_OBJECT/ID','TEST_DUMMY_OBJECT/Value'); - l_exclude := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/key','TEST_DUMMY_OBJECT/Value'); - g_test_expected := anydata.convertObject( test_dummy_object(id=>1, "name"=>'B',"Value"=>'0') ); - g_test_actual := anydata.convertObject( test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).exclude( l_exclude ).include( l_include ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure reports_diff_attribute is - l_expected varchar2(32767); - l_actual varchar2(32767); - begin - --Arrange - g_test_expected := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - g_test_actual := anydata.convertObject( test_dummy_object(1, NULL, '0') ); - l_expected := q'[Actual: ut3_tester.test_dummy_object was expected to equal: ut3_tester.test_dummy_object -Diff: -Rows: [ 1 differences ] - Row No. 1 - Actual: - Row No. 1 - Expected: A]'; - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - l_actual := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - ut.expect(l_actual).to_be_like(l_expected); - end; - - - procedure reports_diff_structure is - l_obj test_dummy_object := test_dummy_object(1, 'A', '0'); - l_expected varchar2(32767); - l_actual varchar2(32767); - begin - --Arrange - g_test_expected := anydata.convertCollection( test_dummy_object_list(l_obj) ); - g_test_actual := anydata.convertCollection( test_dummy_object_list(l_obj, l_obj) ); - l_expected := q'[Actual: ut3_tester.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester.test_dummy_object_list [ count = 1 ] -Diff: -Rows: [ 1 differences ] - Row No. 2 - Extra: 1A0]'; - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - --Assert - l_actual := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - ut.expect(l_actual).to_be_like(l_expected); - end; - - function get_anydata return anydata is - begin - return anydata.convertObject( test_dummy_object(1, 'B', '0') ); - end; - - procedure deprec_to_equal_excl_varch is - begin - --Act - ut3.ut.expect(get_anydata()).to_equal(get_anydata(), a_exclude => 'A_COLUMN,Some_Col'); - --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); - end; - - procedure deprec_to_equal_excl_list is - begin - --Act - ut3.ut.expect(get_anydata()).to_equal(get_anydata(), a_exclude => ut3.ut_varchar2_list('A_COLUMN','Some_Col')); - --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); - end; - - procedure deprec_not_to_equal_excl_varch is - begin - --Act - ut3.ut.expect(get_anydata()).not_to_equal(get_anydata(), a_exclude => 'A_COLUMN,Some_Col'); - --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); - end; - - procedure deprec_not_to_equal_excl_list is - begin - --Act - ut3.ut.expect(get_anydata()).not_to_equal(get_anydata(), a_exclude => ut3.ut_varchar2_list('A_COLUMN','Some_Col')); - --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); - end; - - procedure deprec_equal_excl_varch is - begin - --Act - ut3.ut.expect(get_anydata()).to_(ut3.equal(get_anydata(), a_exclude => 'A_COLUMN,Some_Col')); - --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); - end; - - procedure deprec_equal_excl_list is - begin - --Act - ut3.ut.expect(get_anydata()).to_(ut3.equal(get_anydata(), a_exclude => ut3.ut_varchar2_list('A_COLUMN','Some_Col'))); - --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); - end; - - procedure data_diff_on_atr_data_mismatch is - l_actual test_dummy_object_list; - l_expected test_dummy_object_list; - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_actual - from dual connect by level <=2; - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=2 - order by rownum desc; - --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - l_expected_message := q'[Actual: ut3_tester.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester.test_dummy_object_list [ count = 2 ] -Diff: -Rows: [ 2 differences ] - Row No. 1 - Actual: 1Something 11 - Row No. 1 - Expected: 2Something 22 - Row No. 2 - Actual: 2Something 22 - Row No. 2 - Expected: 1Something 11]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure data_diff_on_20_rows_only is - l_actual test_dummy_object_list; - l_expected test_dummy_object_list; - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - select test_dummy_object( rn, 'Something '||rn, rn1) - bulk collect into l_actual - from (select rownum * case when mod(rownum,2) = 0 then -1 else 1 end rn, - rownum * case when mod(rownum,4) = 0 then -1 else 1 end rn1 - from dual connect by level <=100); - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=110; - --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - - l_expected_message := q'[Actual: ut3_tester.test_dummy_object_list [ count = 100 ] was expected to equal: ut3_tester.test_dummy_object_list [ count = 110 ] -Diff: -Rows: [ 60 differences, showing first 20 ] - Row No. 2 - Actual: -2Something -2 - Row No. 2 - Expected: 2Something 2 - Row No. 4 - Actual: -4Something -4-4 - Row No. 4 - Expected: 4Something 44 - % - Row No. 38 - Actual: -38Something -38 - Row No. 38 - Expected: 38Something 38 - Row No. 40 - Actual: -40Something -40-40 - Row No. 40 - Expected: 40Something 4040]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure collection_include_list is - l_actual test_dummy_object_list; - l_expected test_dummy_object_list; - l_list ut3.ut_varchar2_list; - begin - l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','TEST_DUMMY_OBJECT/ID'); - --Arrange - select test_dummy_object( rownum, 'SomethingsDifferent '||rownum, rownum) - bulk collect into l_actual - from dual connect by level <=2; - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=2; - --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).include( l_list ); - - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure collection_exclude_list is - l_actual test_dummy_object_list; - l_expected test_dummy_object_list; - l_list ut3.ut_varchar2_list; - begin - l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','TEST_DUMMY_OBJECT/ID'); - --Arrange - select test_dummy_object( rownum*2, 'Something '||rownum, rownum*2) - bulk collect into l_actual - from dual connect by level <=2; - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=2; - --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).exclude( l_list ); - - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure collection_include_list_fail is - l_actual test_dummy_object_list; - l_expected test_dummy_object_list; - l_list ut3.ut_varchar2_list; - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/name'); - --Arrange - select test_dummy_object( rownum, 'SomethingsDifferent '||rownum, rownum) - bulk collect into l_actual - from dual connect by level <=2; - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=2; - --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).include( l_list ); - - l_expected_message := q'[%Actual: ut3_tester.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester.test_dummy_object_list [ count = 2 ] -%Diff: -%Rows: [ 2 differences ] -%All rows are different as the columns are not matching.]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure array_same_data is - begin - --Arrange - g_test_expected := anydata.convertCollection( t_tab_varchar('A') ); - g_test_actual := anydata.convertCollection( t_tab_varchar('A') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure array_diff_data is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - g_test_expected := anydata.convertCollection( t_tab_varchar('A') ); - g_test_actual := anydata.convertCollection( t_tab_varchar('B') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - l_expected_message := q'[%Actual: ut3_tester.t_tab_varchar [ count = 1 ] was expected to equal: ut3_tester.t_tab_varchar [ count = 1 ] -%Diff: -%Rows: [ 1 differences ] -%Row No. 1 - Actual: B -%Row No. 1 - Expected: A]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure array_is_null is - l_is_null t_tab_varchar ; - begin - ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_be_null; - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure array_null_equal_array_null is - l_is_null t_tab_varchar ; - l_is_null_bis t_tab_varchar ; - begin - ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_equal(anydata.convertCollection( l_is_null_bis )); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure array_null_equal_array_notnull is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - l_is_null t_tab_varchar ; - begin - --Arrange - g_test_expected := anydata.convertCollection( l_is_null ); - g_test_actual := anydata.convertCollection( t_tab_varchar('A') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - l_expected_message := q'[%Actual: ut3_tester.t_tab_varchar [ count = 1 ] was expected to equal: ut3_tester.t_tab_varchar [ count = ] -%Diff: -%Rows: [ 1 differences ] -%Row No. 1 - Extra: A]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure empty_array_have_zero_elem is - begin - ut3.ut.expect( anydata.convertCollection(t_tab_varchar())).to_have_count(0); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure array_empty_equal_array_empty is - begin - --Arrange - g_test_expected := anydata.convertCollection(t_tab_varchar()); - g_test_actual := anydata.convertCollection(t_tab_varchar()); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure arr_empty_equal_arr_notempty is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - l_is_null t_tab_varchar ; - begin - --Arrange - g_test_expected := anydata.convertCollection( t_tab_varchar() ); - g_test_actual := anydata.convertCollection( t_tab_varchar('A') ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - l_expected_message := q'[%Actual: ut3_tester.t_tab_varchar [ count = 1 ] was expected to equal: ut3_tester.t_tab_varchar [ count = 0 ] -%Diff: -%Rows: [ 1 differences ] -%Row No. 1 - Extra: A]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure collection_is_null is - l_null_list test_dummy_object_list; - begin - --Arrange - g_test_actual := anydata.convertCollection( l_null_list ); - --Act - ut3.ut.expect( g_test_actual ).to_be_null; - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure collection_is_empty is - begin - --Arrange - g_test_actual := anydata.convertCollection( test_dummy_object_list() ); - --Act - ut3.ut.expect( g_test_actual ).to_have_count(0); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - - end; - - procedure varray_same_data is - begin - --Arrange - g_test_expected := anydata.convertCollection( t_varray(1) ); - g_test_actual := anydata.convertCollection( t_varray(1) ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure varray_diff_data is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - g_test_expected := anydata.convertCollection( t_varray(1) ); - g_test_actual := anydata.convertCollection( t_varray(2) ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - l_expected_message := q'[%Actual: ut3_tester.t_varray [ count = 1 ] was expected to equal: ut3_tester.t_varray [ count = 1 ] -%Diff: -%Rows: [ 1 differences ] -%Row No. 1 - Actual: 2 -%Row No. 1 - Expected: 1]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure varray_is_null is - l_is_null t_varray ; - begin - ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_be_null; - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure varray_null_equal_varray_null is - l_is_null t_varray ; - l_is_null_bis t_varray ; - begin - ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_equal(anydata.convertCollection( l_is_null_bis )); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure varr_null_equal_varr_notnull is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - l_is_null t_varray ; - begin - --Arrange - g_test_expected := anydata.convertCollection( l_is_null ); - g_test_actual := anydata.convertCollection( t_varray(1) ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - l_expected_message := q'[%Actual: ut3_tester.t_varray [ count = 1 ] was expected to equal: ut3_tester.t_varray [ count = ] -%Diff: -%Rows: [ 1 differences ] -%Row No. 1 - Extra: 1]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure empty_varray_have_zero_elem is - begin - ut3.ut.expect( anydata.convertCollection(t_varray())).to_have_count(0); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure varr_empty_equal_varr_empty is - begin - --Arrange - g_test_expected := anydata.convertCollection(t_varray()); - g_test_actual := anydata.convertCollection(t_varray()); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure varr_empty_equal_varr_notempty is - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - l_is_null t_varray ; - begin - --Arrange - g_test_expected := anydata.convertCollection( t_varray() ); - g_test_actual := anydata.convertCollection( t_varray(1) ); - --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - l_expected_message := q'[%Actual: ut3_tester.t_varray [ count = 1 ] was expected to equal: ut3_tester.t_varray [ count = 0 ] -%Diff: -%Rows: [ 1 differences ] -%Row No. 1 - Extra: 1]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure collection_join_by is - l_actual test_dummy_object_list; - l_expected test_dummy_object_list; - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_actual - from dual connect by level <=2; - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=2 - order by rownum desc; - --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).join_by('TEST_DUMMY_OBJECT/ID'); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure collection_join_by_fail is - l_actual test_dummy_object_list; - l_expected test_dummy_object_list; - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_actual - from dual connect by level <=2; - select test_dummy_object( rownum * 2, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=2 - order by rownum desc; - --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).join_by('TEST_DUMMY_OBJECT/ID'); - l_expected_message := q'[%Actual: ut3_tester.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester.test_dummy_object_list [ count = 2 ] -%Diff: -%Rows: [ 3 differences ] -%PK 2 - Actual: Something 2 -%PK 2 - Actual: 2 -%PK 2 - Expected: Something 1 -%PK 2 - Expected: 1 -%PK 1 - Extra: 1Something 11 -%PK 4 - Missing: 4Something 22]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure collection_unordered is - l_actual test_dummy_object_list; - l_expected test_dummy_object_list; - begin - --Arrange - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_actual - from dual connect by level <=3; - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=3 - order by rownum desc; - --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).unordered; - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure collection_unordered_fail is - l_actual test_dummy_object_list; - l_expected test_dummy_object_list; - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_actual - from dual connect by level <=2; - select test_dummy_object( rownum * 2, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=2 - order by rownum desc; - - l_expected_message := q'[%Actual: ut3_tester.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester.test_dummy_object_list [ count = 2 ] -%Diff: -%Rows: [ 4 differences ] -%Extra: 1Something 11 -%Extra: 2Something 22 -%Missing: 4Something 22 -%Missing: 2Something 11]'; - - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).unordered; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure object_join_by is - begin - --Arrange - g_test_expected := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - g_test_actual := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - - --Act - ut3.ut.expect(g_test_actual).to_equal(g_test_expected).join_by('TEST_DUMMY_OBJECT/ID'); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure object_unordered is - begin - g_test_expected := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - g_test_actual := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - - --Act - ut3.ut.expect(g_test_actual).to_equal(g_test_expected).unordered; - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure collection_to_contain is - l_actual test_dummy_object_list; - l_expected test_dummy_object_list; - begin - --Arrange - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_actual - from dual connect by level <=4; - select test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=2 - order by rownum desc; - --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_contain(anydata.convertCollection(l_expected)); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure object_to_contain is - begin - --Arrange - g_test_expected := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - g_test_actual := anydata.convertObject( test_dummy_object(1, 'A', '0') ); - - --Act - ut3.ut.expect(g_test_actual).to_contain(g_test_expected); - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - -end; -/ \ No newline at end of file diff --git a/test/core/expectations/test_expectation_anydata.pks b/test/core/expectations/test_expectation_anydata.pks deleted file mode 100644 index b9fbda93b..000000000 --- a/test/core/expectations/test_expectation_anydata.pks +++ /dev/null @@ -1,202 +0,0 @@ -create or replace package test_expectation_anydata is - - --%suite(equal on anydata) - --%suitepath(utplsql.core.expectations) - - --%aftereach - procedure cleanup; - - --%test(Gives failure when comparing NULL objects of different type) - procedure fail_on_different_type_null; - - --%test(Gives failure when comparing objects of different type) - procedure fail_on_different_type; - - --%test(Gives failure when objects holds different data) - procedure fail_on_different_object_data; - - --%test(Gives failure when one of objects is NULL) - procedure fail_on_one_object_null; - - --%test(Gives failure when comparing object to collection) - procedure fail_on_collection_vs_object; - - --%test(Gives failure when comparing empty collection to NULL collection) - procedure fail_on_null_vs_empty_coll; - - --%test(Gives failure when one of collections is NULL) - procedure fail_on_one_collection_null; - - --%test(Gives failure when one of collections is empty) - procedure fail_on_one_collection_empty; - - --%test(Gives failure when collections holds different data) - procedure fail_on_different_coll_data; - - --%test(Gives success when both anydata are NULL) - procedure success_on_both_anydata_null; - - --%test(Gives success when both objects are null) - procedure success_on_both_object_null; - - --%test(Gives success when both collections are null) - procedure success_on_both_coll_null; - - --%test(Gives success when both collections are of same type contain identical data) - procedure success_on_same_coll_data; - - --%test(Gives failure when both collections contain the same data in different order) - procedure fail_on_coll_different_order; - - --%test(Gives success when both objects are of same type and hold the same data) - procedure success_on_same_object_data; - - --%test(List of attributes to exclude is case sensitive) - procedure exclude_attributes_as_list; - - --%test(Comma separated list of attributes to exclude is case sensitive) - procedure exclude_attributes_as_csv; - - --%test(Exclude attributes by XPath is case sensitive) - procedure exclude_attributes_xpath; - - --%test(Excludes existing attributes when some of attributes on exclude are not valid column names) - procedure exclude_ignores_invalid_attrib; - - --%test(List of attributes to include is case sensitive) - procedure include_attributes_as_list; - - --%test(Comma separated list of attributes to include is case sensitive) - procedure include_attributes_as_csv; - - --%test(Include attributes by XPath is case sensitive) - procedure include_attributes_xpath; - - --%test(Includes existing attributes when some of attributes on exclude are not valid column names) - procedure include_ignores_invalid_attrib; - - --%test(Includes only attributes that are not excluded) - procedure include_exclude_attributes_csv; - - --%test(Includes only attributes that are not on exclude list) - procedure include_exclude_attrib_list; - - --%test(Reports diff on incorrect attributes of an object type) - procedure reports_diff_attribute; - - --%test(Reports diff on incorrect rows and attributes of a collection type) - procedure reports_diff_structure; - - --%test(Adds a warning when using depreciated syntax to_equal( a_expected anydata, a_exclude varchar2 )) - procedure deprec_to_equal_excl_varch; - - --%test(Adds a warning when using depreciated syntax to_equal( a_expected anydata, a_exclude ut_varchar2_list )) - procedure deprec_to_equal_excl_list; - - --%test(Adds a warning when using depreciated syntax not_to_equal( a_expected anydata, a_exclude varchar2 )) - procedure deprec_not_to_equal_excl_varch; - - --%test(Adds a warning when using depreciated syntax not_to_equal( a_expected anydata, a_exclude ut_varchar2_list )) - procedure deprec_not_to_equal_excl_list; - - --%test(Adds a warning when using depreciated syntax to_( equal( a_expected anydata, a_exclude varchar2 ) )) - procedure deprec_equal_excl_varch; - - --%test(Adds a warning when using depreciated syntax to_( equal( a_expected anydata, a_exclude ut_varchar2_list )) ) - procedure deprec_equal_excl_list; - - --%test(Reports only mismatched attributes on row data mismatch) - procedure data_diff_on_atr_data_mismatch; - - --%test(Reports only first 20 rows of diff and gives a full diff count) - procedure data_diff_on_20_rows_only; - - --%test(Validate include list on collections of objects) - procedure collection_include_list; - - --%test(Validate exclude list on collections of objects) - procedure collection_exclude_list; - - --%test(Validate include list on collections of objects fail) - procedure collection_include_list_fail; - - --%test(Two ARRAYS with same data) - procedure array_same_data; - - --%test(Two ARRAYS with different data) - procedure array_diff_data; - - --%test(ARRAY is atomically null) - procedure array_is_null; - - --%test(Compare two null ARRAYs) - procedure array_null_equal_array_null; - - --%test(Compare null ARRAY to ARRAY with data) - procedure array_null_equal_array_notnull; - - --%test(Empty ARRAY have count of 0) - procedure empty_array_have_zero_elem; - - --%test(Compare two empty ARRAYs) - procedure array_empty_equal_array_empty; - - --%test(Compare empty ARRAY to ARRAY with data) - procedure arr_empty_equal_arr_notempty; - - --%test(Collection is atomically NULL) - procedure collection_is_null; - - --%test(Collection is empty) - procedure collection_is_empty; - - --%test(Two VARRAYS with same data) - procedure varray_same_data; - - --%test(Two VARRAYS with different data) - procedure varray_diff_data; - - --%test(VARRAY is atomically null) - procedure varray_is_null; - - --%test(Compare two null VARRAYs) - procedure varray_null_equal_varray_null; - - --%test(Compare null VARRAY to VARRAY with data) - procedure varr_null_equal_varr_notnull; - - --%test(Empty VARRAY have count of 0) - procedure empty_varray_have_zero_elem; - - --%test(Compare two empty VARRAYs) - procedure varr_empty_equal_varr_empty; - - --%test(Compare empty VARRAY to VARRAY with data) - procedure varr_empty_equal_varr_notempty; - - --%test( Anydata collection using joinby ) - procedure collection_join_by; - - --%test( Anydata collection using joinby fail) - procedure collection_join_by_fail; - - --%test( Anydata collection unordered ) - procedure collection_unordered; - - --%test( Anydata collection unordered fail ) - procedure collection_unordered_fail; - - --%test( Anydata object using joinby ) - procedure object_join_by; - - --%test( Anydata object unordered ) - procedure object_unordered; - - --%test( Success when anydata collection contains data from another anydata collection) - procedure collection_to_contain; - - --%test( Success when anydata object contains data from another anydata) - procedure object_to_contain; - -end; -/ diff --git a/test/core/expectations/test_expectation_processor.pkb b/test/core/expectations/test_expectation_processor.pkb deleted file mode 100644 index 17ffbec3c..000000000 --- a/test/core/expectations/test_expectation_processor.pkb +++ /dev/null @@ -1,71 +0,0 @@ -create or replace package body test_expectation_processor is - - procedure who_called_expectation is - l_stack_trace varchar2(4000); - l_source_line varchar2(4000); - begin - l_stack_trace := q'[----- PL/SQL Call Stack ----- - object line object - handle number name -34f88e4420 124 package body SCH_TEST.UT_EXPECTATION_PROCESSOR -353dfeb2f8 26 SCH_TEST.UT_EXPECTATION_RESULT -cba249ce0 112 SCH_TEST.UT_EXPECTATION -3539881cf0 21 SCH_TEST.UT_EXPECTATION_NUMBER -351a608008 28 package body SCH_TEST.TPKG_PRIOR_YEAR_GENERATION -351a6862b8 6 anonymous block -351fe31010 1825 package body SYS.DBMS_SQL -20befbe4d8 129 SCH_TEST.UT_EXECUTABLE -20befbe4d8 65 SCH_TEST.UT_EXECUTABLE -34f8ab7cd8 80 SCH_TEST.UT_TEST -34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM -34f8ab9b10 74 SCH_TEST.UT_SUITE -34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM -cba24bfd0 75 SCH_TEST.UT_LOGICAL_SUITE -353dfecf30 59 SCH_TEST.UT_RUN -34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM -357f5421e8 77 package body SCH_TEST.UT_RUNNER -357f5421e8 111 package body SCH_TEST.UT_RUNNER -20be951ab0 292 package body SCH_TEST.UT -20be951ab0 320 package body SCH_TEST.UT -]'; - ut.expect( - ut3.ut_expectation_processor.who_called_expectation(l_stack_trace) - ).to_be_like('at "SCH_TEST.TPKG_PRIOR_YEAR_GENERATION", line 28 %'); - end; - - - procedure who_called_expectation_0x is - l_stack_trace varchar2(4000); - l_source_line varchar2(4000); - begin - l_stack_trace := q'[----- PL/SQL Call Stack ----- - object line object - handle number name -34f88e4420 124 package body SCH_TEST.UT_EXPECTATION_PROCESSOR -353dfeb2f8 26 SCH_TEST.UT_EXPECTATION_RESULT -cba249ce0 112 SCH_TEST.UT_EXPECTATION -3539881cf0 21 SCH_TEST.UT_EXPECTATION_NUMBER -351a608008 28 package body SCH_TEST.TPKG_PRIOR_YEAR_GENERATION -351a6862b8 6 anonymous block -351fe31010 1825 package body SYS.DBMS_SQL -20befbe4d8 129 SCH_TEST.UT_EXECUTABLE -20befbe4d8 65 SCH_TEST.UT_EXECUTABLE -34f8ab7cd8 80 SCH_TEST.UT_TEST -34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM -34f8ab9b10 74 SCH_TEST.UT_SUITE -34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM -cba24bfd0 75 SCH_TEST.UT_LOGICAL_SUITE -353dfecf30 59 SCH_TEST.UT_RUN -34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM -357f5421e8 77 package body SCH_TEST.UT_RUNNER -357f5421e8 111 package body SCH_TEST.UT_RUNNER -20be951ab0 292 package body SCH_TEST.UT -20be951ab0 320 package body SCH_TEST.UT -]'; - ut.expect( - ut3.ut_expectation_processor.who_called_expectation(l_stack_trace) - ).to_be_like('at "SCH_TEST.TPKG_PRIOR_YEAR_GENERATION", line 28 %'); - end; - -end; -/ diff --git a/test/core/expectations/test_expectation_processor.pks b/test/core/expectations/test_expectation_processor.pks deleted file mode 100644 index ecde48153..000000000 --- a/test/core/expectations/test_expectation_processor.pks +++ /dev/null @@ -1,17 +0,0 @@ -create or replace package test_expectation_processor is - - --%suite(expectation_processor) - --%suitepath(utplsql.core.expectations) - - --%context(who_called_expectation) - - --%test(parses stack trace and returns object and line that called expectation) - procedure who_called_expectation; - - --%test(parses stack trace containing 0x and returns object and line that called expectation) - procedure who_called_expectation_0x; - - --%endcontext - -end; -/ diff --git a/test/core/expectations/test_matchers.pkb b/test/core/expectations/test_matchers.pkb deleted file mode 100644 index 1a15986b9..000000000 --- a/test/core/expectations/test_matchers.pkb +++ /dev/null @@ -1,270 +0,0 @@ -create or replace package body test_matchers is - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - procedure exec_matcher(a_type varchar2, a_actual_value varchar2, a_expected_value varchar2, a_matcher varchar2, a_result integer, a_prefix varchar2 := null) is - l_statement varchar2(32767); - begin - l_statement := ' - declare - l_actual '||a_type||' := '||a_actual_value||'; - l_expected '||a_type||' := '||a_expected_value||'; - begin - ut3.ut.expect( l_actual ).'||a_prefix||'to_'||a_matcher||'( l_expected ); - end;'; - execute immediate l_statement; - if a_result = ut3.ut_utils.gc_success then - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - else - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end if; - cleanup_expectations(); - end exec_matcher; - - procedure exec_be_between(a_type varchar2, a_actual_value varchar2, a_expected1_value varchar2, a_expected2_value varchar2,a_result integer) is - l_statement varchar2(32767); - begin - l_statement := ' - declare - l_actual_value '||a_type||' := '||a_actual_value||'; - l_lower '||a_type||' := '||a_expected1_value||'; - l_higher '||a_type||' := '||a_expected2_value||'; - begin - ut3.ut.expect(l_actual_value).to_be_between(l_lower, l_higher); - end;'; - execute immediate l_statement; - if a_result = ut3.ut_utils.gc_success then - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - else - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end if; - cleanup_expectations(); - end exec_be_between; - - procedure exec_be_between2(a_type varchar2, a_actual_value varchar2, a_expected1_value varchar2, a_expected2_value varchar2,a_result integer, a_not_prefix varchar2 default null) is - l_statement varchar2(32767); - begin - l_statement := ' - declare - l_actual_value '||a_type||' := '||a_actual_value||'; - l_value1 '||a_type||' := '||a_expected1_value||'; - l_value2 '||a_type||' := '||a_expected2_value||'; - begin - ut3.ut.expect(l_actual_value).'||a_not_prefix||'to_be_between(l_value1, l_value2); - end;'; - execute immediate l_statement; - if a_result = ut3.ut_utils.gc_success then - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - else - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end if; - cleanup_expectations(); - end exec_be_between2; - - procedure exec_be_like(a_type varchar2, a_value varchar2, a_pattern varchar2, a_escape varchar2, a_result integer, a_prefix varchar2 default null) is - begin - execute immediate - 'declare - l_actual ' || a_type || ' := '||a_value||'; - l_pattern varchar2(32767) := :pattern; - l_escape_char varchar2(32767) := :a_escape; - l_result integer; - begin - ut3.ut.expect( l_actual ).' || a_prefix ||q'[to_be_like(l_pattern, l_escape_char); - end;]' - using a_pattern, a_escape; - if a_result = ut3.ut_utils.gc_success then - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - else - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end if; - cleanup_expectations(); - end; - procedure exec_match(a_type varchar2, a_actual_value varchar2, a_pattern varchar2, a_modifiers varchar2, a_result integer, a_not_prefix varchar2 default null) is - l_statement varchar2(32767); - begin - l_statement := - 'declare - l_actual '||a_type||' := '||a_actual_value||'; - l_pattern varchar2(32767) := :a_pattern; - l_modifiers varchar2(32767) := :a_modifiers; - l_result integer; - begin - ut3.ut.expect( l_actual ).'||a_not_prefix||'to_match(l_pattern, l_modifiers); - end;'; - execute immediate l_statement using a_pattern, a_modifiers; - if a_result = ut3.ut_utils.gc_success then - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - else - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end if; - cleanup_expectations(); - end; - - procedure test_be_between2 is - begin - - --failure when value out of range - exec_be_between2('date', 'sysdate', 'sysdate-2', 'sysdate-1', ut3.ut_utils.gc_failure, ''); - exec_be_between2('number', '2.0', '1.99', '1.999', ut3.ut_utils.gc_failure, ''); - exec_be_between2('varchar2(1)', '''c''', '''a''', '''b''', ut3.ut_utils.gc_failure, ''); - exec_be_between2('timestamp', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3.ut_utils.gc_failure, ''); - exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3.ut_utils.gc_failure, ''); - exec_be_between2('timestamp with time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3.ut_utils.gc_failure, ''); - exec_be_between2('interval year to month', '''2-2''', '''2-0''', '''2-1''', ut3.ut_utils.gc_failure, ''); - exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 00:59:59''', ut3.ut_utils.gc_failure, ''); - - --success when value in range - exec_be_between2('date', 'sysdate', 'sysdate-1', 'sysdate+1', ut3.ut_utils.gc_success, ''); - exec_be_between2('number', '2.0', '1.99', '2.01', ut3.ut_utils.gc_success, ''); - exec_be_between2('varchar2(1)', '''b''', '''a''', '''c''', ut3.ut_utils.gc_success, ''); - exec_be_between2('timestamp', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3.ut_utils.gc_success, ''); - exec_be_between2('timestamp with local time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3.ut_utils.gc_success, ''); - exec_be_between2('timestamp with time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3.ut_utils.gc_success, ''); - exec_be_between2('interval year to month', '''2-1''', '''2-0''', '''2-2''', ut3.ut_utils.gc_success, ''); - exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 01:00:01''', ut3.ut_utils.gc_success, ''); - - --success when value not in range - exec_be_between2('date', 'sysdate', 'sysdate-2', 'sysdate-1', ut3.ut_utils.gc_success, 'not_'); - exec_be_between2('number', '2.0', '1.99', '1.999', ut3.ut_utils.gc_success, 'not_'); - exec_be_between2('varchar2(1)', '''c''', '''a''', '''b''', ut3.ut_utils.gc_success, 'not_'); - exec_be_between2('timestamp', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3.ut_utils.gc_success, 'not_'); - exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3.ut_utils.gc_success, 'not_'); - exec_be_between2('timestamp with time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3.ut_utils.gc_success, 'not_'); - exec_be_between2('interval year to month', '''2-2''', '''2-0''', '''2-1''', ut3.ut_utils.gc_success, 'not_'); - exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 00:59:59''', ut3.ut_utils.gc_success, 'not_'); - - --failure when value not out of range - exec_be_between2('date', 'sysdate', 'sysdate-1', 'sysdate+1', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('number', '2.0', '1.99', '2.01', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('varchar2(1)', '''b''', '''a''', '''c''', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('timestamp', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('timestamp with local time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('timestamp with time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('interval year to month', '''2-1''', '''2-0''', '''2-2''', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 01:00:01''', ut3.ut_utils.gc_failure, 'not_'); - - --failure when value is null - exec_be_between2('date', 'null', 'sysdate-1', 'sysdate+1', ut3.ut_utils.gc_failure, ''); - exec_be_between2('number', 'null', '1.99', '2.01', ut3.ut_utils.gc_failure, ''); - exec_be_between2('varchar2(1)', 'null', '''a''', '''c''', ut3.ut_utils.gc_failure, ''); - exec_be_between2('timestamp', 'null', 'systimestamp-1', 'systimestamp+1', ut3.ut_utils.gc_failure, ''); - exec_be_between2('timestamp with local time zone', 'null', 'systimestamp-1', 'systimestamp+1', ut3.ut_utils.gc_failure, ''); - exec_be_between2('timestamp with time zone', 'null', 'systimestamp-1', 'systimestamp+1', ut3.ut_utils.gc_failure, ''); - exec_be_between2('interval year to month', 'null', '''2-0''', '''2-2''', ut3.ut_utils.gc_failure, ''); - exec_be_between2('interval day to second', 'null', '''2 00:59:58''', '''2 01:00:01''', ut3.ut_utils.gc_failure, ''); - - exec_be_between2('date', 'null', 'sysdate-2', 'sysdate-1', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('number', 'null', '1.99', '1.999', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('varchar2(1)', 'null', '''a''', '''b''', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('timestamp', 'null', 'systimestamp-1', 'systimestamp', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('timestamp with local time zone', 'null', 'systimestamp-1', 'systimestamp', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('timestamp with time zone', 'null', 'systimestamp-1', 'systimestamp', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('interval year to month', 'null', '''2-0''', '''2-1''', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('interval day to second', 'null', '''2 00:59:58''', '''2 00:59:59''', ut3.ut_utils.gc_failure, 'not_'); - - --failure when lower bound is null - exec_be_between2('date', 'sysdate', 'null', 'sysdate+1', ut3.ut_utils.gc_failure, ''); - exec_be_between2('number', '2.0', 'null', '2.01', ut3.ut_utils.gc_failure, ''); - exec_be_between2('varchar2(1)', '''b''', 'null', '''c''', ut3.ut_utils.gc_failure, ''); - exec_be_between2('timestamp', 'systimestamp', 'null', 'systimestamp+1', ut3.ut_utils.gc_failure, ''); - exec_be_between2('timestamp with local time zone', 'systimestamp', 'null', 'systimestamp+1', ut3.ut_utils.gc_failure, ''); - exec_be_between2('timestamp with time zone', 'systimestamp', 'null', 'systimestamp+1', ut3.ut_utils.gc_failure, ''); - exec_be_between2('interval year to month', '''2-1''', 'null', '''2-2''', ut3.ut_utils.gc_failure, ''); - exec_be_between2('interval day to second', '''2 01:00:00''', 'null', '''2 01:00:01''', ut3.ut_utils.gc_failure, ''); - - exec_be_between2('date', 'sysdate', 'null', 'sysdate-1', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('number', '2.0', 'null', '1.999', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('varchar2(1)', '''b''', 'null', '''b''', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('timestamp', 'systimestamp+1', 'null', 'systimestamp', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'null', 'systimestamp', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('timestamp with time zone', 'systimestamp+1', 'null', 'systimestamp', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('interval year to month', '''2-2''', 'null', '''2-1''', ut3.ut_utils.gc_failure, 'not_'); - exec_be_between2('interval day to second', '''2 01:00:00''', 'null', '''2 00:59:59''', ut3.ut_utils.gc_failure, 'not_'); - --Fails for unsupported data-type - exec_be_between2('clob', '''b''', '''a''', '''c''', ut3.ut_utils.gc_failure, ''); - end; - - procedure test_match is - begin - exec_match('varchar2(100)', '''Stephen''', '^Ste(v|ph)en$', '', ut3.ut_utils.gc_success); - exec_match('varchar2(100)', '''sTEPHEN''', '^Ste(v|ph)en$', 'i', ut3.ut_utils.gc_success); - exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', 'Ste(v|ph)en$', '', ut3.ut_utils.gc_success); - exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', 'Ste(v|ph)en$', 'i', ut3.ut_utils.gc_success); - - exec_match('varchar2(100)', '''Stephen''', '^Steven$', '', ut3.ut_utils.gc_failure); - exec_match('varchar2(100)', '''sTEPHEN''', '^Steven$', 'i', ut3.ut_utils.gc_failure); - exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', '^Stephen', '', ut3.ut_utils.gc_failure); - exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', '^Stephen', 'i', ut3.ut_utils.gc_failure); - - exec_match('varchar2(100)', '''Stephen''', '^Ste(v|ph)en$', '', ut3.ut_utils.gc_failure, 'not_'); - exec_match('varchar2(100)', '''sTEPHEN''', '^Ste(v|ph)en$', 'i', ut3.ut_utils.gc_failure, 'not_'); - exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', 'Ste(v|ph)en$', '', ut3.ut_utils.gc_failure, 'not_'); - exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', 'Ste(v|ph)en$', 'i', ut3.ut_utils.gc_failure, 'not_'); - - exec_match('varchar2(100)', '''Stephen''', '^Steven$', '', ut3.ut_utils.gc_success, 'not_'); - exec_match('varchar2(100)', '''sTEPHEN''', '^Steven$', 'i', ut3.ut_utils.gc_success, 'not_'); - exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', '^Stephen', '', ut3.ut_utils.gc_success, 'not_'); - exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', '^Stephen', 'i', ut3.ut_utils.gc_success, 'not_'); - --Fails for unsupported data-type - exec_match('number', '12345', '^123.*', 'i', ut3.ut_utils.gc_failure); - end; - - procedure test_be_like is - begin - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en%', '', ut3.ut_utils.gc_success); - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en\_K%', '\', ut3.ut_utils.gc_success); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en%', '', ut3.ut_utils.gc_success); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en\_K%', '\', ut3.ut_utils.gc_success); - - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste_en%', '', ut3.ut_utils.gc_failure); - exec_be_like('varchar2(100)', '''Stephen_King''', 'Stephe\__%', '\', ut3.ut_utils.gc_failure); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste_en%', '', ut3.ut_utils.gc_failure); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Stephe\__%', '\', ut3.ut_utils.gc_failure); - - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en%', '', ut3.ut_utils.gc_failure, 'not_'); - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en\_K%', '\', ut3.ut_utils.gc_failure, 'not_'); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en%', '', ut3.ut_utils.gc_failure, 'not_'); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en\_K%', '\', ut3.ut_utils.gc_failure, 'not_'); - - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste_en%', '', ut3.ut_utils.gc_success, 'not_'); - exec_be_like('varchar2(100)', '''Stephen_King''', 'Stephe\__%', '\', ut3.ut_utils.gc_success, 'not_'); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste_en%', '', ut3.ut_utils.gc_success, 'not_'); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Stephe\__%', '\', ut3.ut_utils.gc_success, 'not_'); - - --Fails for unsupported data-type - exec_be_like('number', '12345', '123%', '', ut3.ut_utils.gc_failure); - end; - - procedure test_timestamp_between is - l_value timestamp := to_timestamp('1997-01-31 09:26:50.13','YYYY-MM-DD HH24.MI.SS.FF'); - l_value_lower timestamp := to_timestamp('1997-01-31 09:26:50.11','YYYY-MM-DD HH24.MI.SS.FF'); - l_value_upper timestamp := to_timestamp('1997-01-31 09:26:50.14','YYYY-MM-DD HH24.MI.SS.FF'); - begin - ut3.ut.expect(l_value).to_be_between(l_value_lower, l_value_upper); - ut3.ut.expect(l_value).not_to_be_between(l_value_upper, l_value_lower); - end; - - procedure test_timestamp_ltz_between is - l_value timestamp with local time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +02:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); - l_value_lower timestamp with local time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +03:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); - l_value_upper timestamp with local time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +01:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); - begin - ut3.ut.expect(l_value).to_be_between(l_value_lower, l_value_upper); - ut3.ut.expect(l_value).not_to_be_between(l_value_upper, l_value_lower); - end; - - procedure test_timestamp_tz_between is - l_value timestamp with time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +02:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); - l_value_lower timestamp with time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +03:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); - l_value_upper timestamp with time zone := to_timestamp_tz('1997-01-31 09:26:50.12 +01:00','YYYY-MM-DD HH24.MI.SS.FF TZR'); - begin - ut3.ut.expect(l_value).to_be_between(l_value_lower, l_value_upper); - ut3.ut.expect(l_value).not_to_be_between(l_value_upper, l_value_lower); - end; - -end test_matchers; -/ diff --git a/test/core/expectations/test_matchers.pks b/test/core/expectations/test_matchers.pks deleted file mode 100644 index 0fa0953d4..000000000 --- a/test/core/expectations/test_matchers.pks +++ /dev/null @@ -1,27 +0,0 @@ -create or replace package test_matchers is - - --%suite(matchers) - --%suitepath(utplsql.core.expectations) - - --%aftereach - procedure cleanup_expectations; - - --%test - procedure test_be_between2; - --%test - procedure test_match; - - --%test - procedure test_be_like; - - --%test - procedure test_timestamp_between; - - --%test - procedure test_timestamp_ltz_between; - - --%test - procedure test_timestamp_tz_between; - -end test_matchers; -/ diff --git a/test/core/expectations/unary/test_expect_not_to_be_null.pkb b/test/core/expectations/unary/test_expect_not_to_be_null.pkb deleted file mode 100644 index 45ce4f697..000000000 --- a/test/core/expectations/unary/test_expect_not_to_be_null.pkb +++ /dev/null @@ -1,265 +0,0 @@ -create or replace package body test_expect_not_to_be_null -is - gc_object_name constant varchar2(30) := 't_not_to_be_null_test'; - gc_nested_table_name constant varchar2(30) := 'tt_not_to_be_null_test'; - gc_varray_name constant varchar2(30) := 'tv_not_to_be_null_test'; - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - procedure create_types is - pragma autonomous_transaction; - begin - execute immediate 'create type ' || gc_object_name || ' is object (dummy number)'; - execute immediate 'create type ' || gc_nested_table_name || ' is table of number'; - execute immediate 'create type ' || gc_varray_name || ' is varray(1) of number'; - end; - - procedure drop_types is - pragma autonomous_transaction; - begin - execute immediate 'drop type ' || gc_object_name; - execute immediate 'drop type ' || gc_nested_table_name; - execute immediate 'drop type ' || gc_varray_name; - end; - - procedure blob_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'blob', 'to_blob(''abc'')' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure blob_0_length is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'blob', 'empty_blob()' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure boolean_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'boolean', 'true' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure clob_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'clob', 'to_clob(''abc'')' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - - procedure clob_0_length is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'clob', 'empty_clob()' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure date_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'date', 'sysdate' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure number_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'number', '1234' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure timestamp_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'timestamp', 'systimestamp' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure timestamp_with_ltz_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( - 'not_to_be_null', 'timestamp with local time zone', 'systimestamp' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure timestamp_with_tz_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'timestamp with time zone', - 'systimestamp' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure varchar2_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'varchar2(4000)', '''abc''' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure initialized_object is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'not_to_be_null', gc_object_name, gc_object_name || '(1)', 'object' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure initialized_nested_table is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'not_to_be_null', gc_nested_table_name, gc_nested_table_name || '()', 'collection' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure initialized_varray is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'not_to_be_null', gc_varray_name, gc_varray_name || '()', 'collection' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure null_blob is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'blob', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure null_boolean is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'boolean', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure null_clob is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'clob', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure null_date is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'date', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure null_number is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'number', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure null_timestamp is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'timestamp', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure null_timestamp_with_ltz is - begin - --Act - execute immediate expectations.unary_expectation_block( - 'not_to_be_null', 'timestamp with local time zone', 'null' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure null_timestamp_with_tz is - begin - --Act - execute immediate expectations.unary_expectation_block( - 'not_to_be_null', 'timestamp with time zone', 'null' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure null_varchar2 is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'varchar2(4000)', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure null_anydata is - begin - --Act - execute immediate expectations.unary_expectation_block( 'not_to_be_null', 'anydata', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure uninit_object_in_anydata is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'not_to_be_null', gc_object_name, 'null', 'object' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure uninit_nested_table_in_anydata is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'not_to_be_null', gc_nested_table_name, 'null', 'collection' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure uninit_varray_in_anydata is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'not_to_be_null', gc_varray_name, 'null', 'collection' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - -end test_expect_not_to_be_null; -/ diff --git a/test/core/expectations/unary/test_expect_not_to_be_null.pks b/test/core/expectations/unary/test_expect_not_to_be_null.pks deleted file mode 100644 index fa2d6193f..000000000 --- a/test/core/expectations/unary/test_expect_not_to_be_null.pks +++ /dev/null @@ -1,97 +0,0 @@ -create or replace package test_expect_not_to_be_null -is - --%suite(not_to_be_null) - --%suitepath(utplsql.core.expectations.unary) - - --%aftereach - procedure cleanup_expectations; - - --%beforeall - procedure create_types; - - --%afterall - procedure drop_types; - - --%test(Gives success for not null blob) - procedure blob_not_null; - - --%test(Gives success for blob with length 0) - procedure blob_0_length; - - --%test(Gives success for not null boolean) - procedure boolean_not_null; - - --%test(Gives success for not null clob) - procedure clob_not_null; - - --%test(Gives success for clob with length 0) - procedure clob_0_length; - - --%test(Gives success for not null date) - procedure date_not_null; - - --%test(Gives success for not null number) - procedure number_not_null; - - --%test(Gives success for not null timestamp) - procedure timestamp_not_null; - - --%test(Gives success for not null timestamp with local time zone) - procedure timestamp_with_ltz_not_null; - - --%test(Gives success for not null timestamp with time zone) - procedure timestamp_with_tz_not_null; - - --%test(Gives success for not null varchar2) - procedure varchar2_not_null; - - --%test(Gives success for initialized object within anydata) - procedure initialized_object; - - --%test(Gives success for initialized nested table within anydata) - procedure initialized_nested_table; - - --%test(Gives success for initialized varray within anydata) - procedure initialized_varray; - - --%test(Gives failure with null blob) - procedure null_blob; - - --%test(Gives failure with null boolean) - procedure null_boolean; - - --%test(Gives failure with null clob) - procedure null_clob; - - --%test(Gives failure with null date) - procedure null_date; - - --%test(Gives failure with null number) - procedure null_number; - - --%test(Gives failure null timestamp) - procedure null_timestamp; - - --%test(Gives failure with null timestamp with local time zone) - procedure null_timestamp_with_ltz; - - --%test(Gives failure with null timestamp with time zone) - procedure null_timestamp_with_tz; - - --%test(Gives failure with null varchar2) - procedure null_varchar2; - - --%test(Gives failure with null anydata) - procedure null_anydata; - - --%test(Gives failure with uninitialized object within anydata) - procedure uninit_object_in_anydata; - - --%test(Gives failure with uninitialized nested table within anydata) - procedure uninit_nested_table_in_anydata; - - --%test(Gives failure with uninitialized varray within anydata) - procedure uninit_varray_in_anydata; - -end test_expect_not_to_be_null; -/ diff --git a/test/core/expectations/unary/test_expect_to_be_empty.pkb b/test/core/expectations/unary/test_expect_to_be_empty.pkb deleted file mode 100644 index 0db499906..000000000 --- a/test/core/expectations/unary/test_expect_to_be_empty.pkb +++ /dev/null @@ -1,271 +0,0 @@ -create or replace package body test_expect_to_be_empty is - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - procedure success_be_empty_cursor is - l_cursor sys_refcursor; - begin - --Arrange - open l_cursor for select * from dual where 1 = 2; - --Act - ut3.ut.expect(l_cursor).to_be_empty; - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_be_empty_cursor is - l_cursor sys_refcursor; - begin - --Arrange - open l_cursor for select * from dual; - --Act - ut3.ut.expect(l_cursor).to_be_empty; - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_be_empty_cursor_report is - l_cursor sys_refcursor; - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - open l_cursor for select * from dual; - --Act - ut3.ut.expect(l_cursor).to_be_empty; - - l_expected_message := q'[Actual: (refcursor [ count = 1 ])% - X% -was expected to be empty%%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure success_not_be_empty_cursor is - l_cursor sys_refcursor; - begin - --Arrange - open l_cursor for select * from dual; - --Act - ut3.ut.expect(l_cursor).not_to_be_empty; - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_not_be_empty_cursor is - l_cursor sys_refcursor; - begin - --Arrange - open l_cursor for select * from dual where 1 = 2; - --Act - ut3.ut.expect(l_cursor).not_to_be_empty; - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure success_be_empty_collection is - l_actual anydata; - begin - --Arrange - l_actual := anydata.convertcollection(ora_mining_varchar2_nt()); - -- Act - ut3.ut.expect(l_actual).to_be_empty(); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_be_empty_collection is - l_actual anydata; - begin - --Arrange - l_actual := anydata.convertcollection(ora_mining_varchar2_nt('a')); - -- Act - ut3.ut.expect(l_actual).to_be_empty(); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure success_not_be_empty_coll is - l_actual anydata; - begin - --Arrange - l_actual := anydata.convertcollection(ora_mining_varchar2_nt('a')); - -- Act - ut3.ut.expect(l_actual).not_to_be_empty(); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_not_be_empty_collection is - l_actual anydata; - begin - --Arrange - l_actual := anydata.convertcollection(ora_mining_varchar2_nt()); - -- Act - ut3.ut.expect(l_actual).not_to_be_empty(); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_be_empty_null_collection is - l_actual anydata; - l_data ora_mining_varchar2_nt; - begin - --Arrange - l_actual := anydata.convertcollection(l_data); - -- Act - ut3.ut.expect(l_actual).to_be_empty(); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_not_be_empty_null_coll is - l_actual anydata; - l_data ora_mining_varchar2_nt; - begin - --Arrange - l_actual := anydata.convertcollection(l_data); - -- Act - ut3.ut.expect(l_actual).not_to_be_empty(); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_be_empty_object is - l_actual anydata; - begin - --Arrange - l_actual := anydata.convertObject(ut3.ut_data_value_number(1)); - -- Act - ut3.ut.expect(l_actual).to_be_empty(); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_be_empty_null_object is - l_actual anydata; - l_data ut3.ut_data_value_number; - begin - --Arrange - l_actual := anydata.convertObject(l_data); - -- Act - ut3.ut.expect(l_actual).to_be_empty(); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_be_empty_number is - begin - -- Act - ut3.ut.expect( 1 ).to_( ut3.be_empty() ); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - /** - * https://docs.oracle.com/en/database/oracle/oracle-database/18/adobj/declaring-initializing-objects-in-plsql.html#GUID-23135172-82E2-4C3E-800D-E584B43B578E - * User-defined types, just like collections, are atomically null, until you initialize the object by calling the constructor for its object type. That is, the object itself is null, not just its attributes. - */ - procedure fail_not_be_empty_object is - l_actual anydata; - begin - --Arrange - l_actual := anydata.convertObject(ut3.ut_data_value_number(1)); - -- Act - ut3.ut.expect(l_actual).not_to_be_empty(); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_not_be_empty_null_object is - l_actual anydata; - l_data ut3.ut_data_value_number; - begin - --Arrange - l_actual := anydata.convertObject(l_data); - -- Act - ut3.ut.expect(l_actual).not_to_be_empty(); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_not_be_empty_number is - begin - -- Act - ut3.ut.expect( 1 ).not_to( ut3.be_empty() ); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure success_be_empty_clob is - begin - -- Act - ut3.ut.expect( empty_clob() ).to_( ut3.be_empty() ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_be_empty_clob is - begin - -- Act - ut3.ut.expect( to_clob(' ') ).to_( ut3.be_empty() ); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure success_be_empty_blob is - begin - -- Act - ut3.ut.expect( empty_blob() ).to_( ut3.be_empty() ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_be_empty_blob is - begin - -- Act - ut3.ut.expect( to_blob('AA') ).to_( ut3.be_empty() ); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - - procedure fail_not_be_empty_clob is - begin - -- Act - ut3.ut.expect( empty_clob() ).not_to( ut3.be_empty() ); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure success_not_be_empty_clob is - begin - -- Act - ut3.ut.expect( to_clob(' ') ).not_to( ut3.be_empty() ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_not_be_empty_blob is - begin - -- Act - ut3.ut.expect( empty_blob() ).not_to( ut3.be_empty() ); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure success_not_be_empty_blob is - begin - -- Act - ut3.ut.expect( to_blob('AA') ).not_to( ut3.be_empty() ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - -end; -/ \ No newline at end of file diff --git a/test/core/expectations/unary/test_expect_to_be_empty.pks b/test/core/expectations/unary/test_expect_to_be_empty.pks deleted file mode 100644 index 92a7e0bef..000000000 --- a/test/core/expectations/unary/test_expect_to_be_empty.pks +++ /dev/null @@ -1,93 +0,0 @@ -create or replace package test_expect_to_be_empty is - - --%suite - --%suitepath(utplsql.core.expectations.unary) - - --%aftereach - procedure cleanup_expectations; - - --%context(to_be_empty) - - --%test(Gives success for an empty cursor) - procedure success_be_empty_cursor; - - --%test(Gives failure for a non empty cursor) - procedure fail_be_empty_cursor; - - --%test(Reports the content of cursor when cursor is not empty) - procedure fail_be_empty_cursor_report; - - --%test(Gives success for an empty collection) - procedure success_be_empty_collection; - - --%test(Gives failure for a non empty collection) - procedure fail_be_empty_collection; - - --%test(Gives failure for a NULL collection) - procedure fail_be_empty_null_collection; - - --%test(Gives failure for an object) - procedure fail_be_empty_object; - - --%test(Gives failure for a null object) - procedure fail_be_empty_null_object; - - --%test(Gives failure for number) - procedure fail_be_empty_number; - - --%test(Gives success for an empty CLOB) - procedure success_be_empty_clob; - - --%test(Gives failure for a non empty CLOB) - procedure fail_be_empty_clob; - - --%test(Gives success for an empty BLOB) - procedure success_be_empty_blob; - - --%test(Gives failure for a non empty BLOB) - procedure fail_be_empty_blob; - - --%endcontext - - --%context(not_to_be_empty) - - --%test(Gives failure for an empty cursor) - procedure fail_not_be_empty_cursor; - - --%test(Gives success for a non empty cursor) - procedure success_not_be_empty_cursor; - - --%test(Gives success for a non empty collection) - procedure success_not_be_empty_coll; - - --%test(Gives failure for an empty collection) - procedure fail_not_be_empty_collection; - - --%test(Gives failure for an empty collection) - procedure fail_not_be_empty_null_coll; - - --%test(Gives failure for an empty object) - procedure fail_not_be_empty_object; - - --%test(Gives failure for a null object) - procedure fail_not_be_empty_null_object; - - --%test(Gives failure for number) - procedure fail_not_be_empty_number; - - --%test(Gives failure for an empty CLOB) - procedure fail_not_be_empty_clob; - - --%test(Gives success for a non empty CLOB) - procedure success_not_be_empty_clob; - - --%test(Gives failure for an empty BLOB) - procedure fail_not_be_empty_blob; - - --%test(Gives success for a non empty BLOB) - procedure success_not_be_empty_blob; - - --%endcontext - -end; -/ diff --git a/test/core/expectations/unary/test_expect_to_be_not_null.pkb b/test/core/expectations/unary/test_expect_to_be_not_null.pkb deleted file mode 100644 index be6b3f2f8..000000000 --- a/test/core/expectations/unary/test_expect_to_be_not_null.pkb +++ /dev/null @@ -1,264 +0,0 @@ -create or replace package body test_expect_to_be_not_null -is - gc_object_name constant varchar2(30) := 't_to_be_not_null_test'; - gc_nested_table_name constant varchar2(30) := 'tt_to_be_not_null_test'; - gc_varray_name constant varchar2(30) := 'tv_to_be_not_null_test'; - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations(); - end; - - procedure create_types is - pragma autonomous_transaction; - begin - execute immediate 'create type '||gc_object_name||' is object (dummy number)'; - execute immediate 'create type '||gc_nested_table_name||' is table of number'; - execute immediate 'create type '||gc_varray_name||' is varray(1) of number'; - end; - - procedure drop_types is - pragma autonomous_transaction; - begin - execute immediate 'drop type '||gc_object_name; - execute immediate 'drop type '||gc_nested_table_name; - execute immediate 'drop type '||gc_varray_name; - end; - - procedure blob_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'blob', 'to_blob(''abc'')'); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure empty_blob is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'blob', 'empty_blob()'); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure boolean_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'boolean', 'true'); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure clob_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'clob', 'to_clob(''abc'')'); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure empty_clob is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'clob', 'empty_clob()'); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure date_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'date', 'sysdate'); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure number_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'number', '1234'); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure timestamp_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'timestamp', 'systimestamp'); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure timestamp_with_ltz_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'timestamp with local time zone', 'systimestamp'); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure timestamp_with_tz_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'timestamp with time zone', 'systimestamp'); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure varchar2_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'varchar2(4000)', '''abc'''); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure initialized_object is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'to_be_not_null', gc_object_name, gc_object_name||'(1)', 'object' - ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure initialized_nested_table is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'to_be_not_null', gc_nested_table_name, gc_nested_table_name||'()', 'collection' - ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure initialized_varray is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'to_be_not_null', gc_varray_name, gc_varray_name||'()', 'collection' - ); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure null_blob is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'blob', 'null'); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure null_boolean is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'boolean', 'null'); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - - procedure null_clob is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'clob', 'null'); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - - procedure null_date is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'date', 'null'); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - - procedure null_number is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'number', 'null'); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - - procedure null_timestamp is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'timestamp', 'null'); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - - procedure null_timestamp_with_ltz is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'timestamp with local time zone', 'null'); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - - procedure null_timestamp_with_tz is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'timestamp with time zone', 'null'); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - - procedure null_varchar2 is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'varchar2(4000)', 'null'); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure null_anydata is - begin - --Act - execute immediate expectations.unary_expectation_block('to_be_not_null', 'anydata', 'null'); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure uninit_object_in_anydata is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'to_be_not_null', gc_object_name, 'null', 'object' - ); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure uninit_nested_table_in_anydata is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'to_be_not_null', gc_nested_table_name, 'null', 'collection' - ); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure uninit_varray_in_anydata is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'to_be_not_null', gc_varray_name, 'null', 'collection' - ); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - -end test_expect_to_be_not_null; -/ diff --git a/test/core/expectations/unary/test_expect_to_be_not_null.pks b/test/core/expectations/unary/test_expect_to_be_not_null.pks deleted file mode 100644 index 351482fee..000000000 --- a/test/core/expectations/unary/test_expect_to_be_not_null.pks +++ /dev/null @@ -1,97 +0,0 @@ -create or replace package test_expect_to_be_not_null -is - --%suite(to_be_not_null) - --%suitepath(utplsql.core.expectations.unary) - - --%aftereach - procedure cleanup_expectations; - - --%beforeall - procedure create_types; - - --%afterall - procedure drop_types; - - --%test(Gives success for not null blob) - procedure blob_not_null; - - --%test(Gives success for empty blob) - procedure empty_blob; - - --%test(Gives success for not null boolean) - procedure boolean_not_null; - - --%test(Gives success for not null clob) - procedure clob_not_null; - - --%test(Gives success for empty clob) - procedure empty_clob; - - --%test(Gives success for not null date) - procedure date_not_null; - - --%test(Gives success for not null number) - procedure number_not_null; - - --%test(Gives success for not null timestamp) - procedure timestamp_not_null; - - --%test(Gives success for not null timestamp with local time zone) - procedure timestamp_with_ltz_not_null; - - --%test(Gives success for not null timestamp with time zone) - procedure timestamp_with_tz_not_null; - - --%test(Gives success for not null varchar2) - procedure varchar2_not_null; - - --%test(Gives success for initialized object within anydata) - procedure initialized_object; - - --%test(Gives success for initialized nested table within anydata) - procedure initialized_nested_table; - - --%test(Gives success for initialized varray within anydata) - procedure initialized_varray; - - --%test(Gives failure with null blob) - procedure null_blob; - - --%test(Gives failure with null boolean) - procedure null_boolean; - - --%test(Gives failure with null clob) - procedure null_clob; - - --%test(Gives failure with null date) - procedure null_date; - - --%test(Gives failure with null number) - procedure null_number; - - --%test(Gives failure null timestamp) - procedure null_timestamp; - - --%test(Gives failure with null timestamp with local time zone) - procedure null_timestamp_with_ltz; - - --%test(Gives failure with null timestamp with time zone) - procedure null_timestamp_with_tz; - - --%test(Gives failure with null varchar2) - procedure null_varchar2; - - --%test(Gives failure with null anydata) - procedure null_anydata; - - --%test(Gives failure with uninitialized object within anydata) - procedure uninit_object_in_anydata; - - --%test(Gives failure with uninitialized nested table within anydata) - procedure uninit_nested_table_in_anydata; - - --%test(Gives failure with uninitialized varray within anydata) - procedure uninit_varray_in_anydata; - -end test_expect_to_be_not_null; -/ diff --git a/test/core/expectations/unary/test_expect_to_be_null.pkb b/test/core/expectations/unary/test_expect_to_be_null.pkb deleted file mode 100644 index 4179bfbe6..000000000 --- a/test/core/expectations/unary/test_expect_to_be_null.pkb +++ /dev/null @@ -1,260 +0,0 @@ -create or replace package body test_expect_to_be_null -is - gc_object_name constant varchar2(30) := 't_to_be_null_test'; - gc_nested_table_name constant varchar2(30) := 'tt_to_be_null_test'; - gc_varray_name constant varchar2(30) := 'tv_to_be_null_test'; - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - procedure create_types is - pragma autonomous_transaction; - begin - execute immediate 'create type ' || gc_object_name || ' is object (dummy number)'; - execute immediate 'create type ' || gc_nested_table_name || ' is table of number'; - execute immediate 'create type ' || gc_varray_name || ' is varray(1) of number'; - end; - - procedure drop_types is - pragma autonomous_transaction; - begin - execute immediate 'drop type ' || gc_object_name; - execute immediate 'drop type ' || gc_nested_table_name; - execute immediate 'drop type ' || gc_varray_name; - end; - - procedure null_blob is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'blob', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure null_boolean is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'boolean', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure null_clob is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'clob', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure null_date is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'date', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure null_number is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'number', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure null_timestamp is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'timestamp', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure null_timestamp_with_ltz is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'timestamp with local time zone', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure null_timestamp_with_tz is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'timestamp with time zone', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure null_varchar2 is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'varchar2(4000)', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure null_anydata is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'anydata', 'null' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure uninit_object_in_anydata is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'to_be_null', gc_object_name, 'null', 'object' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure uninit_nested_table_in_anydata is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'to_be_null', gc_nested_table_name, 'null', 'collection' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure uninit_varray_in_anydata is - begin - --Act - execute immediate expectations.unary_expectation_object_block( 'to_be_null', gc_varray_name, - 'null', 'collection' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure blob_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'blob', 'to_blob(''abc'')' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure empty_blob is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'blob', 'empty_blob()' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure boolean_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'boolean', 'true' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure clob_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'clob', 'to_clob(''abc'')' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure empty_clob is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'clob', 'empty_clob()' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure date_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'date', 'sysdate' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure number_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'number', '1234' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure timestamp_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'timestamp', 'systimestamp' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure timestamp_with_ltz_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( - 'to_be_null', 'timestamp with local time zone', 'systimestamp' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure timestamp_with_tz_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( - 'to_be_null', 'timestamp with time zone', 'systimestamp' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure varchar2_not_null is - begin - --Act - execute immediate expectations.unary_expectation_block( 'to_be_null', 'varchar2(4000)', '''abc''' ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure initialized_object is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'to_be_null', gc_object_name, gc_object_name || '(1)', 'object' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure initialized_nested_table is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'to_be_null', gc_nested_table_name, gc_nested_table_name || '()', 'collection' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure initialized_varray is - begin - --Act - execute immediate expectations.unary_expectation_object_block( - 'to_be_null', gc_varray_name, gc_varray_name || '()', 'collection' - ); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - -end test_expect_to_be_null; -/ diff --git a/test/core/expectations/unary/test_expect_to_be_null.pks b/test/core/expectations/unary/test_expect_to_be_null.pks deleted file mode 100644 index 8b34e1279..000000000 --- a/test/core/expectations/unary/test_expect_to_be_null.pks +++ /dev/null @@ -1,97 +0,0 @@ -create or replace package test_expect_to_be_null -is - --%suite(to_be_null) - --%suitepath(utplsql.core.expectations.unary) - - --%aftereach - procedure cleanup_expectations; - - --%beforeall - procedure create_types; - - --%afterall - procedure drop_types; - - --%test(Gives success with null blob) - procedure null_blob; - - --%test(Gives success with null boolean) - procedure null_boolean; - - --%test(Gives success with null clob) - procedure null_clob; - - --%test(Gives success with null date) - procedure null_date; - - --%test(Gives success with null number) - procedure null_number; - - --%test(Gives success null timestamp) - procedure null_timestamp; - - --%test(Gives success with null timestamp with local time zone) - procedure null_timestamp_with_ltz; - - --%test(Gives success with null timestamp with time zone) - procedure null_timestamp_with_tz; - - --%test(Gives success with null varchar2) - procedure null_varchar2; - - --%test(Gives success with null anydata) - procedure null_anydata; - - --%test(Gives success with uninitialized object within anydata) - procedure uninit_object_in_anydata; - - --%test(Gives success with uninitialized nested table within anydata) - procedure uninit_nested_table_in_anydata; - - --%test(Gives success with uninitialized varray within anydata) - procedure uninit_varray_in_anydata; - - --%test(Gives failure for not null blob) - procedure blob_not_null; - - --%test(Gives failure with empty blob) - procedure empty_blob; - - --%test(Gives failure for not null boolean) - procedure boolean_not_null; - - --%test(Gives failure for not null clob) - procedure clob_not_null; - - --%test(Gives failure with empty clob) - procedure empty_clob; - - --%test(Gives failure for not null date) - procedure date_not_null; - - --%test(Gives failure for not null number) - procedure number_not_null; - - --%test(Gives failure for not null timestamp) - procedure timestamp_not_null; - - --%test(Gives failure for not null timestamp with local time zone) - procedure timestamp_with_ltz_not_null; - - --%test(Gives failure for not null timestamp with time zone) - procedure timestamp_with_tz_not_null; - - --%test(Gives failure for not null varchar2) - procedure varchar2_not_null; - - --%test(Gives failure for initialized object within anydata) - procedure initialized_object; - - --%test(Gives failure for initialized nested table within anydata) - procedure initialized_nested_table; - - --%test(Gives failure for initialized varray within anydata) - procedure initialized_varray; - -end test_expect_to_be_null; -/ diff --git a/test/core/expectations/unary/test_expect_to_be_true_false.pkb b/test/core/expectations/unary/test_expect_to_be_true_false.pkb deleted file mode 100644 index 32ef58a7d..000000000 --- a/test/core/expectations/unary/test_expect_to_be_true_false.pkb +++ /dev/null @@ -1,139 +0,0 @@ -create or replace package body test_expect_to_be_true_false -is - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - procedure to_be_true_null_boolean is - begin - --Act - ut3.ut.expect( 1=null ).to_be_true(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure to_be_true_success is - begin - --Act - ut3.ut.expect( 1=1 ).to_be_true(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure to_be_true_failure is - begin - --Act - ut3.ut.expect( 1=2 ).to_be_true(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure to_be_true_bad_type is - begin - --Act - ut3.ut.expect( 1 ).to_be_true(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_to_be_true_null_boolean is - begin - --Act - ut3.ut.expect( 1=null ).not_to_be_true(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_to_be_true_success is - begin - --Act - ut3.ut.expect( 1=2 ).not_to_be_true(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure not_to_be_true_failure is - begin - --Act - ut3.ut.expect( 1=1 ).not_to_be_true(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - - procedure not_to_be_true_bad_type is - begin - --Act - ut3.ut.expect( 1 ).not_to_be_true(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure to_be_false_null_boolean is - begin - --Act - ut3.ut.expect( 1=null ).to_be_false(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure to_be_false_success is - begin - --Act - ut3.ut.expect( 1=2 ).to_be_false(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure to_be_false_failure is - begin - --Act - ut3.ut.expect( 1=1 ).to_be_false(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure to_be_false_bad_type is - begin - --Act - ut3.ut.expect( 1 ).to_be_false(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_to_be_false_null_boolean is - begin - --Act - ut3.ut.expect( 1=null ).not_to_be_false(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_to_be_false_success is - begin - --Act - ut3.ut.expect( 1=1 ).not_to_be_false(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).to_be_empty( ); - end; - - procedure not_to_be_false_failure is - begin - --Act - ut3.ut.expect( 1=2 ).not_to_be_false(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - - procedure not_to_be_false_bad_type is - begin - --Act - ut3.ut.expect( 1 ).not_to_be_false(); - --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); - end; - -end; -/ diff --git a/test/core/expectations/unary/test_expect_to_be_true_false.pks b/test/core/expectations/unary/test_expect_to_be_true_false.pks deleted file mode 100644 index abdbf44b6..000000000 --- a/test/core/expectations/unary/test_expect_to_be_true_false.pks +++ /dev/null @@ -1,58 +0,0 @@ -create or replace package test_expect_to_be_true_false -is - --%suite(to_be_true/false) - --%suitepath(utplsql.core.expectations.unary) - - --%aftereach - procedure cleanup_expectations; - - --%test(to_be_true - Gives failure with null boolean) - procedure to_be_true_null_boolean; - - --%test(to_be_true - Gives success with true expression) - procedure to_be_true_success; - - --%test(to_be_true - Gives failure with false expression) - procedure to_be_true_failure; - - --%test(to_be_true - Gives failure with non-boolean data type) - procedure to_be_true_bad_type; - - --%test(not_to_be_true - Gives failure with null boolean) - procedure not_to_be_true_null_boolean; - - --%test(not_to_be_true - Gives failure with true expression) - procedure not_to_be_true_success; - - --%test(not_to_be_true - Gives success with false expression) - procedure not_to_be_true_failure; - - --%test(not_to_be_true - Gives failure with non-boolean data type) - procedure not_to_be_true_bad_type; - - --%test(to_be_false - Gives failure with null boolean) - procedure to_be_false_null_boolean; - - --%test(to_be_false - Gives failure with true expression) - procedure to_be_false_success; - - --%test(to_be_false - Gives success with false expression) - procedure to_be_false_failure; - - --%test(to_be_false - Gives failure with non-boolean data type) - procedure to_be_false_bad_type; - - --%test(not_to_be_false - Gives failure with null boolean) - procedure not_to_be_false_null_boolean; - - --%test(not_to_be_false - Gives success with true expression) - procedure not_to_be_false_success; - - --%test(not_to_be_false - Gives failure with false expression) - procedure not_to_be_false_failure; - - --%test(not_to_be_false - Gives failure with non-boolean data type) - procedure not_to_be_false_bad_type; - -end; -/ diff --git a/test/core/expectations/unary/test_expect_to_have_count.pkb b/test/core/expectations/unary/test_expect_to_have_count.pkb deleted file mode 100644 index a95a6778a..000000000 --- a/test/core/expectations/unary/test_expect_to_have_count.pkb +++ /dev/null @@ -1,210 +0,0 @@ -create or replace package body test_expect_to_have_count is - - procedure cleanup_expectations is - begin - expectations.cleanup_expectations( ); - end; - - procedure success_have_count_cursor is - l_cursor sys_refcursor; - begin - --Arrange - open l_cursor for select * from dual connect by level <= 11; - --Act - ut3.ut.expect(l_cursor).to_have_count(11); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_have_count_cursor is - l_cursor sys_refcursor; - begin - --Arrange - open l_cursor for select * from dual where 0=1; - --Act - ut3.ut.expect(l_cursor).to_have_count(1); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_have_count_cursor_report is - l_cursor sys_refcursor; - l_actual_message varchar2(32767); - l_expected_message varchar2(32767); - begin - --Arrange - open l_cursor for select * from dual; - --Act - ut3.ut.expect(l_cursor).to_have_count(2); - - l_expected_message := q'[Actual: (refcursor [ count = 1 ]) was expected to have [ count = 2 ]%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure success_not_have_count_cursor is - l_cursor sys_refcursor; - begin - --Arrange - open l_cursor for select * from dual; - --Act - ut3.ut.expect(l_cursor).not_to_have_count(2); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_not_have_count_cursor is - l_cursor sys_refcursor; - begin - --Arrange - open l_cursor for select * from dual where 1 = 2; - --Act - ut3.ut.expect(l_cursor).not_to_have_count(0); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure success_have_count_collection is - l_actual anydata; - begin - --Arrange - l_actual := anydata.convertcollection(ora_mining_varchar2_nt()); - -- Act - ut3.ut.expect(l_actual).to_have_count(0); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_have_count_collection is - l_actual anydata; - begin - --Arrange - l_actual := anydata.convertcollection(ora_mining_varchar2_nt('a')); - -- Act - ut3.ut.expect(l_actual).to_have_count(0); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure success_not_have_count_coll is - l_actual anydata; - begin - --Arrange - l_actual := anydata.convertcollection(ora_mining_varchar2_nt('a')); - -- Act - ut3.ut.expect(l_actual).not_to_have_count(2); - --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); - end; - - procedure fail_not_have_count_coll is - l_actual anydata; - begin - --Arrange - l_actual := anydata.convertcollection(ora_mining_varchar2_nt()); - -- Act - ut3.ut.expect(l_actual).not_to_have_count(0); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_have_count_null_coll is - l_actual anydata; - l_data ora_mining_varchar2_nt; - begin - --Arrange - l_actual := anydata.convertcollection(l_data); - -- Act - ut3.ut.expect(l_actual).to_have_count(0); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_not_have_count_null_coll is - l_actual anydata; - l_data ora_mining_varchar2_nt; - begin - --Arrange - l_actual := anydata.convertcollection(l_data); - -- Act - ut3.ut.expect(l_actual).not_to_have_count(0); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_have_count_object is - l_actual anydata; - begin - --Arrange - l_actual := anydata.convertObject(ut3.ut_data_value_number(1)); - -- Act - ut3.ut.expect(l_actual).to_have_count(0); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_have_count_null_object is - l_actual anydata; - l_data ut3.ut_data_value_number; - begin - --Arrange - l_actual := anydata.convertObject(l_data); - -- Act - ut3.ut.expect(l_actual).to_have_count(0); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_have_count_number is - l_expected_message varchar2(32767); - l_actual_message varchar2(32767); - begin - -- Act - ut3.ut.expect( 1 ).to_( ut3.have_count(0) ); - --Assert - l_expected_message := q'[%The matcher 'have count' cannot be used with data type (number).%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure fail_not_have_count_object is - l_actual anydata; - l_expected_message varchar2(32767); - l_actual_message varchar2(32767); - begin - --Arrange - l_actual := anydata.convertObject(ut3.ut_data_value_number(1)); - -- Act - ut3.ut.expect(l_actual).not_to_have_count(0); - --Assert - l_expected_message := q'[%The matcher 'have count' cannot be used with data type (ut3.ut_data_value_number).%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure fail_not_have_count_null_obj is - l_actual anydata; - l_data ut3.ut_data_value_number; - begin - --Arrange - l_actual := anydata.convertObject(l_data); - -- Act - ut3.ut.expect(l_actual).not_to_have_count(0); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - - procedure fail_not_have_count_number is - begin - -- Act - ut3.ut.expect( 1 ).not_to( ut3.have_count(0) ); - --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); - end; - -end; -/ \ No newline at end of file diff --git a/test/core/expectations/unary/test_expect_to_have_count.pks b/test/core/expectations/unary/test_expect_to_have_count.pks deleted file mode 100644 index 636f98ba4..000000000 --- a/test/core/expectations/unary/test_expect_to_have_count.pks +++ /dev/null @@ -1,61 +0,0 @@ -create or replace package test_expect_to_have_count is - - --%suite((not)to_have_count) - --%suitepath(utplsql.core.expectations.unary) - - --%aftereach - procedure cleanup_expectations; - - --%test(Gives success for an empty cursor) - procedure success_have_count_cursor; - - --%test(Gives failure for a non empty cursor) - procedure fail_have_count_cursor; - - --%test(Reports the content of cursor when cursor is not empty) - procedure fail_have_count_cursor_report; - - --%test(Negated - Gives success for a non empty cursor) - procedure success_not_have_count_cursor; - - --%test(Negated - Gives failure for an empty cursor) - procedure fail_not_have_count_cursor; - - --%test(Gives success for an empty collection) - procedure success_have_count_collection; - - --%test(Gives failure for a non empty collection) - procedure fail_have_count_collection; - - --%test(Negated - Gives success for a non empty collection) - procedure success_not_have_count_coll; - - --%test(Negated - Gives failure for an empty collection) - procedure fail_not_have_count_coll; - - --%test(Gives failure for a NULL collection) - procedure fail_have_count_null_coll; - - --%test(Negated - Gives failure for an empty collection) - procedure fail_not_have_count_null_coll; - - --%test(Gives failure for an object) - procedure fail_have_count_object; - - --%test(Gives failure for a null object) - procedure fail_have_count_null_object; - - --%test(Gives failure for number) - procedure fail_have_count_number; - - --%test(Negated - Gives failure for an object) - procedure fail_not_have_count_object; - - --%test(Negated - Gives failure for a null object) - procedure fail_not_have_count_null_obj; - - --%test(Negated - Gives failure for number) - procedure fail_not_have_count_number; - -end; -/ diff --git a/test/core/min_grant_user/test_min_grant_user.pkb b/test/core/min_grant_user/test_min_grant_user.pkb deleted file mode 100644 index 233cca67f..000000000 --- a/test/core/min_grant_user/test_min_grant_user.pkb +++ /dev/null @@ -1,71 +0,0 @@ -create or replace package body test_min_grant_user is - - procedure test_join_by_cursor is - l_results clob; - begin - execute immediate 'begin ut3$user#.test_cursor_grants.run_test_join_by_cursor(); end;'; - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%execute join by test [% sec]' || - '%1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%' ); - - end; - - procedure test_equal_cursor is - l_results clob; - begin - execute immediate 'begin ut3$user#.test_cursor_grants.run_test_equal_cursor(); end;'; - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%execute equal test [% sec]' || - '%1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%' ); - - end; - - procedure test_not_empty_cursor is - l_results clob; - begin - execute immediate 'begin ut3$user#.test_cursor_grants.run_test_not_empty_cursor(); end;'; - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%execute not_empty test [% sec]' || - '%1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%' ); - - end; - - - procedure test_have_count_cursor is - l_results clob; - begin - execute immediate 'begin ut3$user#.test_cursor_grants.run_test_have_count_cursor(); end;'; - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%execute have_count test [% sec]' || - '%1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%' ); - - end; - - procedure test_empty_cursor is - l_results clob; - begin - execute immediate 'begin ut3$user#.test_cursor_grants.run_test_empty_cursor(); end;'; - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%execute empty test [% sec]' || - '%1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%' ); - - end; - - procedure test_equal_non_diff_sql is - l_results clob; - begin - execute immediate 'begin ut3$user#.test_cursor_grants.run_test_equal_non_diff_sql(); end;'; - l_results := core.get_dbms_output_as_clob(); - --Assert - ut.expect( l_results ).to_be_like( '%execute test with non diff datatype [% sec]' || - '%1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%' ); - - end; - -end; -/ diff --git a/test/core/min_grant_user/test_min_grant_user.pks b/test/core/min_grant_user/test_min_grant_user.pks deleted file mode 100644 index daf34b35d..000000000 --- a/test/core/min_grant_user/test_min_grant_user.pks +++ /dev/null @@ -1,25 +0,0 @@ -create or replace package test_min_grant_user is - - --%suite(minimum grant user tests) - --%suitepath(utplsql.core) - - --%test(execute join by test) - procedure test_join_by_cursor; - - --%test(execute equal test) - procedure test_equal_cursor; - - --%test(execute not_empty test) - procedure test_not_empty_cursor; - - --%test(execute have_count test) - procedure test_have_count_cursor; - - --%test(execute empty test) - procedure test_empty_cursor; - - --%test(execute test with non diff datatype) - procedure test_equal_non_diff_sql; - -end; -/ diff --git a/test/core/reporters.pkb b/test/core/reporters.pkb deleted file mode 100644 index abd9e6007..000000000 --- a/test/core/reporters.pkb +++ /dev/null @@ -1,150 +0,0 @@ -create or replace package body reporters is - - procedure create_test_helper_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package test_reporters -as - --%suite(A suite for testing different outcomes from reporters) - --%suitepath(org.utplsql.tests.helpers) - - --%beforeall - procedure beforeall; - - --%beforeeach - procedure beforeeach; - - --%context(some_context) - --%displayname(A description of some context) - - --%test - --%beforetest(beforetest) - --%aftertest(aftertest) - procedure passing_test; - - --%endcontext - - procedure beforetest; - - procedure aftertest; - - --%test(a test with failing assertion) - procedure failing_test; - - --%test(a test raising unhandled exception) - procedure erroring_test; - - --%test(a disabled test) - --%disabled - procedure disabled_test; - - --%aftereach - procedure aftereach; - - --%afterall - procedure afterall; - -end;]'; - - execute immediate q'[create or replace package body test_reporters -as - - procedure beforetest is - begin - dbms_output.put_line(''); - end; - - procedure aftertest - is - begin - dbms_output.put_line(''); - end; - - procedure beforeeach is - begin - dbms_output.put_line(''); - end; - - procedure aftereach is - begin - dbms_output.put_line(''); - end; - - procedure passing_test - is - begin - dbms_output.put_line(''); - ut3.ut.expect(1,'Test 1 Should Pass').to_equal(1); - end; - - procedure failing_test - is - begin - dbms_output.put_line(''); - ut3.ut.expect('number [1] ','Fails as values are different').to_equal('number [2] '); - end; - - procedure erroring_test - is - l_variable integer; - begin - dbms_output.put_line(''); - l_variable := 'a string'; - ut3.ut.expect(l_variable).to_equal(1); - end; - - procedure disabled_test - is - begin - dbms_output.put_line(''); - ut3.ut.expect(1,'this should not execute').to_equal(1); - end; - - procedure beforeall is - begin - dbms_output.put_line(''); - end; - - procedure afterall is - begin - dbms_output.put_line(''); - end; - -end;]'; - - end; - - procedure reporters_setup is - begin - create_test_helper_package; - end; - - procedure drop_test_helper_package is - begin - execute immediate 'drop package test_reporters'; - end; - - procedure reporters_cleanup is - pragma autonomous_transaction; - begin - drop_test_helper_package; - end; - - procedure check_xml_encoding_included( - a_reporter ut3.ut_output_reporter_base, - a_client_character_set varchar2 - ) is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('test_reporters', a_reporter, a_client_character_set => a_client_character_set)); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%'); - end; - -end reporters; -/ diff --git a/test/core/reporters.pks b/test/core/reporters.pks deleted file mode 100644 index 229e4e9b1..000000000 --- a/test/core/reporters.pks +++ /dev/null @@ -1,18 +0,0 @@ -create or replace package reporters is - - --%suite - --%suitepath(utplsql.core) - - --%beforeall - procedure reporters_setup; - - --%afterall - procedure reporters_cleanup; - - procedure check_xml_encoding_included( - a_reporter ut3.ut_output_reporter_base, - a_client_character_set varchar2 - ); - -end reporters; -/ diff --git a/test/core/reporters/test_coverage.pkb b/test/core/reporters/test_coverage.pkb deleted file mode 100644 index 2c67dc8c9..000000000 --- a/test/core/reporters/test_coverage.pkb +++ /dev/null @@ -1,262 +0,0 @@ -create or replace package body test_coverage is - - function get_mock_run_id return integer is - v_result integer; - begin - select nvl(min(runid),0) - 1 into v_result - from ut3.plsql_profiler_runs; - return v_result; - end; - - procedure create_dummy_coverage_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package UT3.DUMMY_COVERAGE is - procedure do_stuff; - end;]'; - execute immediate q'[create or replace package body UT3.DUMMY_COVERAGE is - procedure do_stuff is - begin - if 1 = 2 then - dbms_output.put_line('should not get here'); - else - dbms_output.put_line('should get here'); - end if; - end; - end;]'; - end; - - procedure create_dummy_coverage_test is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package UT3.TEST_DUMMY_COVERAGE is - --%suite(dummy coverage test) - --%suitepath(coverage_testing) - - --%test - procedure test_do_stuff; - end;]'; - execute immediate q'[create or replace package body UT3.TEST_DUMMY_COVERAGE is - procedure test_do_stuff is - begin - dummy_coverage.do_stuff; - end; - end;]'; - end; - - procedure create_dummy_coverage_test_1 is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package UT3.DUMMY_COVERAGE_1 is - procedure do_stuff; - end;]'; - execute immediate q'[create or replace package body UT3.DUMMY_COVERAGE_1 is - procedure do_stuff is - begin - if 1 = 2 then - dbms_output.put_line('should not get here'); - else - dbms_output.put_line('should get here'); - end if; - end; - end;]'; - execute immediate q'[create or replace package UT3.TEST_DUMMY_COVERAGE_1 is - --%suite(dummy coverage test 1) - --%suitepath(coverage_testing) - - --%test - procedure test_do_stuff; - end;]'; - execute immediate q'[create or replace package body UT3.TEST_DUMMY_COVERAGE_1 is - procedure test_do_stuff is - begin - dummy_coverage_1.do_stuff; - end; - end;]'; - end; - - procedure drop_dummy_coverage_test_1 is - pragma autonomous_transaction; - begin - execute immediate q'[drop package UT3.DUMMY_COVERAGE_1]'; - execute immediate q'[drop package UT3.TEST_DUMMY_COVERAGE_1]'; - end; - - - procedure mock_coverage_data(a_run_id integer) is - c_unit_id constant integer := 1; - begin - insert into ut3.plsql_profiler_runs ( runid, run_owner, run_date, run_comment) - values(a_run_id, user, sysdate, 'unit testing utPLSQL'); - - insert into ut3.plsql_profiler_units ( runid, unit_number, unit_type, unit_owner, unit_name) - values(a_run_id, c_unit_id, 'PACKAGE BODY', 'UT3', 'DUMMY_COVERAGE'); - - insert into ut3.plsql_profiler_data ( runid, unit_number, line#, total_occur, total_time) - select a_run_id, c_unit_id, 4, 1, 1 from dual union all - select a_run_id, c_unit_id, 5, 0, 0 from dual union all - select a_run_id, c_unit_id, 7, 1, 1 from dual; - end; - - procedure create_dummy_coverage_pkg is - pragma autonomous_transaction; - begin - create_dummy_coverage_package(); - create_dummy_coverage_test(); - end; - - procedure setup_dummy_coverage is - pragma autonomous_transaction; - begin - g_run_id := get_mock_run_id(); - ut3.ut_coverage.mock_coverage_id(g_run_id, ut3.ut_coverage.gc_proftab_coverage); - mock_coverage_data(g_run_id); - commit; - end; - - procedure drop_dummy_coverage_pkg is - pragma autonomous_transaction; - begin - begin execute immediate q'[drop package ut3.test_dummy_coverage]'; exception when others then null; end; - begin execute immediate q'[drop package ut3.dummy_coverage]'; exception when others then null; end; - end; - - procedure cleanup_dummy_coverage is - pragma autonomous_transaction; - begin - delete from ut3.plsql_profiler_data where runid = g_run_id; - delete from ut3.plsql_profiler_units where runid = g_run_id; - delete from ut3.plsql_profiler_runs where runid = g_run_id; - commit; - end; - - procedure coverage_for_object is - l_expected clob; - l_actual clob; - l_results ut3.ut_varchar2_list; - begin - --Arrange - l_expected := '%%'; - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coverage_sonar_reporter( ), - a_include_objects => ut3.ut_varchar2_list( 'ut3.dummy_coverage' ) - ) - ); - --Assert - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - end; - - procedure coverage_for_object_no_owner is - l_expected clob; - l_actual clob; - l_results ut3.ut_varchar2_list; - begin - --Arrange - l_expected := '%%'; - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coverage_sonar_reporter( ), - a_include_objects => ut3.ut_varchar2_list( 'dummy_coverage' ) - ) - ); - --Assert - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - end; - - procedure coverage_for_schema is - l_expected clob; - l_actual clob; - l_results ut3.ut_varchar2_list; - begin - --Arrange - l_expected := ''; - l_expected := '%'||l_expected||'%'||l_expected||'%'; - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coverage_sonar_reporter( ), - a_coverage_schemes => ut3.ut_varchar2_list( 'ut3' ) - ) - ); - --Assert - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - end; - - procedure coverage_for_file is - l_expected clob; - l_actual clob; - l_results ut3.ut_varchar2_list; - l_file_path varchar2(100); - begin - --Arrange - l_file_path := lower('test/ut3.dummy_coverage.pkb'); - l_expected := '%%'; - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coverage_sonar_reporter( ), - a_source_files => ut3.ut_varchar2_list( l_file_path ), - a_test_files => ut3.ut_varchar2_list( ) - ) - ); - --Assert - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - end; - - procedure coverage_tmp_data_refresh is - l_actual clob; - l_results ut3.ut_varchar2_list; - begin - --Arrange - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3:coverage_testing', - a_reporter=> ut3.ut_coverage_sonar_reporter( ), - a_include_objects => ut3.ut_varchar2_list( 'ut3.dummy_coverage' ) - ) - ); - cleanup_dummy_coverage(); - drop_dummy_coverage_pkg(); - create_dummy_coverage_test_1; - - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3:coverage_testing', - a_reporter=> ut3.ut_coverage_sonar_reporter( ), - a_include_objects => ut3.ut_varchar2_list( 'ut3.dummy_coverage' ) - ) - ); - - --Assert - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_equal(to_clob(' - -')); - end; - -end; -/ diff --git a/test/core/reporters/test_coverage.pks b/test/core/reporters/test_coverage.pks deleted file mode 100644 index 51eb175ec..000000000 --- a/test/core/reporters/test_coverage.pks +++ /dev/null @@ -1,40 +0,0 @@ -create or replace package test_coverage is - - --%suite - --%suitepath(utplsql.core.reporters) - - g_run_id integer; - - --%beforeall - procedure create_dummy_coverage_pkg; - --%beforeall - procedure setup_dummy_coverage; - - - --%afterall - procedure drop_dummy_coverage_pkg; - --%afterall - procedure cleanup_dummy_coverage; - - - --%test(Coverage is gathered for specified object - default coverage type) - procedure coverage_for_object; - - --%test(Coverage is gathered for specified schema - default coverage type) - procedure coverage_for_object_no_owner; - - --%test(Coverage is gathered for specified schema) - procedure coverage_for_schema; - - --%test(Coverage is gathered for specified file - default coverage type) - procedure coverage_for_file; - - --%test(Coverage data is not cached between runs - issue #562 ) - --%aftertest(create_dummy_coverage_pkg) - --%aftertest(setup_dummy_coverage) - --%aftertest(drop_dummy_coverage_test_1) - procedure coverage_tmp_data_refresh; - - procedure drop_dummy_coverage_test_1; -end; -/ diff --git a/test/core/reporters/test_coverage/test_cov_cobertura_reporter.pkb b/test/core/reporters/test_coverage/test_cov_cobertura_reporter.pkb deleted file mode 100644 index cabf64e90..000000000 --- a/test/core/reporters/test_coverage/test_cov_cobertura_reporter.pkb +++ /dev/null @@ -1,45 +0,0 @@ -create or replace package body test_cov_cobertura_reporter is - - procedure report_on_file is - l_results ut3.ut_varchar2_list; - l_expected clob; - l_actual clob; - begin - --Arrange - l_expected := - q'[ - - - -test/ut3.dummy_coverage.pkb - - - - - - - - - - - - -]'; - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coverage_cobertura_reporter( ), - a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage.pkb' ), - a_test_files => ut3.ut_varchar2_list( ) - ) - ); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like(l_expected); - end; - -end; -/ diff --git a/test/core/reporters/test_coverage/test_cov_cobertura_reporter.pks b/test/core/reporters/test_coverage/test_cov_cobertura_reporter.pks deleted file mode 100644 index ac347fb9d..000000000 --- a/test/core/reporters/test_coverage/test_cov_cobertura_reporter.pks +++ /dev/null @@ -1,10 +0,0 @@ -create or replace package test_cov_cobertura_reporter is - - --%suite(ut_cov_cobertura_reporter) - --%suitepath(utplsql.core.reporters.test_coverage) - - --%test(reports on a project file mapped to database object) - procedure report_on_file; - -end test_cov_cobertura_reporter; -/ diff --git a/test/core/reporters/test_coverage/test_coverage_sonar_reporter.pkb b/test/core/reporters/test_coverage/test_coverage_sonar_reporter.pkb deleted file mode 100644 index 81b2c12f8..000000000 --- a/test/core/reporters/test_coverage/test_coverage_sonar_reporter.pkb +++ /dev/null @@ -1,39 +0,0 @@ -create or replace package body test_coverage_sonar_reporter is - - procedure report_on_file is - l_results ut3.ut_varchar2_list; - l_expected clob; - l_actual clob; - begin - --Arrange - l_expected := ' - - - - - - -'; - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coverage_sonar_reporter( ), - a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage.pkb' ), - a_test_files => ut3.ut_varchar2_list( ) - ) - ); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_equal(l_expected); - end; - - procedure check_encoding_included is - begin - reporters.check_xml_encoding_included(ut3.ut_coverage_sonar_reporter(), 'UTF-8'); - end; - -end; -/ diff --git a/test/core/reporters/test_coverage/test_coverage_sonar_reporter.pks b/test/core/reporters/test_coverage/test_coverage_sonar_reporter.pks deleted file mode 100644 index 31cb358dd..000000000 --- a/test/core/reporters/test_coverage/test_coverage_sonar_reporter.pks +++ /dev/null @@ -1,13 +0,0 @@ -create or replace package test_coverage_sonar_reporter is - - --%suite(ut_coverge_sonar_reporter) - --%suitepath(utplsql.core.reporters.test_coverage) - - --%test(reports on a project file mapped to database object) - procedure report_on_file; - - --%test(Includes XML header with encoding when encoding provided) - procedure check_encoding_included; - -end; -/ diff --git a/test/core/reporters/test_coverage/test_coveralls_reporter.pkb b/test/core/reporters/test_coverage/test_coveralls_reporter.pkb deleted file mode 100644 index 774e796a0..000000000 --- a/test/core/reporters/test_coverage/test_coveralls_reporter.pkb +++ /dev/null @@ -1,85 +0,0 @@ -create or replace package body test_coveralls_reporter is - - procedure report_on_file is - l_results ut3.ut_varchar2_list; - l_expected clob; - l_actual clob; - begin - --Arrange - l_expected := q'[{"source_files":[ -{ "name": "test/ut3.dummy_coverage.pkb", -"coverage": [ -null, -null, -null, -1, -0, -null, -1 -] -} -]} - ]'; - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coveralls_reporter( ), - a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage.pkb' ), - a_test_files => ut3.ut_varchar2_list( ) - ) - ); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_equal(l_expected); - end; - - procedure report_zero_coverage is - l_results ut3.ut_varchar2_list; - l_expected clob; - l_actual clob; - pragma autonomous_transaction; - begin - --Arrange - l_expected := q'[{"source_files":[ -{ "name": "ut3.dummy_coverage", -"coverage": [ -0, -0, -0, -0, -0, -0, -0, -0, -0, -0 -] -} -]} - ]'; - - test_coverage.cleanup_dummy_coverage; - - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - 'ut3.test_dummy_coverage', - ut3.ut_coveralls_reporter(), - a_include_objects => ut3.ut_varchar2_list('UT3.DUMMY_COVERAGE') - ) - ); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_equal(l_expected); - - test_coverage.setup_dummy_coverage; - - end; - -end; -/ diff --git a/test/core/reporters/test_coverage/test_coveralls_reporter.pks b/test/core/reporters/test_coverage/test_coveralls_reporter.pks deleted file mode 100644 index bf2b861f7..000000000 --- a/test/core/reporters/test_coverage/test_coveralls_reporter.pks +++ /dev/null @@ -1,13 +0,0 @@ -create or replace package test_coveralls_reporter is - - --%suite(ut_coveralls_reporter) - --%suitepath(utplsql.core.reporters.test_coverage) - - --%test(reports on a project file mapped to database object) - procedure report_on_file; - - --%test(reports zero coverage on each line of non-executed database object) - procedure report_zero_coverage; - -end; -/ diff --git a/test/core/reporters/test_coverage/test_html_extended_reporter.pkb b/test/core/reporters/test_coverage/test_html_extended_reporter.pkb deleted file mode 100644 index 19e1fe807..000000000 --- a/test/core/reporters/test_coverage/test_html_extended_reporter.pkb +++ /dev/null @@ -1,29 +0,0 @@ -create or replace package body test_html_extended_reporter is - - procedure report_on_file is - l_results ut3.ut_varchar2_list; - l_expected varchar2(32767); - l_actual clob; - l_charset varchar2(100) := 'ISO-8859-1'; - begin - --Arrange - l_expected := '%%

UT3.DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG

%4 relevant lines. 3 lines covered (including 1 lines partially covered ) and 1 lines missed%'; - - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coverage_html_reporter(), - a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage_package_with_an_amazingly_long_name_that_you_would_not_think_of_in_real_life_project_because_its_simply_too_long.pkb' ), - a_test_files => ut3.ut_varchar2_list( ), - a_client_character_set => l_charset - ) - ); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like(l_expected); - end; - -end test_html_extended_reporter; -/ diff --git a/test/core/reporters/test_coverage/test_html_extended_reporter.pks b/test/core/reporters/test_coverage/test_html_extended_reporter.pks deleted file mode 100644 index cefa71d66..000000000 --- a/test/core/reporters/test_coverage/test_html_extended_reporter.pks +++ /dev/null @@ -1,10 +0,0 @@ -create or replace package test_html_extended_reporter is - - --%suite(ut_html_extended_reporter) - --%suitepath(utplsql.core.reporters.test_extended_coverage) - - --%test(reports on a project file mapped to database object in extended profiler coverage) - procedure report_on_file; - -end test_html_extended_reporter; -/ diff --git a/test/core/reporters/test_coverage/test_html_proftab_reporter.pkb b/test/core/reporters/test_coverage/test_html_proftab_reporter.pkb deleted file mode 100644 index c10af2869..000000000 --- a/test/core/reporters/test_coverage/test_html_proftab_reporter.pkb +++ /dev/null @@ -1,29 +0,0 @@ -create or replace package body test_html_proftab_reporter is - - procedure report_on_file is - l_results ut3.ut_varchar2_list; - l_expected varchar2(32767); - l_actual clob; - l_charset varchar2(100) := 'ISO-8859-1'; - begin - --Arrange - l_expected := '%%

UT3.DUMMY_COVERAGE

%3 relevant lines. 2 lines covered and 1 lines missed%'; - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coverage_html_reporter(), - a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage.pkb' ), - a_test_files => ut3.ut_varchar2_list( ), - a_client_character_set => l_charset - ) - ); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like(l_expected); - end; - -end test_html_proftab_reporter; -/ diff --git a/test/core/reporters/test_coverage/test_html_proftab_reporter.pks b/test/core/reporters/test_coverage/test_html_proftab_reporter.pks deleted file mode 100644 index d091510c6..000000000 --- a/test/core/reporters/test_coverage/test_html_proftab_reporter.pks +++ /dev/null @@ -1,10 +0,0 @@ -create or replace package test_html_proftab_reporter is - - --%suite(ut_html_proftab_reporter) - --%suitepath(utplsql.core.reporters.test_coverage) - - --%test(reports on a project file mapped to database object in profiler coverage) - procedure report_on_file; - -end test_html_proftab_reporter; -/ diff --git a/test/core/reporters/test_debug_reporter.pkb b/test/core/reporters/test_debug_reporter.pkb deleted file mode 100644 index d82685ac4..000000000 --- a/test/core/reporters/test_debug_reporter.pkb +++ /dev/null @@ -1,45 +0,0 @@ -create or replace package body test_debug_reporter as - - g_actual clob; - - procedure run_reporter is - l_results ut3.ut_varchar2_list; - begin - select * - bulk collect into l_results - from table( - ut3.ut.run( - 'test_reporters', - ut3.ut_debug_reporter() - ) - ); - g_actual := ut3.ut_utils.table_to_clob(l_results); - end; - - procedure includes_event_info is - l_expected varchar2(32767); - begin - l_expected := '\s+' || - '(\s+' || - '[0-9\-]+T[0-9:\.]+<\/TIMESTAMP>\s+' || - '[0-9 \+:\.]+<\/TIME_FROM_START>\s+' || - '[0-9 \+:\.]+<\/TIME_FROM_PREVIOUS>\s+' || - '\w+<\/EVENT_NAME>\s+' || - '(\s|\S)+?<\/CALL_STACK>(\s|\S)+?' || - '<\/DEBUG>\s+)+' || - '<\/DEBUG_LOG>'; - ut.expect( g_actual ).to_match( l_expected, 'm' ); - end; - - procedure includes_run_info is - l_expected varchar2(32767); - begin - l_expected := '(\s|\S)+?(\s|\S)+?<\/UT_RUN_INFO>\s+<\/DEBUG>'; - ut.expect( g_actual ).to_match( l_expected, 'm' ); - end; - - -end; -/ - - diff --git a/test/core/reporters/test_debug_reporter.pks b/test/core/reporters/test_debug_reporter.pks deleted file mode 100644 index d4ba20a62..000000000 --- a/test/core/reporters/test_debug_reporter.pks +++ /dev/null @@ -1,16 +0,0 @@ -create or replace package test_debug_reporter as - - --%suite(ut_debug_reporter) - --%suitepath(utplsql.core.reporters) - - --%beforeall - procedure run_reporter; - - --%test(Includes event info for every event) - procedure includes_event_info; - - --%test(Includes run info) - procedure includes_run_info; - -end; -/ diff --git a/test/core/reporters/test_documentation_reporter.pkb b/test/core/reporters/test_documentation_reporter.pkb deleted file mode 100644 index 7045aa7ca..000000000 --- a/test/core/reporters/test_documentation_reporter.pkb +++ /dev/null @@ -1 +0,0 @@ -create or replace package body test_documentation_reporter as procedure report_produces_expected_out is l_results ut3.ut_varchar2_list; l_actual clob; l_expected varchar2(32767):=q'[%org utplsql tests helpers A suite for testing different outcomes from reporters A description of some context passing_test [% sec] a test with failing assertion [% sec] (FAILED - 1) a test raising unhandled exception [% sec] (FAILED - 2) a disabled test [0 sec] (DISABLED) % Failures: % 1) failing_test "Fails as values are different" Actual: 'number [1] ' (varchar2) was expected to equal: 'number [2] ' (varchar2)% at "UT3_TESTER.TEST_REPORTERS%", line 36 ut3.ut.expect('number [1] ','Fails as values are different').to_equal('number [2] '); % % 2) erroring_test ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at "UT3_TESTER.TEST_REPORTERS", line 44% ORA-06512: at line 6 Finished in % seconds 4 tests, 1 failed, 1 errored, 1 disabled, 0 warning(s)%]'; begin select * bulk collect into l_results from table( ut3.ut.run( 'test_reporters', ut3.ut_documentation_reporter() ) ); l_actual := ut3.ut_utils.table_to_clob(l_results); ut.expect(l_actual).to_be_like(l_expected); end; procedure check_encoding_included is begin reporters.check_xml_encoding_included(ut3.ut_sonar_test_reporter(), 'UTF-8'); end; end; / \ No newline at end of file diff --git a/test/core/reporters/test_documentation_reporter.pks b/test/core/reporters/test_documentation_reporter.pks deleted file mode 100644 index 09835abdc..000000000 --- a/test/core/reporters/test_documentation_reporter.pks +++ /dev/null @@ -1,10 +0,0 @@ -create or replace package test_documentation_reporter as - - --%suite(ut_documentation_reporter) - --%suitepath(utplsql.core.reporters) - - --%test(Report produces expected output) - procedure report_produces_expected_out; - -end; -/ diff --git a/test/core/reporters/test_extended_coverage.pkb b/test/core/reporters/test_extended_coverage.pkb deleted file mode 100644 index a3719e503..000000000 --- a/test/core/reporters/test_extended_coverage.pkb +++ /dev/null @@ -1,188 +0,0 @@ -create or replace package body test_extended_coverage is - - g_run_id ut3.ut_coverage.tt_coverage_id_arr; - - function get_mock_block_run_id return integer is - v_result integer; - begin - select nvl(min(run_id),0) - 1 into v_result - from dbmspcc_runs; - return v_result; - end; - - function get_mock_proftab_run_id return integer is - v_result integer; - begin - select nvl(min(runid),0) - 1 into v_result - from ut3.plsql_profiler_runs; - return v_result; - end; - - procedure create_dummy_coverage_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package UT3.DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG is - procedure do_stuff(i_input in number); - end;]'; - execute immediate q'[create or replace package body UT3.DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG is - procedure do_stuff(i_input in number) is - begin - if i_input = 2 then - dbms_output.put_line('should not get here'); - else - dbms_output.put_line('should get here'); - end if; - end; - end;]'; - end; - - procedure create_dummy_coverage_test is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package UT3.TEST_DUMMY_COVERAGE is - --%suite(dummy coverage test) - --%suitepath(coverage_testing) - - --%test - procedure test_do_stuff; - end;]'; - execute immediate q'[create or replace package body UT3.TEST_DUMMY_COVERAGE is - procedure test_do_stuff is - begin - dummy_coverage_package_with_an_amazingly_long_name_that_you_would_not_think_of_in_real_life_project_because_its_simply_too_long.do_stuff(1); - ut.expect(1).to_equal(1); - end; - end;]'; - end; - - procedure mock_block_coverage_data(a_run_id integer) is - c_unit_id constant integer := 1; - begin - insert into dbmspcc_runs ( run_id, run_owner, run_timestamp, run_comment) - values(a_run_id, user, sysdate, 'unit testing utPLSQL'); - - insert into dbmspcc_units ( run_id, object_id, type, owner, name,last_ddl_time) - values(a_run_id, c_unit_id, 'PACKAGE BODY', 'UT3', 'DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG',sysdate); - - insert into dbmspcc_blocks ( run_id, object_id, line,block,col,covered,not_feasible) - select a_run_id, c_unit_id,4,1,1,1,0 from dual union all - select a_run_id, c_unit_id,4,2,2,0,0 from dual union all - select a_run_id, c_unit_id,5,3,0,1,0 from dual union all - select a_run_id, c_unit_id,7,4,1,1,0 from dual; - end; - - procedure mock_profiler_coverage_data(a_run_id integer) is - c_unit_id constant integer := 1; - begin - insert into ut3.plsql_profiler_runs ( runid, run_owner, run_date, run_comment) - values(a_run_id, user, sysdate, 'unit testing utPLSQL'); - - insert into ut3.plsql_profiler_units ( runid, unit_number, unit_type, unit_owner, unit_name) - values(a_run_id, c_unit_id, 'PACKAGE BODY', 'UT3', 'DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG'); - - insert into ut3.plsql_profiler_data ( runid, unit_number, line#, total_occur, total_time) - select a_run_id, c_unit_id, 4, 1, 1 from dual union all - select a_run_id, c_unit_id, 5, 0, 0 from dual union all - select a_run_id, c_unit_id, 6, 1, 0 from dual union all - select a_run_id, c_unit_id, 7, 1, 1 from dual; - end; - - procedure setup_dummy_coverage is - pragma autonomous_transaction; - begin - create_dummy_coverage_package(); - create_dummy_coverage_test(); - g_run_id(ut3.ut_coverage.gc_block_coverage) := get_mock_block_run_id(); - g_run_id(ut3.ut_coverage.gc_proftab_coverage) := get_mock_proftab_run_id(); - ut3.ut_coverage.mock_coverage_id(g_run_id); - mock_block_coverage_data(g_run_id(ut3.ut_coverage.gc_block_coverage)); - mock_profiler_coverage_data(g_run_id(ut3.ut_coverage.gc_proftab_coverage)); - commit; - end; - - procedure cleanup_dummy_coverage is - pragma autonomous_transaction; - begin - begin execute immediate q'[drop package ut3.test_dummy_coverage]'; exception when others then null; end; - begin execute immediate q'[drop package ut3.dummy_coverage_package_with_an_amazingly_long_name_that_you_would_not_think_of_in_real_life_project_because_its_simply_too_long]'; exception when others then null; end; - delete from dbmspcc_blocks where run_id = g_run_id(ut3.ut_coverage.gc_block_coverage); - delete from dbmspcc_units where run_id = g_run_id(ut3.ut_coverage.gc_block_coverage); - delete from dbmspcc_runs where run_id = g_run_id(ut3.ut_coverage.gc_block_coverage); - delete from ut3.plsql_profiler_data where runid = g_run_id(ut3.ut_coverage.gc_proftab_coverage); - delete from ut3.plsql_profiler_units where runid = g_run_id(ut3.ut_coverage.gc_proftab_coverage); - delete from ut3.plsql_profiler_runs where runid = g_run_id(ut3.ut_coverage.gc_proftab_coverage); - commit; - end; - - procedure coverage_for_object is - l_expected clob; - l_actual clob; - l_results ut3.ut_varchar2_list; - begin - --Arrange - l_expected := '%%%'; - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coverage_sonar_reporter( ), - a_include_objects => ut3.ut_varchar2_list( 'ut3.dummy_coverage_package_with_an_amazingly_long_name_that_you_would_not_think_of_in_real_life_project_because_its_simply_too_long' ) - ) - ); - --Assert - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - end; - - procedure coverage_for_schema is - l_expected clob; - l_actual clob; - l_results ut3.ut_varchar2_list; - begin - --Arrange - l_expected := '%%%'; - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coverage_sonar_reporter( ), - a_coverage_schemes => ut3.ut_varchar2_list( 'ut3' ) - ) - ); - --Assert - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - ut.expect(l_actual).to_be_like('%%%'); - end; - - procedure coverage_for_file is - l_expected clob; - l_actual clob; - l_results ut3.ut_varchar2_list; - l_file_path varchar2(250); - begin - --Arrange - l_file_path := lower('test/ut3.dummy_coverage_package_with_an_amazingly_long_name_that_you_would_not_think_of_in_real_life_project_because_its_simply_too_long.pkb'); - l_expected := '%%%'; - --Act - select * - bulk collect into l_results - from table( - ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', - a_reporter=> ut3.ut_coverage_sonar_reporter( ), - a_source_files => ut3.ut_varchar2_list( l_file_path ), - a_test_files => ut3.ut_varchar2_list( ) - ) - ); - --Assert - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - end; - -end; -/ diff --git a/test/core/reporters/test_extended_coverage.pks b/test/core/reporters/test_extended_coverage.pks deleted file mode 100644 index 6d85a4a30..000000000 --- a/test/core/reporters/test_extended_coverage.pks +++ /dev/null @@ -1,22 +0,0 @@ -create or replace package test_extended_coverage is - - --%suite - --%suitepath(utplsql.core.reporters) - - --%beforeall - procedure setup_dummy_coverage; - - --%afterall - procedure cleanup_dummy_coverage; - - --%test(Coverage is gathered for specified object - extended coverage type) - procedure coverage_for_object; - - --%test(Coverage is gathered for specified schema - extended coverage type) - procedure coverage_for_schema; - - --%test(Coverage is gathered for specified file - extended coverage type) - procedure coverage_for_file; - -end; -/ diff --git a/test/core/reporters/test_junit_reporter.pkb b/test/core/reporters/test_junit_reporter.pkb deleted file mode 100644 index e0a7ea00d..000000000 --- a/test/core/reporters/test_junit_reporter.pkb +++ /dev/null @@ -1,353 +0,0 @@ -create or replace package body test_junit_reporter as - - procedure create_a_test_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package check_junit_reporting is - --%suite(A suite with ) - - --%test(A test with ) - procedure test_do_stuff; - - end;]'; - execute immediate q'[create or replace package body check_junit_reporting is - procedure test_do_stuff is - begin - ut3.ut.expect(1).to_equal(1); - ut3.ut.expect(1).to_equal(2); - end; - - end;]'; - - execute immediate q'[create or replace package check_junit_rep_suitepath is - --%suitepath(core) - --%suite(check_junit_rep_suitepath) - --%displayname(Check junit Get path for suitepath) - - --%test(check_junit_rep_suitepath) - --%displayname(Check junit Get path for suitepath) - procedure check_junit_rep_suitepath; - end;]'; - execute immediate q'[create or replace package body check_junit_rep_suitepath is - procedure check_junit_rep_suitepath is - begin - ut3.ut.expect(1).to_equal(1); - end; - end;]'; - - - execute immediate q'[create or replace package tst_package_junit_nodesc as - --%suite(Suite name) - - --%test - procedure test1; - - --%test(Test name) - procedure test2; - end;]'; - - execute immediate q'[create or replace package body tst_package_junit_nodesc as - procedure test1 is begin ut.expect(1).to_equal(1); end; - procedure test2 is begin ut.expect(1).to_equal(1); end; - end;]'; - - execute immediate q'[create or replace package tst_package_junit_nosuite as - --%suite - - --%test(Test name) - procedure test1; - end;]'; - - execute immediate q'[create or replace package body tst_package_junit_nosuite as - procedure test1 is begin ut.expect(1).to_equal(1); end; - end;]'; - - execute immediate q'[create or replace package Tst_Fix_Case_Sensitive as - --%suite - - --%test(bugfix) - procedure bUgFiX; - end;]'; - - execute immediate q'[create or replace package body Tst_Fix_Case_Sensitive as - procedure bUgFiX is begin ut.expect(1).to_equal(1); end; - end;]'; - - execute immediate q'[create or replace package check_fail_escape is - --%suitepath(core) - --%suite(checkfailedescape) - --%displayname(Check JUNIT XML failure is escaped) - - --%test(Fail Miserably) - procedure fail_miserably; - - end;]'; - - execute immediate q'[create or replace package body check_fail_escape is - procedure fail_miserably is - begin - ut3.ut.expect('test').to_equal(''); - end; - end;]'; - - end; - - procedure escapes_special_chars is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting',ut3.ut_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).not_to_be_like('%%'); - ut.expect(l_actual).to_be_like('%<tag>%'); - end; - - procedure reports_only_failed_or_errored is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting',ut3.ut_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).not_to_be_like('%Actual: 1 (number) was expected to equal: 1 (number)%'); - ut.expect(l_actual).to_be_like('%Actual: 1 (number) was expected to equal: 2 (number)%'); - end; - - procedure reports_xunit_only_fail_or_err is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting',ut3.ut_xunit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).not_to_be_like('%Actual: 1 (number) was expected to equal: 1 (number)%'); - ut.expect(l_actual).to_be_like('%Actual: 1 (number) was expected to equal: 2 (number)%'); - end; - - procedure reports_failed_line is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting',ut3.ut_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%at "%.CHECK_JUNIT_REPORTING%", line %'); - end; - - procedure check_classname_suite is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting',ut3.ut_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%testcase classname="check_junit_reporting" assertions="%" name="%"%'); - end; - - procedure check_nls_number_formatting is - l_results ut3.ut_varchar2_list; - l_actual clob; - l_nls_numeric_characters varchar2(30); - begin - --Arrange - select replace(nsp.value,'''','''''') into l_nls_numeric_characters - from nls_session_parameters nsp - where parameter = 'NLS_NUMERIC_CHARACTERS'; - execute immediate q'[alter session set NLS_NUMERIC_CHARACTERS=', ']'; - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting', ut3.ut_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_match('time="[0-9]*\.[0-9]{3,6}"'); - --Cleanup - execute immediate 'alter session set NLS_NUMERIC_CHARACTERS='''||l_nls_numeric_characters||''''; - end; - - procedure check_classname_suitepath is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_rep_suitepath',ut3.ut_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%testcase classname="core.check_junit_rep_suitepath" assertions="%" name="%"%'); - end; - - procedure report_test_without_desc is - l_results ut3.ut_varchar2_list; - l_actual clob; - l_expected varchar2(32767):= q'[ - - - - - - - - - - - - - -]'; - begin - select * - bulk collect into l_results - from table(ut3.ut.run('tst_package_junit_nodesc',ut3.ut_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - end; - - procedure report_suite_without_desc is - l_results ut3.ut_varchar2_list; - l_actual clob; - l_expected varchar2(32767):= q'[ - - - - - - - - - -]'; - begin - select * - bulk collect into l_results - from table(ut3.ut.run('tst_package_junit_nosuite',ut3.ut_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - end; - - procedure reporort_produces_expected_out is - l_results ut3.ut_varchar2_list; - l_actual clob; - l_expected varchar2(32767):=q'[ - - - - - - - - -% - - - - - - - -%Fails as values are different% - -% - - - - -%ORA-06502:% - -% - - - - - - - - -% - - - - - - - -]'; - - begin - select * - bulk collect into l_results - from table(ut3.ut.run('test_reporters',ut3.ut_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - end; - - procedure check_failure_escaped is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_fail_escape',ut3.ut_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%Actual: 'test' (varchar2) was expected to equal: '<![CDATA[some stuff]]>' (varchar2)%'); - end; - - procedure check_classname_is_populated is - l_results ut3.ut_varchar2_list; - l_actual clob; - l_expected varchar2(32767):= q'[ - - - - - - - - - -]'; - begin - select * - bulk collect into l_results - from table(ut3.ut.run('Tst_Fix_Case_Sensitive',ut3.ut_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - end; - - procedure check_encoding_included is - begin - reporters.check_xml_encoding_included(ut3.ut_junit_reporter(), 'UTF-8'); - end; - - procedure remove_test_package is - pragma autonomous_transaction; - begin - execute immediate 'drop package check_junit_reporting'; - execute immediate 'drop package check_junit_rep_suitepath'; - execute immediate 'drop package tst_package_junit_nodesc'; - execute immediate 'drop package tst_package_junit_nosuite'; - execute immediate 'drop package check_fail_escape'; - execute immediate 'drop package Tst_Fix_Case_Sensitive'; - end; - -end; -/ diff --git a/test/core/reporters/test_junit_reporter.pks b/test/core/reporters/test_junit_reporter.pks deleted file mode 100644 index b39c5ff03..000000000 --- a/test/core/reporters/test_junit_reporter.pks +++ /dev/null @@ -1,51 +0,0 @@ -create or replace package test_junit_reporter as - - --%suite(ut_junit_reporter) - --%suitepath(utplsql.core.reporters) - - --%beforeall - procedure create_a_test_package; - - --%test(Escapes special characters from test and suite description) - procedure escapes_special_chars; - - --%test(Reports only failed expectations and exceptions) - procedure reports_only_failed_or_errored; - - --%test(Xunit Backward Compatibility - Reports only failed expectations and exceptions) - procedure reports_xunit_only_fail_or_err; - - --%test(Reports failed line of test) - procedure reports_failed_line; - - --%test(Check that classname is returned correct suite) - procedure check_classname_suite; - - --%test(Check that classname is returned correct suitepath) - procedure check_classname_suitepath; - - --%test(Reports duration according to XML specification for numbers) - procedure check_nls_number_formatting; - - --%test(Report on test without description) - procedure report_test_without_desc; - - --%test(Report on suite without description) - procedure report_suite_without_desc; - - --%test(Report produces expected output) - procedure reporort_produces_expected_out; - - --%test( Check classname is populated when procedure is mixed cased - bug #659) - procedure check_classname_is_populated; - - --%test( Validate that fail with special char are escaped ) - procedure check_failure_escaped; - - --%test(Includes XML header with encoding when encoding provided) - procedure check_encoding_included; - - --%afterall - procedure remove_test_package; -end; -/ diff --git a/test/core/reporters/test_realtime_reporter.pkb b/test/core/reporters/test_realtime_reporter.pkb deleted file mode 100644 index c4ceb9d5d..000000000 --- a/test/core/reporters/test_realtime_reporter.pkb +++ /dev/null @@ -1,401 +0,0 @@ -create or replace package body test_realtime_reporter as - - g_events test_event_list := test_event_list(); - - procedure create_test_suites_and_run is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package check_realtime_reporting1 is - --%suite(suite ) - --%suitepath(realtime_reporting) - - --%context(test context) - - --%test(test 1 - OK) - procedure test_1_ok; - - --%test(test 2 - NOK) - procedure test_2_nok; - - --%endcontext - end;]'; - execute immediate q'[create or replace package body check_realtime_reporting1 is - procedure test_1_ok is - begin - ut3.ut.expect(1).to_equal(1); - end; - - procedure test_2_nok is - begin - ut3.ut.expect(1).to_equal(2); - end; - end;]'; - - execute immediate q'[create or replace package check_realtime_reporting2 is - --%suite - --%suitepath(realtime_reporting) - - --%test - procedure test_3_ok; - - --%test - procedure test_4_nok; - - --%test - --%disabled - procedure test_5; - end;]'; - execute immediate q'[create or replace package body check_realtime_reporting2 is - procedure test_3_ok is - begin - ut3.ut.expect(2).to_equal(2); - end; - - procedure test_4_nok is - begin - ut3.ut.expect(2).to_equal(3); - ut3.ut.expect(2).to_equal(4); - end; - - procedure test_5 is - begin - null; - end; - end;]'; - - execute immediate q'[create or replace package check_realtime_reporting3 is - --%suite - --%suitepath(realtime_reporting) - - --%test - procedure test_6_with_runtime_error; - - --%test - procedure test_7_with_serveroutput; - - --%afterall - procedure print_and_raise; - end;]'; - execute immediate q'[create or replace package body check_realtime_reporting3 is - procedure test_6_with_runtime_error is - l_actual integer; - begin - execute immediate 'select 6 from non_existing_table' into l_actual; - ut3.ut.expect(6).to_equal(l_actual); - end; - - procedure test_7_with_serveroutput is - begin - dbms_output.put_line('before test 7'); - ut3.ut.expect(7).to_equal(7); - dbms_output.put_line('after test 7'); - end; - - procedure print_and_raise is - begin - dbms_output.put_line('Now, a no_data_found exception is raised'); - dbms_output.put_line('dbms_output and error stack is reported for this suite.'); - dbms_output.put_line('A runtime error in afterall is counted as a warning.'); - raise no_data_found; - end; - end;]'; - - <> - declare - l_reporter ut3.ut_realtime_reporter := ut3.ut_realtime_reporter(); - begin - -- produce - ut3.ut_runner.run( - a_paths => ut3.ut_varchar2_list(':realtime_reporting'), - a_reporters => ut3.ut_reporters(l_reporter) - ); - -- consume - select test_event_object(item_type, xmltype(text)) - bulk collect into g_events - from table(ut3.ut_output_table_buffer(l_reporter.output_buffer.output_id).get_lines()) - where trim(text) is not null and item_type is not null; - end run_report_and_cache_result; - end create_test_suites_and_run; - - procedure xml_report_structure is - l_actual sys_refcursor; - l_expected sys_refcursor; - begin - open l_actual for - select t.event_doc.extract('/event/@type').getstringval() as event_type, - t.event_doc.extract('/event/suite/@id|/event/test/@id').getstringval() as item_id - from table(g_events) t; - open l_expected for - select 'pre-run' as event_type, null as item_id from dual union all - select 'pre-suite' as event_type, 'realtime_reporting' as item_id from dual union all - select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting3' as item_id from dual union all - select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error' as item_id from dual union all - select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error' as item_id from dual union all - select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_7_with_serveroutput' as item_id from dual union all - select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_7_with_serveroutput' as item_id from dual union all - select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting3' as item_id from dual union all - select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting2' as item_id from dual union all - select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_3_ok' as item_id from dual union all - select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_3_ok' as item_id from dual union all - select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_4_nok' as item_id from dual union all - select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_4_nok' as item_id from dual union all - select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_5' as item_id from dual union all - select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_5' as item_id from dual union all - select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting2' as item_id from dual union all - select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting1' as item_id from dual union all - select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting1.test context' as item_id from dual union all - select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_1_ok' as item_id from dual union all - select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_1_ok' as item_id from dual union all - select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_2_nok' as item_id from dual union all - select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_2_nok' as item_id from dual union all - select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting1.test context' as item_id from dual union all - select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting1' as item_id from dual union all - select 'post-suite' as event_type, 'realtime_reporting' as item_id from dual union all - select 'post-run' as event_type, null as item_id from dual; - ut.expect(l_actual).to_equal(l_expected); - end xml_report_structure; - - procedure pre_run_composite_nodes is - l_actual sys_refcursor; - l_expected sys_refcursor; - begin - open l_actual for - select x.node_path - from table(g_events) t, - xmltable( - q'[ - for $i in //(event|items|suite|test) - return {$i/string-join(ancestor-or-self::*/name(.), '/')} - ]' - passing t.event_doc - columns node_path varchar2(128) path '.' - ) x - where event_type = 'pre-run'; - open l_expected for - select 'event' as node_path from dual union all - select 'event/items' as node_path from dual union all - select 'event/items/suite' as node_path from dual union all - select 'event/items/suite/items' as node_path from dual union all - select 'event/items/suite/items/suite' as node_path from dual union all - select 'event/items/suite/items/suite/items' as node_path from dual union all - select 'event/items/suite/items/suite/items/test' as node_path from dual union all - select 'event/items/suite/items/suite/items/test' as node_path from dual union all - select 'event/items/suite/items/suite' as node_path from dual union all - select 'event/items/suite/items/suite/items' as node_path from dual union all - select 'event/items/suite/items/suite/items/test' as node_path from dual union all - select 'event/items/suite/items/suite/items/test' as node_path from dual union all - select 'event/items/suite/items/suite/items/test' as node_path from dual union all - select 'event/items/suite/items/suite' as node_path from dual union all - select 'event/items/suite/items/suite/items' as node_path from dual union all - select 'event/items/suite/items/suite/items/suite' as node_path from dual union all - select 'event/items/suite/items/suite/items/suite/items' as node_path from dual union all - select 'event/items/suite/items/suite/items/suite/items/test' as node_path from dual union all - select 'event/items/suite/items/suite/items/suite/items/test' as node_path from dual; - ut.expect(l_actual).to_equal(l_expected); - end pre_run_composite_nodes; - - procedure total_number_of_tests is - l_actual integer; - l_expected integer := 7; - begin - select t.event_doc.extract('/event/totalNumberOfTests/text()').getnumberval() - into l_actual - from table(g_events) t - where t.event_type = 'pre-run'; - ut.expect(l_actual).to_equal(l_expected); - end total_number_of_tests; - - procedure execution_time_of_run is - l_actual number; - begin - select t.event_doc.extract('/event/run/executionTime/text()').getnumberval() - into l_actual - from table(g_events) t - where t.event_type = 'post-run'; - ut.expect(l_actual).to_be_not_null; - end execution_time_of_run; - - procedure escaped_characters is - l_actual varchar2(32767); - l_expected varchar2(20) := 'suite <A>'; - begin - select t.event_doc.extract( - '//suite[@id="realtime_reporting.check_realtime_reporting1"]/description/text()' - ).getstringval() - into l_actual - from table(g_events) t - where t.event_type = 'pre-run'; - ut.expect(l_actual).to_equal(l_expected); - end escaped_characters; - - procedure pre_test_nodes is - l_actual sys_refcursor; - l_expected sys_refcursor; - begin - open l_actual for - select t.event_doc.extract('//test/testNumber/text()') - .getnumberval() as test_number, - t.event_doc.extract('//test/totalNumberOfTests/text()') - .getnumberval() as total_number_of_tests - from table(g_events) t - where t.event_type = 'pre-test' - and t.event_doc.extract('//test/@id').getstringval() is not null; - open l_expected for - select level as test_number, - 7 as total_number_of_tests - from dual - connect by level <= 7; - ut.expect(l_actual).to_equal(l_expected).unordered; - end pre_test_nodes; - - procedure post_test_nodes is - l_actual sys_refcursor; - l_expected sys_refcursor; - begin - open l_actual for - select t.event_doc.extract('//test/testNumber/text()') - .getnumberval() as test_number, - t.event_doc.extract('//test/totalNumberOfTests/text()') - .getnumberval() as total_number_of_tests - from table(g_events) t - where t.event_type = 'post-test' - and t.event_doc.extract('//test/@id').getstringval() is not null - and t.event_doc.extract('//test/startTime/text()').getstringval() is not null - and t.event_doc.extract('//test/endTime/text()').getstringval() is not null - and t.event_doc.extract('//test/executionTime/text()').getnumberval() is not null - and t.event_doc.extract('//test/counter/disabled/text()').getnumberval() is not null - and t.event_doc.extract('//test/counter/success/text()').getnumberval() is not null - and t.event_doc.extract('//test/counter/failure/text()').getnumberval() is not null - and t.event_doc.extract('//test/counter/error/text()').getnumberval() is not null - and t.event_doc.extract('//test/counter/warning/text()').getnumberval() is not null; - open l_expected for - select level as test_number, - 7 as total_number_of_tests - from dual - connect by level <= 7; - ut.expect(l_actual).to_equal(l_expected).unordered; - end post_test_nodes; - - procedure single_failed_message is - l_actual varchar2(32767); - l_expected varchar2(80) := ''; - begin - select t.event_doc.extract( - '/event/test/failedExpectations/expectation[1]/message/text()' - ).getstringval() - into l_actual - from table(g_events) t - where t.event_doc.extract('/event[@type="post-test"]/test/@id').getstringval() - = 'realtime_reporting.check_realtime_reporting1.test context.test_2_nok'; - ut.expect(l_actual).to_equal(l_expected); - end single_failed_message; - - procedure multiple_failed_messages is - l_actual integer; - l_expected integer := 2; - begin - select count(*) - into l_actual - from table(g_events) t, - xmltable( - '/event/test/failedExpectations/expectation' - passing t.event_doc - columns message clob path 'message', - caller clob path 'caller' - ) x - where t.event_doc.extract('/event[@type="post-test"]/test/@id').getstringval() - = 'realtime_reporting.check_realtime_reporting2.test_4_nok' - and x.message is not null - and x.caller is not null; - ut.expect(l_actual).to_equal(l_expected); - end multiple_failed_messages; - - procedure serveroutput_of_test is - l_actual clob; - l_expected_list ut3.ut_varchar2_list; - l_expected clob; - begin - select t.event_doc.extract('//event/test/serverOutput/text()').getstringval() - into l_actual - from table(g_events) t - where t.event_doc.extract('/event[@type="post-test"]/test/@id').getstringval() - = 'realtime_reporting.check_realtime_reporting3.test_7_with_serveroutput'; - ut3.ut_utils.append_to_list(l_expected_list, ''); - l_expected := ut3.ut_utils.table_to_clob(l_expected_list); - ut.expect(l_actual).to_equal(l_expected); - end serveroutput_of_test; - - procedure serveroutput_of_testsuite is - l_actual clob; - l_expected_list ut3.ut_varchar2_list; - l_expected clob; - begin - select t.event_doc.extract('//event/suite/serverOutput/text()').getstringval() - into l_actual - from table(g_events) t - where t.event_doc.extract('/event[@type="post-suite"]/suite/@id').getstringval() - = 'realtime_reporting.check_realtime_reporting3'; - ut3.ut_utils.append_to_list(l_expected_list, ''); - l_expected := ut3.ut_utils.table_to_clob(l_expected_list); - ut.expect(l_actual).to_equal(l_expected); - end serveroutput_of_testsuite; - - procedure error_stack_of_test is - l_actual clob; - l_expected_list ut3.ut_varchar2_list; - l_expected clob; - begin - select t.event_doc.extract('//event/test/errorStack/text()').getstringval() - into l_actual - from table(g_events) t - where t.event_doc.extract('/event[@type="post-test"]/test/@id').getstringval() - = 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error'; - ut3.ut_utils.append_to_list(l_expected_list, ''); - l_expected := ut3.ut_utils.table_to_clob(l_expected_list); - ut.expect(l_actual).to_be_like(l_expected); - end error_stack_of_test; - - procedure error_stack_of_testsuite is - l_actual clob; - l_expected_list ut3.ut_varchar2_list; - l_expected clob; - begin - select t.event_doc.extract('//event/suite/errorStack/text()').getstringval() - into l_actual - from table(g_events) t - where t.event_doc.extract('/event[@type="post-suite"]/suite/@id').getstringval() - = 'realtime_reporting.check_realtime_reporting3'; - ut3.ut_utils.append_to_list(l_expected_list, ''); - l_expected := ut3.ut_utils.table_to_clob(l_expected_list); - ut.expect(l_actual).to_be_like(l_expected); - end error_stack_of_testsuite; - - procedure get_description is - l_reporter ut3.ut_realtime_reporter; - l_actual varchar2(4000); - l_expected varchar2(80) := '%SQL Developer%'; - begin - l_reporter := ut3.ut_realtime_reporter(); - l_actual := l_reporter.get_description(); - ut.expect(l_actual).to_be_like(l_expected); - end get_description; - - procedure remove_test_suites is - pragma autonomous_transaction; - begin - execute immediate 'drop package check_realtime_reporting1'; - execute immediate 'drop package check_realtime_reporting2'; - execute immediate 'drop package check_realtime_reporting3'; - end remove_test_suites; - -end test_realtime_reporter; -/ diff --git a/test/core/reporters/test_realtime_reporter.pks b/test/core/reporters/test_realtime_reporter.pks deleted file mode 100644 index b59313895..000000000 --- a/test/core/reporters/test_realtime_reporter.pks +++ /dev/null @@ -1,55 +0,0 @@ -create or replace package test_realtime_reporter as - - --%suite(ut_realtime_reporter) - --%suitepath(utplsql.core.reporters) - - --%beforeall - procedure create_test_suites_and_run; - - --%test(Provide a report structure with pre-run information and event based messages per suite and per test) - procedure xml_report_structure; - - --%test(Provide the total number of tests as part of the pre-run information structure) - procedure total_number_of_tests; - - --%test(Provide composite structure for items, an item is either a suite or a test, suites may have nested items) - procedure pre_run_composite_nodes; - - --%test(Provide the execution time as part of the post-run information structure) - procedure execution_time_of_run; - - --%test(Escape special characters in data such as the test suite description) - procedure escaped_characters; - - --%test(Provide a node before starting a test with testNumber and totalNumberOfTests) - procedure pre_test_nodes; - - --%test(Provide a node after completion of a test with test results) - procedure post_test_nodes; - - --%test(Provide expectation message for a failed test) - procedure single_failed_message; - - --%test(Provide expectation messages for each failed assertion of a failed test) - procedure multiple_failed_messages; - - --%test(Provide dbms_output produced in a test) - procedure serveroutput_of_test; - - --%test(Provide dbms_output produced in a testsuite) - procedure serveroutput_of_testsuite; - - --%test(Provide the error stack of a test) - procedure error_stack_of_test; - - --%test(Provide the error stack of a testsuite) - procedure error_stack_of_testsuite; - - --%test(Provide a description of the reporter explaining the use for SQL Developer) - procedure get_description; - - --%afterall - procedure remove_test_suites; - -end test_realtime_reporter; -/ diff --git a/test/core/reporters/test_sonar_test_reporter.pkb b/test/core/reporters/test_sonar_test_reporter.pkb deleted file mode 100644 index 9cf38ea91..000000000 --- a/test/core/reporters/test_sonar_test_reporter.pkb +++ /dev/null @@ -1,36 +0,0 @@ -create or replace package body test_sonar_test_reporter as - - procedure report_produces_expected_out is - l_results ut3.ut_varchar2_list; - l_actual clob; - l_expected varchar2(32767):=q'[ - - -% -%%% -%%% -%% - -]'; - - begin - select * - bulk collect into l_results - from table( - ut3.ut.run( - 'test_reporters', - ut3.ut_sonar_test_reporter(), - a_test_file_mappings => ut3.ut_file_mapper.build_file_mappings( user, ut3.ut_varchar2_list('tests/helpers/test_reporters.pkb')) - ) - ); - l_actual := ut3.ut_utils.table_to_clob(l_results); - ut.expect(l_actual).to_be_like(l_expected); - end; - - procedure check_encoding_included is - begin - reporters.check_xml_encoding_included(ut3.ut_sonar_test_reporter(), 'UTF-8'); - end; - -end; -/ diff --git a/test/core/reporters/test_sonar_test_reporter.pks b/test/core/reporters/test_sonar_test_reporter.pks deleted file mode 100644 index ab4776c38..000000000 --- a/test/core/reporters/test_sonar_test_reporter.pks +++ /dev/null @@ -1,13 +0,0 @@ -create or replace package test_sonar_test_reporter as - - --%suite(ut_sonar_test_reporter) - --%suitepath(utplsql.core.reporters) - - --%test(Report produces expected output) - procedure report_produces_expected_out; - - --%test(Includes XML header with encoding when encoding provided) - procedure check_encoding_included; - -end; -/ diff --git a/test/core/reporters/test_teamcity_reporter.pkb b/test/core/reporters/test_teamcity_reporter.pkb deleted file mode 100644 index 77b850b15..000000000 --- a/test/core/reporters/test_teamcity_reporter.pkb +++ /dev/null @@ -1,131 +0,0 @@ -create or replace package body test_teamcity_reporter as - - procedure create_a_test_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package check_escape_special_chars is - --%suite(A suite with 'quote') - - --%test(A test with 'quote') - procedure test_do_stuff; - - end;]'; - execute immediate q'[create or replace package body check_escape_special_chars is - procedure test_do_stuff is - begin - ut3.ut.expect(' [ ' || chr(13) || chr(10) || ' ] ' ).to_be_null; - end; - - end;]'; - - execute immediate q'[create or replace package check_trims_long_output is - --%suite - - --%test - procedure long_output; - end;]'; - execute immediate q'[create or replace package body check_trims_long_output is - procedure long_output is - begin - ut3.ut.expect(rpad('aVarchar',4000,'a')).to_be_null; - end; - end;]'; - - end; - - - procedure report_produces_expected_out is - l_output_data ut3.ut_varchar2_list; - l_output clob; - l_expected varchar2(32767); - begin - l_expected := q'{%##teamcity[testSuiteStarted timestamp='%' name='org'] -%##teamcity[testSuiteStarted timestamp='%' name='org.utplsql'] -%##teamcity[testSuiteStarted timestamp='%' name='org.utplsql.tests'] -%##teamcity[testSuiteStarted timestamp='%' name='org.utplsql.tests.helpers'] -%##teamcity[testSuiteStarted timestamp='%' name='A suite for testing different outcomes from reporters'] -%##teamcity[testSuiteStarted timestamp='%' name='A description of some context'] -%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3_tester.test_reporters.passing_test'] - - - - - -%##teamcity[testFinished timestamp='%' duration='%' name='ut3_tester.test_reporters.passing_test'] -%##teamcity[testSuiteFinished timestamp='%' name='A description of some context'] -%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3_tester.test_reporters.failing_test'] - - - -%##teamcity[testFailed timestamp='%' details='Actual: |'number |[1|] |' (varchar2) was expected to equal: |'number |[2|] |' (varchar2) ' message='Fails as values are different' name='ut3_tester.test_reporters.failing_test'] -%##teamcity[testFinished timestamp='%' duration='%' name='ut3_tester.test_reporters.failing_test'] -%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3_tester.test_reporters.erroring_test'] - - - -%##teamcity[testStdErr timestamp='%' name='ut3_tester.test_reporters.erroring_test' out='Test exception:|nORA-06512: at "UT3_TESTER.TEST_REPORTERS", line %|nORA-06512: at %|n|n'] -%##teamcity[testFailed timestamp='%' details='Test exception:|nORA-06512: at "UT3_TESTER.TEST_REPORTERS", line %|nORA-06512: at %|n|n' message='Error occured' name='ut3_tester.test_reporters.erroring_test'] -%##teamcity[testFinished timestamp='%' duration='%' name='ut3_tester.test_reporters.erroring_test'] -%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3_tester.test_reporters.disabled_test'] -%##teamcity[testIgnored timestamp='%' name='ut3_tester.test_reporters.disabled_test'] -%##teamcity[testSuiteFinished timestamp='%' name='A suite for testing different outcomes from reporters'] -%##teamcity[testSuiteFinished timestamp='%' name='org.utplsql.tests.helpers'] -%##teamcity[testSuiteFinished timestamp='%' name='org.utplsql.tests'] -%##teamcity[testSuiteFinished timestamp='%' name='org.utplsql'] -%##teamcity[testSuiteFinished timestamp='%' name='org']}'; - --act - select * - bulk collect into l_output_data - from table(ut3.ut.run('test_reporters',ut3.ut_teamcity_reporter())); - - --assert - ut.expect(ut3.ut_utils.table_to_clob(l_output_data)).to_be_like(l_expected); - end; - - procedure escape_special_chars is - l_output_data ut3.ut_varchar2_list; - l_output clob; - l_expected varchar2(32767); - begin - l_expected := q'{%##teamcity[testSuiteStarted timestamp='%' name='A suite with |'quote|''] -%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3_tester.check_escape_special_chars.test_do_stuff'] -%##teamcity[testFailed timestamp='%' details='Actual: (varchar2)|n |' |[ |r|n |] |'|nwas expected to be null' name='ut3_tester.check_escape_special_chars.test_do_stuff'] -%##teamcity[testFinished timestamp='%' duration='%' name='ut3_tester.check_escape_special_chars.test_do_stuff'] -%##teamcity[testSuiteFinished timestamp='%' name='A suite with |'quote|'']}'; - --act - select * - bulk collect into l_output_data - from table(ut3.ut.run('check_escape_special_chars',ut3.ut_teamcity_reporter())); - - --assert - ut.expect(ut3.ut_utils.table_to_clob(l_output_data)).to_be_like(l_expected); - end; - - procedure trims_long_output is - l_output_data ut3.ut_varchar2_list; - l_output clob; - l_expected varchar2(32767); - begin - l_expected := q'{%##teamcity[testSuiteStarted timestamp='%' name='check_trims_long_output'] -%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3_tester.check_trims_long_output.long_output'] -%##teamcity[testFailed timestamp='%' details='Actual: (varchar2)|n |'aVarcharaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|[...|]' name='ut3_tester.check_trims_long_output.long_output'] -%##teamcity[testFinished timestamp='%' duration='%' name='ut3_tester.check_trims_long_output.long_output'] -%##teamcity[testSuiteFinished timestamp='%' name='check_trims_long_output']}'; - --act - select * - bulk collect into l_output_data - from table(ut3.ut.run('check_trims_long_output',ut3.ut_teamcity_reporter())); - - --assert - ut.expect(ut3.ut_utils.table_to_clob(l_output_data)).to_be_like(l_expected); - end; - - procedure remove_test_package is - pragma autonomous_transaction; - begin - execute immediate 'drop package check_escape_special_chars'; - execute immediate 'drop package check_trims_long_output'; - end; - -end; -/ diff --git a/test/core/reporters/test_teamcity_reporter.pks b/test/core/reporters/test_teamcity_reporter.pks deleted file mode 100644 index ef474b225..000000000 --- a/test/core/reporters/test_teamcity_reporter.pks +++ /dev/null @@ -1,22 +0,0 @@ -create or replace package test_teamcity_reporter as - - --%suite(ut_teamcity_reporter) - --%suitepath(utplsql.core.reporters) - - --%beforeall - procedure create_a_test_package; - - --%test(Report produces expected output) - procedure report_produces_expected_out; - - --%test(Escapes special characters) - procedure escape_special_chars; - - --%test(Trims output so it fits into 4000 chars) - procedure trims_long_output; - - --%afterall - procedure remove_test_package; - -end; -/ diff --git a/test/core/reporters/test_tfs_junit_reporter.pkb b/test/core/reporters/test_tfs_junit_reporter.pkb deleted file mode 100644 index 122c665e3..000000000 --- a/test/core/reporters/test_tfs_junit_reporter.pkb +++ /dev/null @@ -1,207 +0,0 @@ -create or replace package body test_tfs_junit_reporter as - - procedure crate_a_test_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package check_junit_reporting is - --%suite(A suite with ) - - --%test(A test with ) - procedure test_do_stuff; - - end;]'; - execute immediate q'[create or replace package body check_junit_reporting is - procedure test_do_stuff is - begin - ut3.ut.expect(1).to_equal(1); - ut3.ut.expect(1).to_equal(2); - end; - - end;]'; - - execute immediate q'[create or replace package check_junit_rep_suitepath is - --%suitepath(core) - --%suite(check_junit_rep_suitepath) - --%displayname(Check JUNIT Get path for suitepath) - - --%test(check_junit_rep_suitepath) - --%displayname(Check JUNIT Get path for suitepath) - procedure check_junit_rep_suitepath; - end;]'; - execute immediate q'[create or replace package body check_junit_rep_suitepath is - procedure check_junit_rep_suitepath is - begin - ut3.ut.expect(1).to_equal(1); - end; - end;]'; - - execute immediate q'[create or replace package check_junit_flat_suitepath is - --%suitepath(core.check_junit_rep_suitepath) - --%suite(flatsuitepath) - - --%beforeall - procedure donuffin; - end;]'; - execute immediate q'[create or replace package body check_junit_flat_suitepath is - procedure donuffin is - begin - null; - end; - end;]'; - - - execute immediate q'[create or replace package check_fail_escape is - --%suitepath(core) - --%suite(checkfailedescape) - --%displayname(Check JUNIT XML failure is escaped) - - --%test(Fail Miserably) - procedure fail_miserably; - - end;]'; - - execute immediate q'[create or replace package body check_fail_escape is - procedure fail_miserably is - begin - ut3.ut.expect('test').to_equal(''); - end; - end;]'; - - end; - - - procedure escapes_special_chars is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting',ut3.ut_tfs_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).not_to_be_like('%%'); - ut.expect(l_actual).to_be_like('%<tag>%'); - end; - - procedure reports_only_failed_or_errored is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting',ut3.ut_tfs_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).not_to_be_like('%Actual: 1 (number) was expected to equal: 1 (number)%'); - ut.expect(l_actual).to_be_like('%Actual: 1 (number) was expected to equal: 2 (number)%'); - end; - - procedure reports_failed_line is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting',ut3.ut_tfs_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%at "%.CHECK_JUNIT_REPORTING%", line %'); - end; - - procedure check_classname_suite is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting',ut3.ut_tfs_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%testcase classname="check_junit_reporting"%'); - end; - - procedure check_flatten_nested_suites is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_flat_suitepath',ut3.ut_tfs_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like(' - - - - - -%'); - end; - - procedure check_nls_number_formatting is - l_results ut3.ut_varchar2_list; - l_actual clob; - l_nls_numeric_characters varchar2(30); - begin - --Arrange - select replace(nsp.value,'''','''''') into l_nls_numeric_characters - from nls_session_parameters nsp - where parameter = 'NLS_NUMERIC_CHARACTERS'; - execute immediate q'[alter session set NLS_NUMERIC_CHARACTERS=', ']'; - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting', ut3.ut_tfs_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_match('time="[0-9]*\.[0-9]{3,6}"'); - --Cleanup - execute immediate 'alter session set NLS_NUMERIC_CHARACTERS='''||l_nls_numeric_characters||''''; - end; - - procedure check_failure_escaped is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_fail_escape',ut3.ut_tfs_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%Actual: 'test' (varchar2) was expected to equal: '<![CDATA[some stuff]]>' (varchar2)%'); - end; - - procedure check_classname_suitepath is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_rep_suitepath',ut3.ut_tfs_junit_reporter())); - l_actual := ut3.ut_utils.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%testcase classname="core.check_junit_rep_suitepath"%'); - end; - procedure remove_test_package is - pragma autonomous_transaction; - begin - execute immediate 'drop package check_junit_reporting'; - execute immediate 'drop package check_junit_rep_suitepath'; - execute immediate 'drop package check_junit_flat_suitepath'; - execute immediate 'drop package check_fail_escape'; - end; - - procedure check_encoding_included is - begin - reporters.check_xml_encoding_included(ut3.ut_tfs_junit_reporter(), 'UTF-8'); - end; - -end; -/ diff --git a/test/core/reporters/test_tfs_junit_reporter.pks b/test/core/reporters/test_tfs_junit_reporter.pks deleted file mode 100644 index cc589be1b..000000000 --- a/test/core/reporters/test_tfs_junit_reporter.pks +++ /dev/null @@ -1,39 +0,0 @@ -create or replace package test_tfs_junit_reporter as - - --%suite(ut_tfs_junit_reporter) - --%suitepath(utplsql.core.reporters) - - --%beforeall - procedure crate_a_test_package; - - --%test(Escapes special characters from test and suite description) - procedure escapes_special_chars; - - --%test(Reports only failed expectations and exceptions) - procedure reports_only_failed_or_errored; - - --%test(Reports failed line of test) - procedure reports_failed_line; - - --%test(Check that classname is returned correct suite) - procedure check_classname_suite; - - --%test(Check that classname is returned correct suitepath) - procedure check_classname_suitepath; - - --%test(Check that nested suites are being flatten) - procedure check_flatten_nested_suites; - - --%test(Reports duration according to XML specification for numbers) - procedure check_nls_number_formatting; - - --%test( Validate that failures with special char are escaped ) - procedure check_failure_escaped; - - --%test(Includes XML header with encoding when encoding provided) - procedure check_encoding_included; - - --%afterall - procedure remove_test_package; -end; -/ diff --git a/test/core/test_file_mapper.pkb b/test/core/test_file_mapper.pkb deleted file mode 100644 index 34b38f108..000000000 --- a/test/core/test_file_mapper.pkb +++ /dev/null @@ -1,45 +0,0 @@ -create or replace package body test_file_mapper is - - procedure default_mappings is - l_actual ut3.ut_file_mappings; - l_expected ut3.ut_file_mappings; - begin - --Arrange - l_expected := ut3.ut_file_mappings( - ut3.ut_file_mapping('C:\tests\helpers\core.pkb',USER,'CORE','PACKAGE BODY'), - ut3.ut_file_mapping('tests/helpers/test_file_mapper.pkb',USER,'TEST_FILE_MAPPER','PACKAGE BODY') - ); - --Act - l_actual := ut3.ut_file_mapper.build_file_mappings( - ut3.ut_varchar2_list( - 'C:\tests\helpers\core.pkb', - 'tests/helpers/test_file_mapper.pkb' - ) - ); - --Assert - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - end; - - procedure specific_owner is - l_actual ut3.ut_file_mappings; - l_expected ut3.ut_file_mappings; - begin - --Arrange - l_expected := ut3.ut_file_mappings( - ut3.ut_file_mapping('C:\source\core\types\ut_file_mapping.tpb','UT3','UT_FILE_MAPPING','TYPE BODY'), - ut3.ut_file_mapping('source/core/ut_file_mapper.pkb','UT3','UT_FILE_MAPPER','PACKAGE BODY') - ); - --Act - l_actual := ut3.ut_file_mapper.build_file_mappings( - 'UT3', - ut3.ut_varchar2_list( - 'C:\source\core\types\ut_file_mapping.tpb', - 'source/core/ut_file_mapper.pkb' - ) - ); - --Assert - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - end; - -end; -/ diff --git a/test/core/test_file_mapper.pks b/test/core/test_file_mapper.pks deleted file mode 100644 index f64343637..000000000 --- a/test/core/test_file_mapper.pks +++ /dev/null @@ -1,13 +0,0 @@ -create or replace package test_file_mapper is - - --%suite(file_mapper) - --%suitepath(utplsql.core) - - --%test(Maps file paths into database objects using default mappings) - procedure default_mappings; - - --%test(Used specified object owner to perform mapping when files have no owner indication) - procedure specific_owner; - -end; -/ diff --git a/test/core/test_output_buffer.pkb b/test/core/test_output_buffer.pkb deleted file mode 100644 index 848824ea8..000000000 --- a/test/core/test_output_buffer.pkb +++ /dev/null @@ -1,95 +0,0 @@ -create or replace package body test_output_buffer is - - procedure test_receive is - l_actual_text clob; - l_actual_item_type varchar2(1000); - l_remaining integer; - l_expected_text clob; - l_expected_item_type varchar2(1000); - l_buffer ut3.ut_output_buffer_base; - begin - --Arrange - l_buffer := ut3.ut_output_table_buffer(); - l_expected_text := to_clob(lpad('a text', 31000, ',a text')) - || chr(10) || to_clob(lpad('a text', 31000, ',a text')) - || chr(13) || to_clob(lpad('a text', 31000, ',a text')) - || chr(13) || chr(10) || to_clob(lpad('a text', 31000, ',a text')) || to_clob(lpad('a text', 31000, ',a text')); - l_expected_item_type := lpad('some item type',1000,'-'); - --Act - l_buffer.send_clob(l_expected_text, l_expected_item_type); - l_buffer.close(); - - select text, item_type - into l_actual_text, l_actual_item_type - from table(l_buffer.get_lines(0,0)); - - --Assert - ut.expect(l_actual_text).to_equal(l_expected_text); - ut.expect(l_actual_item_type).to_equal(l_expected_item_type); - - select count(1) into l_remaining from ut3.ut_output_buffer_tmp where output_id = l_buffer.output_id; - - ut.expect(l_remaining).to_equal(0); - end; - - procedure test_doesnt_send_on_null_text is - l_cur sys_refcursor; - l_result integer; - l_buffer ut3.ut_output_buffer_base := ut3.ut_output_table_buffer(); - begin - delete from ut3.ut_output_buffer_tmp; - --Act - l_buffer.send_line(null); - - open l_cur for select * from ut3.ut_output_buffer_tmp; - ut.expect(l_cur).to_be_empty; - end; - - procedure test_send_line is - l_result varchar2(4000); - c_expected constant varchar2(4000) := lpad('a text',4000,',a text'); - l_buffer ut3.ut_output_buffer_base := ut3.ut_output_table_buffer(); - begin - l_buffer.send_line(c_expected); - - select text into l_result from ut3.ut_output_buffer_tmp where output_id = l_buffer.output_id; - - ut.expect(l_result).to_equal(c_expected); - end; - - procedure test_waiting_for_data is - l_result clob; - l_remaining integer; - l_expected clob; - l_buffer ut3.ut_output_buffer_base := ut3.ut_output_table_buffer(); - l_start timestamp; - l_duration interval day to second; - begin - --Arrange - l_expected := 'a text'; - l_buffer.send_line(l_expected); - l_start := localtimestamp; - --Act - begin - select text into l_result from table(l_buffer.get_lines(1,1)); - ut.fail('Expected a timeout exception but nothing was raised'); - exception - when others then - l_duration := localtimestamp - l_start; - --Assert - --Fetches data from output - ut.expect(l_result).to_equal(l_expected); - --Throws a timeout exception - ut.expect(dbms_utility.format_error_stack()).to_match('ORA'||ut3.ut_utils.gc_out_buffer_timeout); - --Waited for one second - ut.expect(l_duration).to_be_greater_than(interval '0.99' second); - end; - - select count(1) into l_remaining from ut3.ut_output_buffer_tmp where output_id = l_buffer.output_id; - --Data got removed from output buffer - ut.expect(l_remaining).to_equal(0); - - end; - -end test_output_buffer; -/ diff --git a/test/core/test_output_buffer.pks b/test/core/test_output_buffer.pks deleted file mode 100644 index 417b1ce09..000000000 --- a/test/core/test_output_buffer.pks +++ /dev/null @@ -1,19 +0,0 @@ -create or replace package test_output_buffer is - - --%suite(output_buffer) - --%suitepath(utplsql.core) - - --%test(Receives a line from buffer table and deletes) - procedure test_receive; - - --%test(Does not send line if null text given) - procedure test_doesnt_send_on_null_text; - - --%test(Sends a line into buffer table) - procedure test_send_line; - - --%test(Waits For The Data To Appear For Specified Time) - procedure test_waiting_for_data; - -end test_output_buffer; -/ diff --git a/test/core/test_suite_builder.pkb b/test/core/test_suite_builder.pkb deleted file mode 100644 index bd76e88d8..000000000 --- a/test/core/test_suite_builder.pkb +++ /dev/null @@ -1,1118 +0,0 @@ -create or replace package body test_suite_builder is - - function invoke_builder_for_annotations( - a_annotations ut3.ut_annotations, - a_package_name varchar2 := 'TEST_SUITE_BUILDER_PACKAGE' - ) return clob is - l_suites ut3.ut_suite_items; - l_suite ut3.ut_logical_suite; - l_cursor sys_refcursor; - l_xml xmltype; - begin - open l_cursor for select value(x) from table( - ut3.ut_annotated_objects( - ut3.ut_annotated_object('UT3_TESTER', a_package_name, 'PACKAGE', systimestamp, a_annotations) - ) ) x; - - l_suites := ut3.ut_suite_manager.build_suites_from_annotations( - a_owner_name => 'UT3_TESTER', - a_annotated_objects => l_cursor, - a_path => null, - a_object_name => a_package_name, - a_skip_all_objects => true - ); - l_suite := treat( l_suites(l_suites.first) as ut3.ut_logical_suite); - - select deletexml( - xmltype(l_suite), - '//RESULTS_COUNT|//START_TIME|//END_TIME|//RESULT|//ASSOCIATED_EVENT_NAME' || - '|//TRANSACTION_INVALIDATORS|//ERROR_BACKTRACE|//ERROR_STACK|//SERVEROUTPUT' - ) - into l_xml - from dual; - - return l_xml.getClobVal(); - end; - - procedure no_suite_description is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite',null, null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_match( - 'UT3_TESTERsome_packagesome_package()?\s*some_package' - ); - end; - - procedure suite_description_from_suite is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Some description', null), - ut3.ut_annotation(2, 'suite','Another description', null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%some_packageSome description%' - ); - end; - - procedure suitepath_from_non_empty_path is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite',null, null), - ut3.ut_annotation(2, 'suitepath','org.utplsql.some', null), - ut3.ut_annotation(3, 'suitepath','dummy.utplsql.some', null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%org.utplsql.some%' - ); - end; - - procedure suite_descr_from_displayname is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Some description', null), - ut3.ut_annotation(2, 'suite','Another description', null), - ut3.ut_annotation(3, 'displayname','New description', null), - ut3.ut_annotation(4, 'displayname','Newest description', null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%some_packageNew description%' - ); - end; - - procedure rollback_type_valid is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite',null, null), - ut3.ut_annotation(2, 'rollback','manual', null), - ut3.ut_annotation(3, 'rollback','bad', null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%'||ut3.ut_utils.gc_rollback_manual||'%' - ); - end; - - procedure rollback_type_duplicated is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite',null, null), - ut3.ut_annotation(2, 'rollback','manual', null), - ut3.ut_annotation(3, 'rollback','bad', null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%"--%rollback"%%UT3_TESTER.SOME_PACKAGE%3%%' - ); - end; - - procedure suite_annot_duplicated is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(2, 'suite','Cool', null), - ut3.ut_annotation(8, 'suite','bad', null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%Cool%%"--%suite"%UT3_TESTER.SOME_PACKAGE%line 8%%' - ); - end; - - procedure test_annotation is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(2, 'suite','Cool', null), - ut3.ut_annotation(8, 'test','Some test', 'test_procedure') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%' || - '%test_procedureSome testsome_package.test_procedure' || - '%%' - ); - end; - - procedure test_annot_duplicated is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(2, 'suite','Cool', null), - ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), - ut3.ut_annotation(9, 'test','Dup', 'test_procedure') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%Cool%%"--%test"%UT3_TESTER.SOME_PACKAGE.TEST_PROCEDURE%line 9%%' - ); - end; - - procedure beforeall_annot_duplicated is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(2, 'suite','Cool', null), - ut3.ut_annotation(8, 'beforeall', null, 'test_procedure'), - ut3.ut_annotation(9, 'beforeall', null, 'test_procedure') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%Cool%%"--%beforeall"%UT3_TESTER.SOME_PACKAGE.TEST_PROCEDURE%line 9%%' - ); - end; - - procedure beforeeach_annot_duplicated is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(2, 'suite','Cool', null), - ut3.ut_annotation(8, 'beforeeach', null, 'test_procedure'), - ut3.ut_annotation(9, 'beforeeach', null, 'test_procedure') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%Cool%%"--%beforeeach"%UT3_TESTER.SOME_PACKAGE.TEST_PROCEDURE%line 9%%' - ); - end; - - procedure afterall_annot_duplicated is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(2, 'suite','Cool', null), - ut3.ut_annotation(8, 'afterall', null, 'test_procedure'), - ut3.ut_annotation(9, 'afterall', null, 'test_procedure') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%Cool%%"--%afterall"%UT3_TESTER.SOME_PACKAGE.TEST_PROCEDURE%line 9%%' - ); - end; - - procedure aftereach_annot_duplicated is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(2, 'suite','Cool', null), - ut3.ut_annotation(8, 'aftereach', null, 'test_procedure'), - ut3.ut_annotation(9, 'aftereach', null, 'test_procedure') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%Cool%%"--%aftereach"%UT3_TESTER.SOME_PACKAGE.TEST_PROCEDURE%line 9%%' - ); - end; - - procedure suitepath_annot_duplicated is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(2, 'suite','Cool', null), - ut3.ut_annotation(3, 'suitepath','dummy.utplsql.some', null), - ut3.ut_annotation(4, 'suitepath','org.utplsql.some', null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%"--%suitepath"%line 4%%' - ); - end; - - procedure displayname_annot_duplicated is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(2, 'suite','Cool', null), - ut3.ut_annotation(4, 'displayname','New description', null), - ut3.ut_annotation(5, 'displayname','Newest description', null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%"--%displayname"%line 5%%' - ); - end; - - procedure suitepath_annot_empty is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(3, 'suitepath',null, null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%"--%suitepath" annotation requires a non-empty parameter value.%%' - ); - end; - - procedure suitepath_annot_invalid_path is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'suitepath','path with spaces', null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%Invalid path value in annotation "--%suitepath(path with spaces)"%%' - ); - end; - - procedure displayname_annot_empty is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(3, 'displayname',null, null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%"--%displayname" annotation requires a non-empty parameter value.%%' - ); - end; - - procedure rollback_type_empty is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(3, 'rollback',null, null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%"--%rollback" annotation requires one of values as parameter:%%' - ); - end; - - procedure rollback_type_invalid is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'rollback','bad', null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%"--%rollback" annotation requires one of values as parameter: "auto" or "manual". Annotation ignored.%%' - ); - end; - - procedure multiple_before_after is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'beforeall',null, 'first_before_all'), - ut3.ut_annotation(3, 'beforeall',null, 'another_before_all'), - ut3.ut_annotation(4, 'beforeeach',null, 'first_before_each'), - ut3.ut_annotation(5, 'beforeeach',null, 'another_before_each'), - ut3.ut_annotation(6, 'aftereach',null, 'first_after_each'), - ut3.ut_annotation(7, 'aftereach',null, 'another_after_each'), - ut3.ut_annotation(8, 'afterall',null, 'first_after_all'), - ut3.ut_annotation(9, 'afterall',null, 'another_after_all'), - ut3.ut_annotation(14, 'test','A test', 'some_test'), - ut3.ut_annotation(15, 'beforetest','before_test_proc', 'some_test'), - ut3.ut_annotation(16, 'beforetest','before_test_proc2', 'some_test'), - ut3.ut_annotation(18, 'aftertest','after_test_proc', 'some_test'), - ut3.ut_annotation(20, 'aftertest','after_test_proc2', 'some_test') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%some_package%some_test' || - '%' || - '%some_packagefirst_before_each' || - '%some_packageanother_before_each' || - '%' || - '%' || - '%some_packagebefore_test_proc' || - '%some_packagebefore_test_proc2' || - '%' || - '%' || - '%some_packageafter_test_proc' || - '%some_packageafter_test_proc2' || - '%' || - '%' || - '%some_packagefirst_after_each' || - '%some_packageanother_after_each' || - '%' || - '%' || - '%' || - '%some_packagefirst_before_all' || - '%some_packageanother_before_all' || - '%' || - '%' || - '%some_packagefirst_after_all' || - '%some_packageanother_after_all' || - '%%' - ); - end; - - procedure multiple_standalone_bef_aft is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'beforeall', 'some_package.first_before_all',null), - ut3.ut_annotation(3, 'beforeall', 'different_package.another_before_all',null), - ut3.ut_annotation(4, 'beforeeach', 'first_before_each',null), - ut3.ut_annotation(5, 'beforeeach', 'different_owner.different_package.another_before_each',null), - ut3.ut_annotation(6, 'aftereach', 'first_after_each',null), - ut3.ut_annotation(7, 'aftereach', 'another_after_each,different_owner.different_package.one_more_after_each',null), - ut3.ut_annotation(8, 'afterall', 'first_after_all',null), - ut3.ut_annotation(9, 'afterall', 'another_after_all',null), - ut3.ut_annotation(14, 'test','A test', 'some_test'), - ut3.ut_annotation(15, 'beforetest','before_test_proc', 'some_test'), - ut3.ut_annotation(16, 'beforetest','before_test_proc2', 'some_test'), - ut3.ut_annotation(18, 'aftertest','after_test_proc', 'some_test'), - ut3.ut_annotation(20, 'aftertest','after_test_proc2', 'some_test') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%some_package%some_test' || - '%' || - '%some_packagefirst_before_each' || - '%different_ownerdifferent_packageanother_before_each' || - '%' || - '%' || - '%some_packagebefore_test_proc' || - '%some_packagebefore_test_proc2' || - '%' || - '%' || - '%some_packageafter_test_proc' || - '%some_packageafter_test_proc2' || - '%' || - '%' || - '%some_packagefirst_after_each' || - '%some_packageanother_after_each' || - '%different_ownerdifferent_packageone_more_after_each' || - '%' || - '%' || - '%' || - '%some_packagefirst_before_all' || - '%different_packageanother_before_all' || - '%' || - '%' || - '%some_packagefirst_after_all' || - '%some_packageanother_after_all' || - '%%' - ); - end; - - procedure before_after_on_single_proc is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'beforeall',null, 'do_stuff'), - ut3.ut_annotation(3, 'beforeeach',null, 'do_stuff'), - ut3.ut_annotation(4, 'aftereach',null, 'do_stuff'), - ut3.ut_annotation(5, 'afterall',null, 'do_stuff'), - ut3.ut_annotation(6, 'test','A test', 'some_test') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%some_package%some_test' || - '%' || - '%some_packagedo_stuff' || - '%' || - '%' || - '%some_packagedo_stuff' || - '%' || - '%' || - '%' || - '%some_packagedo_stuff' || - '%' || - '%' || - '%some_packagedo_stuff' || - '%%' - ); - end; - - procedure multiple_mixed_bef_aft is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'beforeall', null,'first_before_all'), - ut3.ut_annotation(3, 'beforeall', 'different_package.another_before_all',null), - ut3.ut_annotation(4, 'beforeeach', 'first_before_each',null), - ut3.ut_annotation(5, 'beforeeach', 'different_owner.different_package.another_before_each',null), - ut3.ut_annotation(6, 'aftereach', null, 'first_after_each'), - ut3.ut_annotation(7, 'aftereach', 'another_after_each,different_owner.different_package.one_more_after_each',null), - ut3.ut_annotation(8, 'afterall', 'first_after_all',null), - ut3.ut_annotation(9, 'afterall', 'another_after_all',null), - ut3.ut_annotation(14, 'test','A test', 'some_test'), - ut3.ut_annotation(15, 'beforetest','before_test_proc', 'some_test'), - ut3.ut_annotation(16, 'beforetest','before_test_proc2', 'some_test'), - ut3.ut_annotation(18, 'aftertest','after_test_proc', 'some_test'), - ut3.ut_annotation(20, 'aftertest','after_test_proc2', 'some_test'), - ut3.ut_annotation(21, 'beforeall', null,'last_before_all'), - ut3.ut_annotation(22, 'aftereach', null, 'last_after_each'), - ut3.ut_annotation(23, 'afterall', null, 'last_after_all') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%some_package%some_test' || - '%' || - '%some_packagefirst_before_each' || - '%different_ownerdifferent_packageanother_before_each' || - '%' || - '%' || - '%some_packagebefore_test_proc' || - '%some_packagebefore_test_proc2' || - '%' || - '%' || - '%some_packageafter_test_proc' || - '%some_packageafter_test_proc2' || - '%' || - '%' || - '%some_packagefirst_after_each' || - '%some_packageanother_after_each' || - '%different_ownerdifferent_packageone_more_after_each' || - '%some_packagelast_after_each' || - '%' || - '%' || - '%' || - '%some_packagefirst_before_all' || - '%different_packageanother_before_all' || - '%some_packagelast_before_all' || - '%' || - '%' || - '%some_packagefirst_after_all' || - '%some_packageanother_after_all' || - '%some_packagelast_after_all' || - '%%' - ); - end; - - - procedure before_after_mixed_with_test is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'beforeall',null, 'do_stuff'), - ut3.ut_annotation(3, 'beforeeach',null, 'do_stuff'), - ut3.ut_annotation(4, 'aftereach',null, 'do_stuff'), - ut3.ut_annotation(5, 'afterall',null, 'do_stuff'), - ut3.ut_annotation(6, 'test','A test', 'do_stuff') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like('%%Annotation "--\%beforeall"%line 2%%', '\'); - ut.expect(l_actual).to_be_like('%%Annotation "--\%beforeeach"%line 3%%', '\'); - ut.expect(l_actual).to_be_like('%%Annotation "--\%aftereach"%line 4%%', '\'); - ut.expect(l_actual).to_be_like('%%Annotation "--\%afterall" cannot be used with "--\%test". Annotation ignored.' - ||'%at "UT3_TESTER.SOME_PACKAGE.DO_STUFF", line 5%%', '\'); - ut.expect(l_actual).not_to_be_like('%%'); - ut.expect(l_actual).not_to_be_like('%%'); - ut.expect(l_actual).not_to_be_like('%%'); - ut.expect(l_actual).not_to_be_like('%%'); - end; - - procedure suite_from_context is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'beforeall',null, 'suite_level_beforeall'), - ut3.ut_annotation(3, 'test','In suite', 'suite_level_test'), - ut3.ut_annotation(4, 'context','a_context', null), - ut3.ut_annotation(5, 'displayname','A context', null), - ut3.ut_annotation(6, 'beforeall',null, 'context_setup'), - ut3.ut_annotation(7, 'test', 'In context', 'test_in_a_context'), - ut3.ut_annotation(8, 'endcontext',null, null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%' || - '%' || - '%' || - '' || - '%a_contextA contextsome_package.a_context' || - '%' || - '' || - '%test_in_a_contextIn contextsome_package.a_context.test_in_a_context' || - '%' || - '' || - '' || - '%some_packagecontext_setup' || - '%' || - '' || - '' || - '' || - '%suite_level_testIn suitesome_package.suite_level_test' || - '%' || - '' || - '' || - '%some_packagesuite_level_beforeall' || - '%' || - '' || - '' - ); - end; - - procedure before_after_in_context is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite', 'Cool', null), - ut3.ut_annotation(2, 'test', 'In suite', 'suite_level_test'), - ut3.ut_annotation(3, 'context', 'a_context', null), - ut3.ut_annotation(4, 'beforeall', 'context_beforeall', null), - ut3.ut_annotation(5, 'beforeeach', null, 'context_beforeeach'), - ut3.ut_annotation(6, 'test', 'In context', 'test_in_a_context'), - ut3.ut_annotation(7, 'aftereach', 'context_aftereach' ,null), - ut3.ut_annotation(8, 'afterall', null, 'context_afterall'), - ut3.ut_annotation(9, 'endcontext', null, null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '' || - '%' || - '%' || - '%a_context' || - '%' || - '%' || - '%test_in_a_context' || - '%%context_beforeeach%' || - '%%test_in_a_context%' || - '%%context_aftereach%' || - '%' || - '%' || - '%%context_beforeall%' || - '%%context_afterall%' || - '%' || - '%' || - '%suite_level_test' || - '%%suite_level_test%' || - '%' || - '%' || - '%' - ); - ut.expect(l_actual).not_to_be_like('%%%%%%'); - ut.expect(l_actual).not_to_be_like('%%%%%%'); - ut.expect(l_actual).not_to_be_like('%%%%%%'); - ut.expect(l_actual).not_to_be_like('%%%%%%'); - end; - - procedure before_after_out_of_context is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'beforeall',null, 'suite_level_beforeall'), - ut3.ut_annotation(3, 'beforeeach',null, 'suite_level_beforeeach'), - ut3.ut_annotation(4, 'test','In suite', 'suite_level_test'), - ut3.ut_annotation(5, 'context','a_context', null), - ut3.ut_annotation(6, 'test', 'In context', 'test_in_a_context'), - ut3.ut_annotation(7, 'endcontext',null, null), - ut3.ut_annotation(8, 'aftereach',null, 'suite_level_aftereach'), - ut3.ut_annotation(9, 'afterall',null, 'suite_level_afterall') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '' || - '%' || - '%' || - '%a_context' || - '%' || - '%' || - '%test_in_a_context' || - '%%suite_level_beforeeach%' || - '%%test_in_a_context%' || - '%%suite_level_aftereach%' || - '%' || - '%' || - '%' || - '%' || - '%suite_level_test' || - '%%suite_level_beforeeach%' || - '%%suite_level_test%' || - '%%suite_level_aftereach%' || - '%' || - '%' || - '%%suite_level_beforeall%' || - '%%suite_level_afterall%' || - '%' - ); - ut.expect(l_actual).not_to_be_like('%%%%%%'); - ut.expect(l_actual).not_to_be_like('%%%%%%'); - end; - - procedure context_without_endcontext is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'beforeall',null, 'suite_level_beforeall'), - ut3.ut_annotation(3, 'test','In suite', 'suite_level_test'), - ut3.ut_annotation(4, 'context','A context', null), - ut3.ut_annotation(5, 'beforeall',null, 'context_setup'), - ut3.ut_annotation(7, 'test', 'In context', 'test_in_a_context') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%Invalid annotation "--\%context". Cannot find following "--\%endcontext". Annotation ignored.%at "UT3_TESTER.SOME_PACKAGE", line 4%' - ,'\' - ); - ut.expect(l_actual).to_be_like( - '' || - '%' || - '' || - '%suite_level_testIn suitesome_package.suite_level_test' || - '%' || - '' || - '%test_in_a_contextIn contextsome_package.test_in_a_context' || - '%' || - '' || - '' || - '%some_packagesuite_level_beforeall' || - '%some_packagecontext_setup' || - '%' || - '' || - '' - ); - end; - - procedure endcontext_without_context is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'beforeall',null, 'suite_level_beforeall'), - ut3.ut_annotation(3, 'test','In suite', 'suite_level_test'), - ut3.ut_annotation(4, 'context','a_context', null), - ut3.ut_annotation(5, 'displayname','A context', null), - ut3.ut_annotation(6, 'beforeall',null, 'context_setup'), - ut3.ut_annotation(7, 'test', 'In context', 'test_in_a_context'), - ut3.ut_annotation(8, 'endcontext',null, null), - ut3.ut_annotation(9, 'endcontext',null, null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%Invalid annotation "--\%endcontext". Cannot find preceding "--\%context". Annotation ignored.%at "UT3_TESTER.SOME_PACKAGE", line 9%' - ,'\' - ); - ut.expect(l_actual).to_be_like( - '' || - '%' || - '' || - '%a_contextA contextsome_package.a_context' || - '%' || - '' || - '%test_in_a_contextIn contextsome_package.a_context.test_in_a_context' || - '%' || - '' || - '' || - '%some_packagecontext_setup' || - '%' || - '' || - '' || - '' || - '%suite_level_testIn suitesome_package.suite_level_test' || - '%' || - '' || - '' || - '%some_packagesuite_level_beforeall' || - '%' || - '' || - '' - ); - end; - - --%test(Gives warning when two contexts have the same name) - procedure duplicate_context_name is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'beforeall',null, 'suite_level_beforeall'), - ut3.ut_annotation(3, 'test','In suite', 'suite_level_test'), - ut3.ut_annotation(4, 'context','a_context', null), - ut3.ut_annotation(5, 'displayname','A context', null), - ut3.ut_annotation(6, 'beforeall',null, 'context_setup'), - ut3.ut_annotation(7, 'test', 'In context', 'test_in_a_context'), - ut3.ut_annotation(8, 'endcontext',null, null), - ut3.ut_annotation(9, 'context','a_context', null), - ut3.ut_annotation(10, 'displayname','A context', null), - ut3.ut_annotation(11, 'beforeall',null, 'setup_in_duplicated_context'), - ut3.ut_annotation(12, 'test', 'In duplicated context', 'test_in_duplicated_context'), - ut3.ut_annotation(13, 'endcontext',null, null) - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%Context name must be unique in a suite. Context and all of it's content ignored.%at "UT3_TESTER.SOME_PACKAGE", line 9%' - ,'\' - ); - ut.expect(l_actual).to_be_like( - '' || - '%' || - '' || - '%a_contextA contextsome_package.a_context' || - '%' || - '' || - '%test_in_a_contextIn contextsome_package.a_context.test_in_a_context' || - '%' || - '' || - '' || - '%some_packagecontext_setup' || - '%' || - '' || - '' || - '' || - '%suite_level_testIn suitesome_package.suite_level_test' || - '%' || - '' || - '' || - '%some_packagesuite_level_beforeall' || - '%' || - '' || - '' - ); - end; - - procedure throws_value_empty is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(3, 'test','A test with empty throws annotation', 'A_TEST_PROCEDURE'), - ut3.ut_annotation(3, 'throws',null, 'A_TEST_PROCEDURE') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%"--%throws" annotation requires a parameter. Annotation ignored.%%' - ); - end; - - procedure throws_value_invalid is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(3, 'test','A test with invalid throws annotation', 'A_TEST_PROCEDURE'), - ut3.ut_annotation(3, 'throws',' -20145 , bad_variable_name ', 'A_TEST_PROCEDURE') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%Invalid parameter value "bad_variable_name" for "--%throws" annotation. Parameter ignored.%%' - ); - end; - - - procedure before_aftertest_multi is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(14, 'test','A test', 'some_test'), - ut3.ut_annotation(15, 'beforetest','before_test_proc', 'some_test'), - ut3.ut_annotation(16, 'beforetest','before_test_proc2', 'some_test'), - ut3.ut_annotation(18, 'aftertest','after_test_proc', 'some_test'), - ut3.ut_annotation(20, 'aftertest','after_test_proc2', 'some_test') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%some_package%some_test' || - '%' || - '%some_packagebefore_test_proc' || - '%some_packagebefore_test_proc2' || - '%' || - '%' || - '%some_packageafter_test_proc' || - '%some_packageafter_test_proc2' || - '%' || - '%%' - ); - end; - - procedure before_aftertest_twice is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(14, 'test','A test', 'some_test'), - ut3.ut_annotation(15, 'beforetest','before_test_proc, before_test_proc2', 'some_test'), - ut3.ut_annotation(16, 'beforetest','before_test_proc3', 'some_test'), - ut3.ut_annotation(18, 'aftertest','after_test_proc,after_test_proc2', 'some_test'), - ut3.ut_annotation(20, 'aftertest','after_test_proc3', 'some_test') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%some_package%some_test' || - '%' || - '%some_packagebefore_test_proc' || - '%some_packagebefore_test_proc2' || - '%some_packagebefore_test_proc3' || - '%' || - '%' || - '%some_packageafter_test_proc' || - '%some_packageafter_test_proc2' || - '%some_packageafter_test_proc3' || - '%' || - '%%' - ); - end; - - procedure before_aftertest_pkg_proc is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(14, 'test','A test', 'some_test'), - ut3.ut_annotation(15, 'beforetest','external_package.before_test_proc', 'some_test'), - ut3.ut_annotation(18, 'aftertest','external_package.after_test_proc', 'some_test') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%some_package%some_test' || - '%' || - '%external_packagebefore_test_proc' || - '%' || - '%' || - '%external_packageafter_test_proc' || - '%' || - '%%' - ); - end; - - procedure before_aftertest_mixed_syntax is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(14, 'test','A test', 'some_test'), - ut3.ut_annotation(15, 'beforetest','external_package.before_test_proc, before_test_proc2', 'some_test'), - ut3.ut_annotation(18, 'aftertest','external_package.after_test_proc, after_test_proc2', 'some_test') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%some_package%some_test' || - '%' || - '%external_packagebefore_test_proc' || - '%some_packagebefore_test_proc2' || - '%' || - '%' || - '%external_packageafter_test_proc' || - '%some_packageafter_test_proc2' || - '%' || - '%%' - ); - end; - - procedure test_annotation_ordering is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(4, 'test','B test', 'b_test'), - ut3.ut_annotation(10, 'test','Z test', 'z_test'), - ut3.ut_annotation(14, 'test','A test', 'a_test') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like( - '%%some_package%b_test' || - '%%'|| - '%%some_package%z_test' || - '%%'|| - '%%some_package%a_test' || - '%%' - ); - end; - - procedure test_bad_procedure_annotation is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(2, 'bad_procedure_annotation',null, 'some_procedure'), - ut3.ut_annotation(6, 'test','A test', 'do_stuff') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like('%Unsupported annotation "--\%bad_procedure_annotation". Annotation ignored.% line 2%', '\'); - end; - - procedure test_bad_package_annotation is - l_actual clob; - l_annotations ut3.ut_annotations; - begin - --Arrange - l_annotations := ut3.ut_annotations( - ut3.ut_annotation(1, 'suite','Cool', null), - ut3.ut_annotation(17, 'bad_package_annotation',null, null), - ut3.ut_annotation(24, 'test','A test', 'do_stuff') - ); - --Act - l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); - --Assert - ut.expect(l_actual).to_be_like('%Unsupported annotation "--\%bad_package_annotation". Annotation ignored.% line 17%', '\'); - end; - -end test_suite_builder; -/ diff --git a/test/core/test_suite_builder.pks b/test/core/test_suite_builder.pks deleted file mode 100644 index 21ca58206..000000000 --- a/test/core/test_suite_builder.pks +++ /dev/null @@ -1,176 +0,0 @@ -create or replace package test_suite_builder is - --%suite(suite_builder) - --%suitepath(utplsql.core) - - --%context(suite) - --%displayname(--%suite annotation) - - --%test(Sets suite name from package name and leaves description empty) - procedure no_suite_description; - - --%test(Sets suite description using first --%suite annotation) - procedure suite_description_from_suite; - - --%test(Gives warning if more than one --%suite annotation used) - procedure suite_annot_duplicated; - - --%endcontext - - --%context(displayname) - --%displayname(--%displayname annotation) - - --%test(Overrides suite description using first --%displayname annotation) - procedure suite_descr_from_displayname; - - --%test(Gives warning if more than one --%displayname annotation used) - procedure displayname_annot_duplicated; - - --%test(Gives warning if --%displayname annotation has no value) - procedure displayname_annot_empty; - - --%endcontext - - --%context(test) - --%displayname(--%test annotation) - - --%test(Creates a test item for procedure annotated with --%test annotation) - procedure test_annotation; - - --%test(Gives warning if more than one --%test annotation used) - procedure test_annot_duplicated; - - --%test(Is added to suite according to annotation order in package spec) - procedure test_annotation_ordering; - - --%endcontext - - --%context(suitepath) - --%displayname(--%suitepath annotation) - - --%test(Sets suite path using first --%suitepath annotation) - procedure suitepath_from_non_empty_path; - - --%test(Gives warning if more than one --%suitepath annotation used) - procedure suitepath_annot_duplicated; - - --%test(Gives warning if --%suitepath annotation has no value) - procedure suitepath_annot_empty; - - --%test(Gives warning if --%suitepath annotation has invalid value) - procedure suitepath_annot_invalid_path; - - --%endcontext - - --%context(rollback) - --%displayname(--%rollback annotation) - - --%test(Sets rollback type using first --%rollback annotation) - procedure rollback_type_valid; - - --%test(Gives warning if more than one --%rollback annotation used) - procedure rollback_type_duplicated; - - --%test(Gives warning if --%rollback annotation has no value) - procedure rollback_type_empty; - - --%test(Gives warning if --%rollback annotation has invalid value) - procedure rollback_type_invalid; - - --%endcontext - - --%context(before_after_all_each) - --%displayname(--%before/after all/each annotations) - - --%test(Supports multiple before/after all/each procedure level definitions) - procedure multiple_before_after; - - --%test(Supports multiple before/after all/each standalone level definitions) - procedure multiple_standalone_bef_aft; - - --%test(Supports mixing before/after all/each annotations on single procedure) - procedure before_after_on_single_proc; - - --%test(Supports mixed before/after all/each as standalone and procedure level definitions) - procedure multiple_mixed_bef_aft; - - --%test(Gives warning if more than one --%beforeall annotation used on procedure) - procedure beforeall_annot_duplicated; - - --%test(Gives warning if more than one --%beforeeach annotation used on procedure) - procedure beforeeach_annot_duplicated; - - --%test(Gives warning if more than one --%afterall annotation used on procedure) - procedure afterall_annot_duplicated; - - --%test(Gives warning if more than one --%aftereach annotation used on procedure) - procedure aftereach_annot_duplicated; - - --%test(Gives warning on before/after all/each annotations mixed with test) - procedure before_after_mixed_with_test; - - --%endcontext - - --%context(context) - --%displayname(--%context annotation) - - --%test(Creates nested suite for content between context/endcontext annotations) - procedure suite_from_context; - - --%test(Associates before/after all/each to tests in context only) - procedure before_after_in_context; - - --%test(Propagates beforeeach/aftereach to context) - procedure before_after_out_of_context; - - --%test(Does not create context and gives warning when endcontext is missing) - procedure context_without_endcontext; - - --%test(Gives warning if --%endcontext is missing a preceding --%context) - procedure endcontext_without_context; - - --%test(Gives warning when two contexts have the same name and ignores duplicated context) - procedure duplicate_context_name; - - --%endcontext - - --%context(throws) - --%displayname(--%throws annotation) - - --%test(Gives warning if --%throws annotation has no value) - procedure throws_value_empty; - - --%test(Gives warning if --%throws annotation has invalid value) - procedure throws_value_invalid; - - --%endcontext - - --%context(beforetest_aftertest) - --%displayname(--%beforetest/aftertest annotation) - - --%test(Supports multiple occurrences of beforetest/aftertest for a test) - procedure before_aftertest_multi; - - --%test(Supports same procedure defined twice) - procedure before_aftertest_twice; - - --%test(Supports beforetest from external package) - procedure before_aftertest_pkg_proc; - - --%test(Supports mix of procedure and package.procedure) - procedure before_aftertest_mixed_syntax; - - --%endcontext - - --%context(unknown_annotation) - --%displayname(--%bad_annotation) - - --%test(Gives warning when unknown procedure level annotation passed) - procedure test_bad_procedure_annotation; - - --%test(Gives warning when unknown package level annotation passed) - procedure test_bad_package_annotation; - - --%endcontext - -end test_suite_builder; -/ diff --git a/test/core/test_suite_manager.pkb b/test/core/test_suite_manager.pkb deleted file mode 100644 index bd6c97779..000000000 --- a/test/core/test_suite_manager.pkb +++ /dev/null @@ -1,1497 +0,0 @@ -create or replace package body test_suite_manager is - - ex_obj_doesnt_exist exception; - pragma exception_init(ex_obj_doesnt_exist, -04043); - - procedure create_dummy_long_test_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package ut3.dummy_long_test_package as - - --%suitepath(verylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtext) - --%suite(dummy_test_suite) - - --%test(dummy_test) - procedure some_dummy_test_procedure; - end;]'; - - execute immediate q'[create or replace package ut3.dummy_long_test_package1 as - - --%suitepath(verylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtext) - --%suite(dummy_test_suite1) - - --%test(dummy_test) - procedure some_dummy_test_procedure; - end;]'; - end; - - procedure drop_dummy_long_test_package is - pragma autonomous_transaction; - begin - execute immediate q'[drop package ut3.dummy_long_test_package]'; - execute immediate q'[drop package ut3.dummy_long_test_package1]'; - end; - - procedure compile_dummy_packages is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package test_package_1 is - - --%suite - --%displayname(test_package_1) - --%suitepath(tests) - --%rollback(manual) - - gv_glob_val number; - - --%beforeeach - procedure global_setup; - - --%aftereach - procedure global_teardown; - - --%test - --%displayname(Test1 from test package 1) - procedure test1; - - --%test(Test2 from test package 1) - --%beforetest(test2_setup) - --%aftertest(test2_teardown) - procedure test2; - - procedure test2_setup; - - procedure test2_teardown; - -end test_package_1;]'; - - execute immediate q'[create or replace package body test_package_1 is - gv_var_1 number; - gv_var_1_temp number; - - procedure global_setup is - begin - gv_var_1 := 1; - gv_glob_val := 1; - end; - - procedure global_teardown is - begin - gv_var_1 := 0; - gv_glob_val := 0; - end; - - procedure test1 is - begin - ut.expect(gv_var_1, 'Some expectation').to_equal(1); - end; - - procedure test2 is - begin - ut.expect(gv_var_1, 'Some expectation').to_equal(2); - end; - - procedure test2_setup is - begin - gv_var_1_temp := gv_var_1; - gv_var_1 := 2; - end; - - procedure test2_teardown is - begin - gv_var_1 := gv_var_1_temp; - gv_var_1_temp := null; - end; - -end test_package_1;]'; - - execute immediate q'[create or replace package test_package_2 is - --%suite - --%suitepath(tests.test_package_1) - - gv_glob_val varchar2(1); - - --%beforeeach - procedure global_setup; - - --%aftereach - procedure global_teardown; - - --%test - procedure test1; - - --%test - --%beforetest(test2_setup) - --%aftertest(test2_teardown) - procedure test2; - - procedure test2_setup; - - procedure test2_teardown; - - --%beforeall - procedure context_setup; - - --%test(Test in a context) - procedure context_test; - - --%afterall - procedure context_teardown; - -end test_package_2;]'; - - execute immediate q'[create or replace package body test_package_2 is - gv_var_1 varchar2(1); - gv_var_1_temp varchar2(1); - - procedure global_setup is - begin - gv_var_1 := 'a'; - gv_glob_val := 'z'; - end; - - procedure global_teardown is - begin - gv_var_1 := 'n'; - gv_glob_val := 'n'; - end; - - procedure test1 is - begin - ut.expect(gv_var_1).to_equal('a'); - end; - - procedure test2 is - begin - ut.expect(gv_var_1).to_equal('b'); - end; - - procedure test2_setup is - begin - gv_var_1_temp := gv_var_1; - gv_var_1 := 'b'; - end; - - procedure test2_teardown is - begin - gv_var_1 := gv_var_1_temp; - gv_var_1_temp := null; - end; - - procedure context_setup is - begin - gv_var_1_temp := gv_var_1 || 'a'; - end; - - procedure context_test is - begin - ut.expect(gv_var_1_temp, 'Some expectation').to_equal('na'); - end; - - procedure context_teardown is - begin - gv_var_1_temp := null; - end; - -end test_package_2;]'; - - execute immediate q'[create or replace package test_package_3 is - --%suite - --%suitepath(tests2) - --%rollback(auto) - - gv_glob_val number; - - --%beforeeach - procedure global_setup; - - --%aftereach - procedure global_teardown; - - --%test - --%rollback(auto) - procedure test1; - - --%test - --%beforetest(test2_setup) - --%aftertest(test2_teardown) - procedure test2; - - procedure test2_setup; - - procedure test2_teardown; - - --%test - --%disabled - procedure disabled_test; - -end test_package_3;]'; - - execute immediate q'[create or replace package body test_package_3 is - gv_var_1 number; - gv_var_1_temp number; - - procedure global_setup is - begin - gv_var_1 := 1; - gv_glob_val := 1; - end; - - procedure global_teardown is - begin - gv_var_1 := 0; - gv_glob_val := 0; - end; - - procedure test1 is - begin - ut.expect(gv_var_1).to_equal(1); - end; - - procedure test2 is - begin - ut.expect(gv_var_1).to_equal(2); - end; - - procedure test2_setup is - begin - gv_var_1_temp := gv_var_1; - gv_var_1 := 2; - end; - - procedure test2_teardown is - begin - gv_var_1 := gv_var_1_temp; - gv_var_1_temp := null; - end; - - procedure disabled_test is - begin - null; - end; - -end test_package_3;]'; - - execute immediate q'[create or replace package test_package_with_ctx is - - --%suite(test_package_with_ctx) - - gv_glob_val number; - - --%context(some_context) - --%displayname(Some context description) - - --%test - --%displayname(Test1 from test package 1) - procedure test1; - - --%endcontext - -end test_package_with_ctx;]'; - - execute immediate q'[create or replace package body test_package_with_ctx is - - procedure test1 is - begin - null; - end; - -end test_package_with_ctx;]'; - end; - - - procedure drop_dummy_packages is - pragma autonomous_transaction; - begin - execute immediate 'drop package test_package_1'; - execute immediate 'drop package test_package_2'; - execute immediate 'drop package test_package_3'; - execute immediate 'drop package test_package_with_ctx'; - end; - - procedure test_schema_run is - c_path constant varchar2(100) := USER; - l_objects_to_run ut3.ut_suite_items := ut3.ut_suite_items(); - l_all_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test2_suite ut3.ut_logical_suite; - begin - --Act - l_all_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - for i in 1..l_all_objects_to_run.count loop - if l_all_objects_to_run(i).name in ('tests', 'tests2') then - l_objects_to_run.extend; - l_objects_to_run(l_objects_to_run.last) := l_all_objects_to_run(i); - end if; - end loop; - - --Assert - ut.expect(l_objects_to_run.count).to_equal(2); - - for i in 1 .. 2 loop - l_test0_suite := treat(l_objects_to_run(i) as ut3.ut_logical_suite); - ut.expect(l_test0_suite.name in ('tests', 'tests2')).to_be_true; - - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - case l_test0_suite.name - when 'tests' then - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(3); - ut.expect(l_test1_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); - l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test2_suite.name).to_equal('test_package_2'); - ut.expect(l_test2_suite.items.count).to_equal(3); - ut.expect(l_test2_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); - when 'tests2' then - ut.expect(l_test1_suite.name).to_equal('test_package_3'); - ut.expect(l_test1_suite.items.count).to_equal(3); - end case; - - end loop; - - end; - - procedure test_top2_by_name is - c_path varchar2(100) := USER||'.test_package_2'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test2_suite ut3.ut_logical_suite; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(1); - ut.expect(l_test1_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); - l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test2_suite.name).to_equal('test_package_2'); - ut.expect(l_test2_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); - ut.expect(l_test2_suite.items.count).to_equal(3); - end; - - procedure test_top2_bt_name_cur_user is - c_path varchar2(100) := 'test_package_2'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test2_suite ut3.ut_logical_suite; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(1); - ut.expect(l_test1_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); - l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test2_suite.name).to_equal('test_package_2'); - ut.expect(l_test2_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); - ut.expect(l_test2_suite.items.count).to_equal(3); - end; - - procedure test_by_path_to_subsuite is - c_path varchar2(100) := USER||':tests.test_package_1.test_package_2'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test2_suite ut3.ut_logical_suite; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(1); - l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test2_suite.name).to_equal('test_package_2'); - ut.expect(l_test2_suite.items.count).to_equal(3); - end; - - procedure test_by_path_to_subsuite_cu is - c_path varchar2(100) := ':tests.test_package_1.test_package_2'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test2_suite ut3.ut_logical_suite; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(1); - l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test2_suite.name).to_equal('test_package_2'); - ut.expect(l_test2_suite.items.count).to_equal(3); - end; - - procedure test_subsute_proc_by_path is - c_path varchar2(100) := USER||':tests.test_package_1.test_package_2.test2'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test2_suite ut3.ut_logical_suite; - l_test_proc ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); - ut.expect(l_test1_suite.items.count).to_equal(1); - l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test2_suite.name).to_equal('test_package_2'); - ut.expect(l_test2_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); - ut.expect(l_test2_suite.items.count).to_equal(1); - - l_test_proc := treat(l_test2_suite.items(1) as ut3.ut_test); - ut.expect(l_test_proc.name).to_equal('test2'); - ut.expect(l_test_proc.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); - ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); - ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); - - end; - - procedure test_subsute_proc_by_path_cu is - c_path varchar2(100) := ':tests.test_package_1.test_package_2.test2'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test2_suite ut3.ut_logical_suite; - l_test_proc ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(1); - l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test2_suite.name).to_equal('test_package_2'); - ut.expect(l_test2_suite.items.count).to_equal(1); - - l_test_proc := treat(l_test2_suite.items(1) as ut3.ut_test); - ut.expect(l_test_proc.name).to_equal('test2'); - ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); - ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); - end; - - procedure test_top_pack_by_name is - c_path varchar2(100) := USER||'.test_package_1'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_suite; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(2); - - ut.expect(l_test1_suite.items(1).name).to_equal('test1'); - ut.expect(l_test1_suite.items(1).description).to_equal('Test1 from test package 1'); - ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).before_test_list.count).to_equal(0); - ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).after_test_list.count).to_equal(0); - ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).before_each_list.count).to_be_greater_than(0); - ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).disabled_flag).to_equal(0); - - ut.expect(l_test1_suite.items(2).name).to_equal('test2'); - ut.expect(l_test1_suite.items(2).description).to_equal('Test2 from test package 1'); - ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).before_test_list.count).to_be_greater_than(0); - ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).after_test_list.count).to_be_greater_than(0); - ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).before_each_list.count).to_be_greater_than(0); - ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).disabled_flag).to_equal(0); - - end; - - procedure test_top_pack_by_name_cu is - c_path varchar2(100) := 'test_package_1'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_suite; - l_test2_suite ut3.ut_suite; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(2); - - ut.expect(l_test1_suite.items(1).name).to_equal('test1'); - ut.expect(l_test1_suite.items(1).description).to_equal('Test1 from test package 1'); - ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).before_test_list.count).to_equal(0); - ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).after_test_list.count).to_equal(0); - ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).before_each_list.count).to_be_greater_than(0); - ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).disabled_flag).to_equal(0); - - ut.expect(l_test1_suite.items(2).name).to_equal('test2'); - ut.expect(l_test1_suite.items(2).description).to_equal('Test2 from test package 1'); - ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).before_test_list.count).to_be_greater_than(0); - ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).after_test_list.count).to_be_greater_than(0); - ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).before_each_list.count).to_be_greater_than(0); - ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).disabled_flag).to_equal(0); - - end; - - procedure test_top_pack_by_path is - c_path varchar2(100) := USER||':tests'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test2_suite ut3.ut_logical_suite; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(3); - l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test2_suite.name).to_equal('test_package_2'); - ut.expect(l_test2_suite.items.count).to_equal(3); - end; - - procedure test_top_pack_by_path_cu is - c_path varchar2(100) := ':tests'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test2_suite ut3.ut_logical_suite; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(3); - l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test2_suite.name).to_equal('test_package_2'); - ut.expect(l_test2_suite.items.count).to_equal(3); - end; - - procedure test_top_pck_proc_by_path is - c_path varchar2(100) := USER||':tests.test_package_1.test2'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test2_suite ut3.ut_logical_suite; - l_test_proc ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(1); - l_test_proc := treat(l_test1_suite.items(1) as ut3.ut_test); - - ut.expect(l_test_proc.name).to_equal('test2'); - ut.expect(l_test_proc.description).to_equal('Test2 from test package 1'); - ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); - ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); - end; - - procedure test_top_pck_proc_by_path_cu is - c_path varchar2(100) := ':tests.test_package_1.test2'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test2_suite ut3.ut_logical_suite; - l_test_proc ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(1); - l_test_proc := treat(l_test1_suite.items(1) as ut3.ut_test); - - ut.expect(l_test_proc.name).to_equal('test2'); - ut.expect(l_test_proc.description).to_equal('Test2 from test package 1'); - ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); - ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); - end; - - procedure test_top_pkc_proc_by_name is - c_path varchar2(100) := USER||'.test_package_1.test2'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test_proc ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(1); - - l_test_proc := treat(l_test1_suite.items(1) as ut3.ut_test); - ut.expect(l_test_proc.name).to_equal('test2'); - ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); - ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); - end; - - procedure test_top_pkc_proc_by_name_cu is - c_path varchar2(100) := 'test_package_1.test2'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test_proc ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_1'); - ut.expect(l_test1_suite.items.count).to_equal(1); - - l_test_proc := treat(l_test1_suite.items(1) as ut3.ut_test); - ut.expect(l_test_proc.name).to_equal('test2'); - ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); - ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); - end; - - procedure test_top_pkc_nosub_by_name is - c_path varchar2(100) := USER||'.test_package_3'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test1 ut3.ut_test; - l_test3 ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests2'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_3'); - ut.expect(l_test1_suite.items.count).to_equal(3); - - l_test1 := treat(l_test1_suite.items(1) as ut3.ut_test); - ut.expect(l_test1.name).to_equal('test1'); - ut.expect(l_test1.DISABLED_FLAG).to_equal(0); - - l_test3 := treat(l_test1_suite.items(3) as ut3.ut_test); - ut.expect(l_test3.name).to_equal('disabled_test'); - ut.expect(l_test3.DISABLED_FLAG).to_equal(1); - end; - - procedure test_top_pkc_nosub_by_name_cu is - c_path varchar2(100) := 'test_package_3'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test1 ut3.ut_test; - l_test3 ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests2'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_3'); - ut.expect(l_test1_suite.items.count).to_equal(3); - - l_test1 := treat(l_test1_suite.items(1) as ut3.ut_test); - ut.expect(l_test1.name).to_equal('test1'); - ut.expect(l_test1.DISABLED_FLAG).to_equal(0); - - l_test3 := treat(l_test1_suite.items(3) as ut3.ut_test); - ut.expect(l_test3.name).to_equal('disabled_test'); - ut.expect(l_test3.DISABLED_FLAG).to_equal(1); - end; - - procedure test_top_subpck_by_path is - c_path varchar2(100) := USER||':tests2.test_package_3'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test1 ut3.ut_test; - l_test3 ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests2'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_3'); - ut.expect(l_test1_suite.items.count).to_equal(3); - - l_test1 := treat(l_test1_suite.items(1) as ut3.ut_test); - ut.expect(l_test1.name).to_equal('test1'); - ut.expect(l_test1.DISABLED_FLAG).to_equal(0); - - l_test3 := treat(l_test1_suite.items(3) as ut3.ut_test); - ut.expect(l_test3.name).to_equal('disabled_test'); - ut.expect(l_test3.DISABLED_FLAG).to_equal(1); - end; - - procedure test_top_subpck_by_path_cu is - c_path varchar2(100) := ':tests2.test_package_3'; - l_objects_to_run ut3.ut_suite_items; - - l_test0_suite ut3.ut_logical_suite; - l_test1_suite ut3.ut_logical_suite; - l_test1 ut3.ut_test; - l_test3 ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - - ut.expect(l_test0_suite.name).to_equal('tests2'); - ut.expect(l_test0_suite.items.count).to_equal(1); - l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); - - ut.expect(l_test1_suite.name).to_equal('test_package_3'); - ut.expect(l_test1_suite.items.count).to_equal(3); - - l_test1 := treat(l_test1_suite.items(1) as ut3.ut_test); - ut.expect(l_test1.name).to_equal('test1'); - ut.expect(l_test1.DISABLED_FLAG).to_equal(0); - - l_test3 := treat(l_test1_suite.items(3) as ut3.ut_test); - ut.expect(l_test3.name).to_equal('disabled_test'); - ut.expect(l_test3.DISABLED_FLAG).to_equal(1); - end; - - procedure test_search_invalid_pck is - l_objects_to_run ut3.ut_suite_items; - begin - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('failing_invalid_spec')); - - ut3.ut.expect(l_objects_to_run.count).to_be_greater_than(0); - ut3.ut.expect(l_objects_to_run(l_objects_to_run.first).object_name).to_equal('failing_invalid_spec'); - end; - - procedure compile_invalid_package is - ex_compilation_error exception; - pragma exception_init(ex_compilation_error,-24344); - pragma autonomous_transaction; - begin - begin - execute immediate q'[create or replace package failing_invalid_spec as - --%suite - gv_glob_val non_existing_table.id%type := 0; - - --%beforeall - procedure before_all; - --%test - procedure test1; - --%test - procedure test2; -end;]'; - exception when ex_compilation_error then null; - end; - begin - execute immediate q'[create or replace package body failing_invalid_spec as - procedure before_all is begin gv_glob_val := 1; end; - procedure test1 is begin ut.expect(1).to_equal(1); end; - procedure test2 is begin ut.expect(1).to_equal(1); end; -end;]'; - exception when ex_compilation_error then null; - end; - end; - procedure drop_invalid_package is - pragma autonomous_transaction; - begin - execute immediate 'drop package failing_invalid_spec'; - end; - - procedure test_search_nonexisting_pck is - l_objects_to_run ut3.ut_suite_items; - begin - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('ut3.failing_non_existing')); - ut.fail('Non existing package did not raise exception'); - exception - when others then - ut.expect(sqlerrm).to_be_like('%failing_non_existing%'); - end; - - procedure test_search_nonexist_sch_pck is - l_objects_to_run ut3.ut_suite_items; - begin - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('failing_non_existing')); - ut.fail('Non existing package without schema did not raise exception'); - exception - when others then - ut.expect(sqlerrm).to_be_like('%ORA-44001: invalid schema%'); - end; - - procedure test_desc_with_comma is - l_objects_to_run ut3.ut_suite_items; - l_suite ut3.ut_suite; - l_test ut3.ut_test; - begin - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_package_to_be_dropped')); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - - l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); - - ut.expect(l_suite.name).to_equal('tst_package_to_be_dropped'); - ut.expect(l_suite.description).to_equal('A suite description, though with comma, is assigned by suite_manager'); - ut.expect(l_suite.items.count).to_equal(2); - - l_test := treat(l_suite.items(1) as ut3.ut_test); - - ut.expect(l_test.name).to_equal('test1'); - ut.expect(l_test.description).to_equal('A test description, though with comma, is assigned by suite_manager'); - --- l_test := treat(l_suite.items(2) as ut3.ut_test); --- --- ut.expect(l_test.name).to_equal('test2'); --- ut.expect(l_test.description).to_equal('A test description, though with comma, is assigned by suite_manager'); - - end; - procedure setup_desc_with_comma is - pragma autonomous_transaction; - begin - execute immediate 'create or replace package tst_package_to_be_dropped as - --%suite(A suite description, though with comma, is assigned by suite_manager) - - --%test(A test description, though with comma, is assigned by suite_manager) - procedure test1; - - --%test - --%displayname(A test description, though with comma, is assigned by suite_manager) - procedure test2; -end;'; - - execute immediate 'create or replace package body tst_package_to_be_dropped as - procedure test1 is begin ut.expect(1).to_equal(1); end; - procedure test2 is begin ut.expect(1).to_equal(1); end; -end;'; - end; - procedure clean_desc_with_comma is - pragma autonomous_transaction; - begin - begin - execute immediate 'drop package tst_package_to_be_dropped'; - exception - when ex_obj_doesnt_exist then - null; - end; - end; - - procedure test_inv_cache_on_drop is - l_test_report ut3.ut_varchar2_list; - begin - - select * bulk collect into l_test_report from table(ut3.ut.run(USER||'.tst_package_to_be_dropped')); - - -- drop package - clean_inv_cache_on_drop; - - begin - select * bulk collect into l_test_report from table(ut3.ut.run(user || '.tst_package_to_be_dropped')); - ut.fail('Cache not invalidated on package drop'); - exception - when others then - ut.expect(sqlerrm).to_be_like('%tst_package_to_be_dropped%does not exist%'); - end; - - end; - procedure setup_inv_cache_on_drop is - pragma autonomous_transaction; - begin - execute immediate 'create or replace package tst_package_to_be_dropped as - --%suite - - --%test - procedure test1; -end;'; - - execute immediate 'create or replace package body tst_package_to_be_dropped as - procedure test1 is begin ut.expect(1).to_equal(1); end; - procedure test2 is begin ut.expect(1).to_equal(1); end; -end;'; - end; - - procedure clean_inv_cache_on_drop is - pragma autonomous_transaction; - begin - execute immediate 'drop package tst_package_to_be_dropped'; - exception - when ex_obj_doesnt_exist then - null; - end; - - procedure test_inv_pck_bodies is - l_test_report ut3.ut_varchar2_list; - begin - - select * bulk collect into l_test_report from table(ut3.ut.run(USER||'.test_dependencies')); - - ut.expect(l_test_report(l_test_report.count-1)).to_be_like('1 test_, 0 failed, 0 errored, 0 disabled, 0 warning(s)'); - --execute immediate 'select * from table(ut3.ut.run(''UT3.test_dependencies'', ut3.utplsql_test_reporter()))' into l_result; - --- ut.expect(l_result).to_equal(ut3.ut_utils.gc_success); - end; - procedure setup_inv_pck_bodies is - pragma autonomous_transaction; - begin - execute immediate 'create table test_dependency_table (id integer)'; - execute immediate 'create or replace package test_dependencies as - -- %suite - - -- %test - procedure dependant; -end;'; - execute immediate 'create or replace package body test_dependencies as - gc_dependant_variable test_dependency_table.id%type; - procedure dependant is begin null; end; -end;'; - - execute immediate 'alter table test_dependency_table modify id number'; - - end; - procedure clean_inv_pck_bodies is - pragma autonomous_transaction; - begin - execute immediate 'drop table test_dependency_table'; - execute immediate 'drop package test_dependencies'; - end; - - procedure test_pck_with_dollar is - l_objects_to_run ut3.ut_suite_items; - l_suite ut3.ut_suite; - begin - --act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_package_with$dollar')); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - - l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); - ut.expect(l_suite.name).to_equal('tst_package_with$dollar'); - end; - procedure setup_pck_with_dollar is - pragma autonomous_transaction; - begin - execute immediate 'create or replace package tst_package_with$dollar as - --%suite - - --%test - procedure test1; -end;'; - - execute immediate 'create or replace package body tst_package_with$dollar as - procedure test1 is begin ut.expect(1).to_equal(1); end; - procedure test2 is begin ut.expect(1).to_equal(1); end; -end;'; - end; - procedure clean_pck_with_dollar is - pragma autonomous_transaction; - begin - execute immediate 'drop package tst_package_with$dollar'; - end; - - - procedure test_pck_with_hash is - l_objects_to_run ut3.ut_suite_items; - l_suite ut3.ut_suite; - begin - --act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_package_with#hash')); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - - l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); - ut.expect(l_suite.name).to_equal('tst_package_with#hash'); - end; - procedure setup_pck_with_hash is - pragma autonomous_transaction; - begin - execute immediate 'create or replace package tst_package_with#hash as - --%suite - - --%test - procedure test1; -end;'; - - execute immediate 'create or replace package body tst_package_with#hash as - procedure test1 is begin ut.expect(1).to_equal(1); end; - procedure test2 is begin ut.expect(1).to_equal(1); end; -end;'; - end; - procedure clean_pck_with_hash is - pragma autonomous_transaction; - begin - execute immediate 'drop package tst_package_with#hash'; - end; - - - procedure test_test_with_dollar is - l_objects_to_run ut3.ut_suite_items; - l_suite ut3.ut_suite; - l_test ut3.ut_test; - begin - --act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_package_with_dollar_test.test$1')); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - - l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); - - ut.expect(l_suite.name).to_equal('tst_package_with_dollar_test'); - ut.expect(l_suite.items.count).to_equal(1); - - l_test := treat(l_suite.items(1) as ut3.ut_test); - - ut.expect(l_test.name).to_equal('test$1'); - - end; - procedure setup_test_with_dollar is - pragma autonomous_transaction; - begin - execute immediate 'create or replace package tst_package_with_dollar_test as - --%suite - - --%test - procedure test$1; -end;'; - - execute immediate 'create or replace package body tst_package_with_dollar_test as - procedure test$1 is begin ut.expect(1).to_equal(1); end; -end;'; - end; - procedure clean_test_with_dollar is - pragma autonomous_transaction; - begin - execute immediate 'drop package tst_package_with_dollar_test'; - end; - - procedure test_test_with_hash is - l_objects_to_run ut3.ut_suite_items; - l_suite ut3.ut_suite; - l_test ut3.ut_test; - begin - --act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_package_with_hash_test.test#1')); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - - l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); - - ut.expect(l_suite.name).to_equal('tst_package_with_hash_test'); - ut.expect(l_suite.items.count).to_equal(1); - - l_test := treat(l_suite.items(1) as ut3.ut_test); - - ut.expect(l_test.name).to_equal('test#1'); - - end; - procedure setup_test_with_hash is - pragma autonomous_transaction; - begin - execute immediate 'create or replace package tst_package_with_hash_test as - --%suite - - --%test - procedure test#1; -end;'; - - execute immediate 'create or replace package body tst_package_with_hash_test as - procedure test#1 is begin ut.expect(1).to_equal(1); end; -end;'; - end; - procedure clean_test_with_hash is - pragma autonomous_transaction; - begin - execute immediate 'drop package tst_package_with_hash_test'; - end; - - procedure test_empty_suite_path is - l_objects_to_run ut3.ut_suite_items; - l_suite ut3.ut_suite; - begin - - --act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_empty_suite_path')); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - - l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); - - ut.expect(l_suite.name).to_equal('tst_empty_suite_path'); - end; - - procedure setup_empty_suite_path is - pragma autonomous_transaction; - begin - execute immediate 'create or replace package tst_empty_suite_path as - --%suite - --%suitepath - - --%test - procedure test1; -end;'; - execute immediate 'create or replace package body tst_empty_suite_path as - procedure test1 is begin ut.expect(1).to_equal(1); end; -end;'; - end; - - procedure clean_empty_suite_path is - pragma autonomous_transaction; - begin - execute immediate 'drop package tst_empty_suite_path'; - end; - - procedure test_pck_with_same_path is - l_objects_to_run ut3.ut_suite_items; - l_suite1 ut3.ut_logical_suite; - l_suite2 ut3.ut_logical_suite; - l_suite3 ut3.ut_suite; - begin - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(':test1.test2$.test_package_same_1')); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - - l_suite1 := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - ut.expect(l_suite1.name).to_equal('test1'); - ut.expect(l_suite1.items.count).to_equal(1); - - l_suite2 := treat(l_suite1.items(1) as ut3.ut_logical_suite); - ut.expect(l_suite2.name).to_equal('test2$'); - ut.expect(l_suite2.items.count).to_equal(1); - - l_suite3 := treat(l_suite2.items(1) as ut3.ut_suite); - ut.expect(l_suite3.name).to_equal('test_package_same_1'); - end; - - procedure setup_pck_with_same_path is - pragma autonomous_transaction; - begin - execute immediate 'create or replace package test_package_same_1 as - --%suite - --%suitepath(test1.test2$) - - --%test - procedure test1; -end;'; - execute immediate 'create or replace package body test_package_same_1 as - procedure test1 is begin null; end; -end;'; - execute immediate 'create or replace package test_package_same_1_a as - --%suite - --%suitepath(test1.test2$) - - --%test - procedure test1; -end;'; - execute immediate 'create or replace package body test_package_same_1_a as - procedure test1 is begin null; end; -end;'; - end; - - procedure clean_pck_with_same_path is - pragma autonomous_transaction; - begin - execute immediate 'drop package test_package_same_1'; - execute immediate 'drop package test_package_same_1_a'; - end; - - procedure setup_disabled_pck is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package test_disabled_floating as - --%suite - - --%test - procedure test1; - - --%disabled - - --%test - procedure test2; - -end;]'; - end; - - procedure clean_disabled_pck is - pragma autonomous_transaction; - begin - execute immediate 'drop package test_disabled_floating'; - end; - - procedure disable_suite_floating_annot is - l_objects_to_run ut3.ut_suite_items; - l_suite ut3.ut_suite; - begin - --Arrange - setup_disabled_pck; - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('test_disabled_floating')); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); - ut.expect(l_suite.name).to_equal('test_disabled_floating'); - ut.expect(l_suite.get_disabled_flag()).to_be_true(); - - clean_disabled_pck; - end; - - procedure pck_proc_in_ctx_by_name is - c_path varchar2(100) := USER||'.test_package_with_ctx.test1'; - l_objects_to_run ut3.ut_suite_items; - - l_test_suite ut3.ut_logical_suite; - l_ctx_suite ut3.ut_logical_suite; - l_test_proc ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - - l_test_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - ut.expect(l_test_suite.name).to_equal('test_package_with_ctx'); - ut.expect(l_test_suite.items.count).to_equal(1); - - l_ctx_suite := treat(l_test_suite.items(1) as ut3.ut_logical_suite); - ut.expect(l_ctx_suite.name).to_equal('some_context'); - ut.expect(l_ctx_suite.description).to_equal('Some context description'); - ut.expect(l_ctx_suite.items.count).to_equal(1); - - l_test_proc := treat(l_ctx_suite.items(1) as ut3.ut_test); - ut.expect(l_test_proc.name).to_equal('test1'); - end; - - procedure pck_proc_in_ctx_by_path is - c_path varchar2(100) := USER||':test_package_with_ctx.some_context.test1'; - l_objects_to_run ut3.ut_suite_items; - - l_test_suite ut3.ut_logical_suite; - l_ctx_suite ut3.ut_logical_suite; - l_test_proc ut3.ut_test; - begin - --Act - l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); - - --Assert - ut.expect(l_objects_to_run.count).to_equal(1); - - l_test_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); - ut.expect(l_test_suite.name).to_equal('test_package_with_ctx'); - ut.expect(l_test_suite.items.count).to_equal(1); - - l_ctx_suite := treat(l_test_suite.items(1) as ut3.ut_logical_suite); - ut.expect(l_ctx_suite.name).to_equal('some_context'); - ut.expect(l_ctx_suite.description).to_equal('Some context description'); - ut.expect(l_ctx_suite.items.count).to_equal(1); - - l_test_proc := treat(l_ctx_suite.items(1) as ut3.ut_test); - ut.expect(l_test_proc.name).to_equal('test1'); - end; - - procedure test_get_schema_ut_packages is - l_expected ut3.ut_object_names; - l_actual ut3.ut_object_names; - begin - l_expected := ut3.ut_object_names( - ut3.ut_object_name('UT3','SOME_TEST_PACKAGE') - ); - l_actual := ut3.ut_suite_manager.get_schema_ut_packages(ut3.ut_varchar2_rows('UT3')); - - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); - end; - procedure create_ut3_suite is - pragma autonomous_transaction; - begin - execute immediate q'[ - create or replace package ut3.some_test_package - as - --%suite - - --%test - procedure some_test; - - end;]'; - end; - - procedure drop_ut3_suite is - pragma autonomous_transaction; - begin - execute immediate q'[drop package ut3.some_test_package]'; - end; - - procedure add_new_long_test_package is - l_actual ut3.ut_object_names; - l_expected_message varchar2(500); - begin - l_expected_message := q'[ORA-20217: 'Suitepath exceeds 1000 CHAR on: UT3.DUMMY_LONG_TEST_PACKAGE,UT3.DUMMY_LONG_TEST_PACKAGE1'%]'; - l_actual := ut3.ut_suite_manager.get_schema_ut_packages(ut3.ut_varchar2_rows('UT3')); - ut.fail('Expected exception for suitpaths over 1k for two packages'); - exception - when others then - ut.expect(dbms_utility.format_error_stack()).to_be_like(l_expected_message); - ut.expect(SQLCODE).to_equal(ut3.ut_utils.gc_value_too_large); - end; - -end test_suite_manager; -/ diff --git a/test/core/test_suite_manager.pks b/test/core/test_suite_manager.pks deleted file mode 100644 index aad29fad0..000000000 --- a/test/core/test_suite_manager.pks +++ /dev/null @@ -1,175 +0,0 @@ -create or replace package test_suite_manager is - - --%suite(suite_manager) - --%suitepath(utplsql.core) - - procedure create_dummy_long_test_package; - - procedure drop_dummy_long_test_package; - - --%beforeall - procedure compile_dummy_packages; - --%afterall - procedure drop_dummy_packages; - - --%test(Prepare Runner For The Schema) - procedure test_schema_run; - - --%test(Prepare runner for the top 2 package by package user.package_name) - procedure test_top2_by_name; - - --%test(Prepare runner for the top2 package by name cur user) - procedure test_top2_bt_name_cur_user; - - --%test(Prepare runner for the subsuite by path) - procedure test_by_path_to_subsuite; - - --%test(Prepare runner for the subsuite by path for current user) - procedure test_by_path_to_subsuite_cu; - - --%test(Prepare runner for the subsuite proc only by path) - procedure test_subsute_proc_by_path; - - --%test(Prepare runner for the subsuite proc only by path for current user) - procedure test_subsute_proc_by_path_cu; - - --%test(Prepare runner for the top package by package name) - procedure test_top_pack_by_name; - - --%test(Prepare runner for the top package by package name for current user) - procedure test_top_pack_by_name_cu; - - --%test(Prepare runner for the top package by path) - procedure test_top_pack_by_path; - - --%test(Prepare runner for the top package by path for current user) - procedure test_top_pack_by_path_cu; - - --%test(Prepare runner for the top package procedure by path) - procedure test_top_pck_proc_by_path; - - --%test(Prepare runner for the top package procedure by path for current user) - procedure test_top_pck_proc_by_path_cu; - - --%test(Prepare runner for the top package procedure without sub-suites by package name) - procedure test_top_pkc_proc_by_name; - - --%test(Prepare runner for the top package procedure without sub-suites by package name for current user) - procedure test_top_pkc_proc_by_name_cu; - - --%test(Prepare runner for the top package without sub-suites by package name) - procedure test_top_pkc_nosub_by_name; - - --%test(Prepare runner for the top package without sub-suites by package name for current user) - procedure test_top_pkc_nosub_by_name_cu; - - --%test(Prepare runner for the suites package by path) - procedure test_top_subpck_by_path; - - --%test(Prepare runner for the suites package by path for current user) - procedure test_top_subpck_by_path_cu; - - --%test(Prepare runner for invalid package - it will add to suite but fail on exec ) - --%beforetest(compile_invalid_package) - --%aftertest(drop_invalid_package) - procedure test_search_invalid_pck; - procedure compile_invalid_package; - procedure drop_invalid_package; - - --%test(Prepare runner for nonexisting package with schema) - procedure test_search_nonexisting_pck; - - --%test(Prepare runner for nonexisting package without schema) - procedure test_search_nonexist_sch_pck; - - --%test(Test description with comma) - --%beforetest(setup_desc_with_comma) - --%aftertest(clean_desc_with_comma) - procedure test_desc_with_comma; - procedure setup_desc_with_comma; - procedure clean_desc_with_comma; - - --%test(Invalidate cache on package drop) - --%beforetest(setup_inv_cache_on_drop) - --%aftertest(clean_inv_cache_on_drop) - procedure test_inv_cache_on_drop; - procedure setup_inv_cache_on_drop; - procedure clean_inv_cache_on_drop; - - --%test(Includes Invalid Package Bodies In The Run) - --%beforetest(setup_inv_pck_bodies) - --%aftertest(clean_inv_pck_bodies) - procedure test_inv_pck_bodies; - procedure setup_inv_pck_bodies; - procedure clean_inv_pck_bodies; - - --%test(Package With Dollar Sign) - --%beforetest(setup_pck_with_dollar) - --%aftertest(clean_pck_with_dollar) - procedure test_pck_with_dollar; - procedure setup_pck_with_dollar; - procedure clean_pck_with_dollar; - - --%test(Package With Hash Sign) - --%beforetest(setup_pck_with_hash) - --%aftertest(clean_pck_with_hash) - procedure test_pck_with_hash; - procedure setup_pck_with_hash; - procedure clean_pck_with_hash; - - --%test(Package with test with dollar sign) - --%beforetest(setup_test_with_dollar) - --%aftertest(clean_test_with_dollar) - procedure test_test_with_dollar; - procedure setup_test_with_dollar; - procedure clean_test_with_dollar; - - --%test(Package with test with hash sign) - --%beforetest(setup_test_with_hash) - --%aftertest(clean_test_with_hash) - procedure test_test_with_hash; - procedure setup_test_with_hash; - procedure clean_test_with_hash; - - - --%test(Setup suite with empty suitepath) - --%beforetest(setup_empty_suite_path) - --%aftertest(clean_empty_suite_path) - procedure test_empty_suite_path; - procedure setup_empty_suite_path; - procedure clean_empty_suite_path; - - --%test(only the defined in suitepath suite/test is executed if multiple similarly named test suites exist in the context differed only by comment) - --%beforetest(setup_pck_with_same_path) - --%aftertest(clean_pck_with_same_path) - procedure test_pck_with_same_path; - procedure setup_pck_with_same_path; - procedure clean_pck_with_same_path; - - --%test(Whole suite gets disabled with floating annotation) - procedure disable_suite_floating_annot; - - --%test(Prepare runner for a package procedure inside context) - procedure pck_proc_in_ctx_by_name; - - --%test(Prepare runner for a package procedure inside context by path) - procedure pck_proc_in_ctx_by_path; - - --%context(get_schema_ut_packages) - - --%test(returns list of all unit test packages in given schema) - --%beforetest(create_ut3_suite) - --%aftertest(drop_ut3_suite) - procedure test_get_schema_ut_packages; - procedure create_ut3_suite; - procedure drop_ut3_suite; - - --%endcontext - - --%test(Adds suitepath to cache over 1k characters long) - --%beforetest(create_dummy_long_test_package) - --%aftertest(drop_dummy_long_test_package) - procedure add_new_long_test_package; - -end test_suite_manager; -/ diff --git a/test/core/test_ut_executable.pkb b/test/core/test_ut_executable.pkb deleted file mode 100644 index 1d2e74ff3..000000000 --- a/test/core/test_ut_executable.pkb +++ /dev/null @@ -1,109 +0,0 @@ -create or replace package body test_ut_executable is - - g_dbms_output_text varchar2(30) := 'Some output from procedure'; - - procedure exec_schema_package_proc is - l_executable ut3.ut_executable; - l_test ut3.ut_test; - l_result boolean; - begin - --Arrange - l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable', a_line_no=> 1); - l_executable := ut3.ut_executable_test( null, 'test_ut_executable', 'passing_proc', ut3.ut_utils.gc_test_execute ); - --Act - l_result := l_executable.do_execute(l_test); - --Assert - ut.expect(l_result).to_be_true; - ut.expect(l_executable.serveroutput).to_be_null; - ut.expect(l_executable.get_error_stack_trace()).to_be_null; - end; - - procedure exec_package_proc_output is - l_executable ut3.ut_executable; - l_test ut3.ut_test; - l_result boolean; - begin - --Arrange - l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable', a_line_no=> 1); - l_executable := ut3.ut_executable_test( user, 'test_ut_executable', 'output_proc', ut3.ut_utils.gc_test_execute ); - --Act - l_result := l_executable.do_execute(l_test); - --Assert - ut.expect(l_result).to_be_true; - ut.expect(l_executable.serveroutput).to_equal(to_clob(g_dbms_output_text||chr(10))); - ut.expect(l_executable.get_error_stack_trace()).to_be_null; - end; - - procedure exec_failing_proc is - l_executable ut3.ut_executable; - l_test ut3.ut_test; - l_result boolean; - begin - --Arrange - l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable', a_line_no=> 1); - l_executable := ut3.ut_executable_test( user, 'test_ut_executable', 'throwing_proc', ut3.ut_utils.gc_test_execute ); - --Act - l_result := l_executable.do_execute(l_test); - --Assert - ut.expect(l_result).to_be_false; - ut.expect(l_executable.serveroutput).to_be_null; - ut.expect(l_executable.get_error_stack_trace()).to_be_like('ORA-06501: PL/SQL: program error%'); - end; - - procedure modify_stateful_package is - l_job_name varchar2(30) := 'recreate_stateful_package'; - l_cnt integer := 1; - pragma autonomous_transaction; - begin - dbms_scheduler.create_job( - job_name => l_job_name, - job_type => 'PLSQL_BLOCK', - job_action => q'/ - begin - execute immediate q'[ - create or replace package stateful_package as - g_state varchar2(3) := 'abc'; - end;]'; - end;/', - start_date => localtimestamp, - enabled => TRUE, - auto_drop => TRUE, - comments => 'one-time job' - ); - $if dbms_db_version.version >= 18 $then - dbms_session.sleep(0.4); - $else - dbms_lock.sleep(0.4); - $end - while l_cnt > 0 loop - select count(1) into l_cnt - from dba_scheduler_running_jobs srj - where srj.job_name = l_job_name; - end loop; - end; - - procedure form_name is - begin - ut.expect(ut3.ut_executable_test( user, ' package ', 'proc', null ).form_name()).to_equal(user||'.package.proc'); - ut.expect(ut3.ut_executable_test( null, 'package', ' proc ', null ).form_name()).to_equal('package.proc'); - ut.expect(ut3.ut_executable_test( null, 'proc', null, null ).form_name()).to_equal('proc'); - ut.expect(ut3.ut_executable_test( ' '||user||' ', 'proc', null, null ).form_name()).to_equal(user||'.proc'); - end; - - procedure passing_proc is - begin - null; - end; - - procedure output_proc is - begin - dbms_output.put_line(g_dbms_output_text); - end; - - procedure throwing_proc is - begin - raise program_error; - end; - -end; -/ diff --git a/test/core/test_ut_executable.pks b/test/core/test_ut_executable.pks deleted file mode 100644 index 4c11e5142..000000000 --- a/test/core/test_ut_executable.pks +++ /dev/null @@ -1,33 +0,0 @@ -create or replace package test_ut_executable is - - --%suite(ut_executable) - --%suitepath(utplsql.core) - - --%context(do_execute) - - --%test(Executes procedure in current schema when user was not provided) - procedure exec_schema_package_proc; - - --%test(Executes procedure and saves dbms_output) - procedure exec_package_proc_output; - - --%test(Executes a procedure raising exception, saves dbms_output and exception stack trace) - procedure exec_failing_proc; - - --%endcontext - - --%context(form_name) - - --%test(Builds a name for the executable test) - procedure form_name; - - --%endcontext - - procedure passing_proc; - - procedure output_proc; - - procedure throwing_proc; - -end; -/ diff --git a/test/core/test_ut_suite.pkb b/test/core/test_ut_suite.pkb deleted file mode 100644 index 04d75277a..000000000 --- a/test/core/test_ut_suite.pkb +++ /dev/null @@ -1,159 +0,0 @@ -create or replace package body test_ut_suite is - - procedure cleanup_package_state is - begin - ut_example_tests.g_number := null; - end; - - procedure disabled_suite is - l_suite ut3.ut_suite; - begin - --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); - l_suite.path := 'ut_example_tests'; - l_suite.disabled_flag := ut3.ut_utils.boolean_to_int(true); - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'set_g_number_0', ut3.ut_utils.gc_before_all)); - l_suite.after_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'add_1_to_g_number', ut3.ut_utils.gc_before_all)); - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - --Act - l_suite.do_execute(); - --Assert - ut.expect(ut_example_tests.g_number).to_be_null; - ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_disabled); - ut.expect(l_suite.results_count.disabled_count).to_equal(2); - ut.expect(l_suite.results_count.warnings_count).to_equal(0); - ut.expect(l_suite.results_count.success_count).to_equal(0); - ut.expect(l_suite.results_count.failure_count).to_equal(0); - ut.expect(l_suite.results_count.errored_count).to_equal(0); - end; - - procedure beforeall_errors is - l_suite ut3.ut_suite; - begin - --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); - l_suite.path := 'ut_example_tests'; - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_before_all)); - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'set_g_number_0', a_line_no=> 1); - --Act - l_suite.do_execute(); - --Assert - ut.expect(ut_example_tests.g_number).to_be_null; - ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(l_suite.results_count.disabled_count).to_equal(0); - ut.expect(l_suite.results_count.warnings_count).to_equal(0); - ut.expect(l_suite.results_count.success_count).to_equal(0); - ut.expect(l_suite.results_count.failure_count).to_equal(0); - ut.expect(l_suite.results_count.errored_count).to_equal(1); - end; - - procedure aftereall_errors is - l_suite ut3.ut_suite; - begin - --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); - l_suite.path := 'ut_example_tests'; - l_suite.after_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_after_all)); - - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'set_g_number_0', a_line_no=> 1); - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - --Act - l_suite.do_execute(); - --Assert - ut.expect(ut_example_tests.g_number).to_equal(1); - ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_success); - ut.expect(l_suite.results_count.disabled_count).to_equal(0); - ut.expect(l_suite.results_count.warnings_count).to_equal(1); - ut.expect(l_suite.results_count.success_count).to_equal(2); - ut.expect(l_suite.results_count.failure_count).to_equal(0); - ut.expect(l_suite.results_count.errored_count).to_equal(0); - end; - - procedure package_without_body is - l_suite ut3.ut_suite; - begin - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_WITHOUT_BODY', a_line_no=> 1); - l_suite.path := 'UT_WITHOUT_BODY'; - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'ut_without_body',a_name => 'test1', a_line_no=> 1); - --Act - l_suite.do_execute(); - --Assert - ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); - end; - - procedure package_with_invalid_body is - l_suite ut3.ut_suite; - begin - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_WITH_INVALID_BODY', a_line_no=> 1); - l_suite.path := 'UT_WITH_INVALID_BODY'; - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'ut_with_invalid_body',a_name => 'test1', a_line_no=> 1); - --Act - l_suite.do_execute(); - --Assert - ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); - end; - - procedure test_rollback_type(a_procedure_name varchar2, a_rollback_type integer, a_expectation ut3_latest_release.ut_matcher) is - l_suite ut3.ut_suite; - begin - --Arrange - execute immediate 'delete from ut$test_table'; - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_TRANSACTION_CONTROL', a_line_no=> 1); - l_suite.path := 'ut_transaction_control'; - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_TRANSACTION_CONTROL', 'setup', ut3.ut_utils.gc_before_all)); - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => USER, a_object_name => 'ut_transaction_control',a_name => a_procedure_name, a_line_no=> 1); - l_suite.set_rollback_type(a_rollback_type); - - --Act - l_suite.do_execute(); - - --Assert - ut.expect(core.get_value(q'[ut_transaction_control.count_rows('t')]')).to_( a_expectation ); - ut.expect(core.get_value(q'[ut_transaction_control.count_rows('s')]')).to_( a_expectation ); - end; - - procedure rollback_auto is - begin - test_rollback_type('test', ut3.ut_utils.gc_rollback_auto, equal(0) ); - end; - - procedure rollback_auto_on_failure is - begin - test_rollback_type('test_failure', ut3.ut_utils.gc_rollback_auto, equal(0) ); - end; - - procedure rollback_manual is - begin - test_rollback_type('test', ut3.ut_utils.gc_rollback_manual, be_greater_than(0) ); - end; - - procedure rollback_manual_on_failure is - begin - test_rollback_type('test_failure', ut3.ut_utils.gc_rollback_manual, be_greater_than(0) ); - end; - - procedure trim_transaction_invalidators is - l_suite ut3.ut_suite; - begin - --arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); - for i in 1 .. 100 loop - l_suite.add_transaction_invalidator('schema_name.package_name.procedure_name'||i); - end loop; - --Act - l_suite.rollback_to_savepoint('dummy_savepoint'); - --Assert - ut.expect(l_suite.warnings.count).to_equal(1); - end; - -end; -/ \ No newline at end of file diff --git a/test/core/test_ut_suite.pks b/test/core/test_ut_suite.pks deleted file mode 100644 index cc4de8528..000000000 --- a/test/core/test_ut_suite.pks +++ /dev/null @@ -1,40 +0,0 @@ -create or replace package test_ut_suite is - - --%suite(ut_suite) - --%suitepath(utplsql.core) - - --%beforeeach - procedure cleanup_package_state; - - --%test(Disabled flag skips tests execution in suite) - procedure disabled_suite; - - --%test(Marks each test as errored if beforeall raises exception) - procedure beforeall_errors; - - --%test(Reports warnings for each test if afterall raises exception) - procedure aftereall_errors; - - --%test(Fails all tests in package when package has no body) - procedure package_without_body; - - --%test(Fails all tests in package when package body is invalid) - procedure package_with_invalid_body; - - --%test(Performs automatic rollback after a suite) - procedure rollback_auto; - - --%test(Performs automatic rollback after a suite even if test fails) - procedure rollback_auto_on_failure; - - --%test(rollback(manual) - disables automatic rollback after a suite) - procedure rollback_manual; - - --%test(rollback(manual) - disables automatic rollback after a suite even if test fails) - procedure rollback_manual_on_failure; - - --%test(Transaction invalidators list is trimmed in warnings when too long) - procedure trim_transaction_invalidators; - -end; -/ diff --git a/test/core/test_ut_test.pkb b/test/core/test_ut_test.pkb deleted file mode 100644 index b521d6841..000000000 --- a/test/core/test_ut_test.pkb +++ /dev/null @@ -1,697 +0,0 @@ -create or replace package body test_ut_test is - - procedure cleanup_package_state is - begin - ut_example_tests.g_number := null; - end; - - procedure disabled_test is - l_suite ut3.ut_suite; - l_test ut3.ut_test; - begin - --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); - l_suite.path := 'ut_example_tests'; - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'set_g_number_0', ut3.ut_utils.gc_before_all)); - - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 2); - l_suite.items(l_suite.items.last).disabled_flag := ut3.ut_utils.boolean_to_int(true); - --Act - l_suite.do_execute(); - --Assert - ut.expect(ut_example_tests.g_number).to_equal(1); - ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_success); - ut.expect(l_suite.results_count.disabled_count).to_equal(1); - ut.expect(l_suite.results_count.warnings_count).to_equal(0); - ut.expect(l_suite.results_count.success_count).to_equal(1); - ut.expect(l_suite.results_count.failure_count).to_equal(0); - ut.expect(l_suite.results_count.errored_count).to_equal(0); - end; - - procedure aftertest_errors is - l_suite ut3.ut_suite; - l_test ut3.ut_test; - begin - --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); - l_suite.path := 'ut_example_tests'; - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'set_g_number_0', ut3.ut_utils.gc_before_all)); - - l_test := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - l_test.before_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'add_1_to_g_number', ut3.ut_utils.gc_before_test)); - l_test.after_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_after_test)); - l_suite.items.extend; - l_suite.items(l_suite.items.last) := l_test; - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - --Act - l_suite.do_execute(); - --Assert - ut.expect(ut_example_tests.g_number).to_equal(3); - ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(l_suite.results_count.disabled_count).to_equal(0); - ut.expect(l_suite.results_count.warnings_count).to_equal(0); - ut.expect(l_suite.results_count.success_count).to_equal(1); - ut.expect(l_suite.results_count.failure_count).to_equal(0); - ut.expect(l_suite.results_count.errored_count).to_equal(1); - end; - - procedure aftereach_errors is - l_suite ut3.ut_suite; - l_test ut3.ut_test; - begin - --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'set_g_number_0', ut3.ut_utils.gc_before_all)); - l_test := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - l_test.before_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'add_1_to_g_number', ut3.ut_utils.gc_before_each)); - l_test.after_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_after_each)); - l_suite.items.extend; - l_suite.items(l_suite.items.last) := l_test; - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - --Act - l_suite.do_execute(); - --Assert - ut.expect(ut_example_tests.g_number).to_equal(3); - ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(l_suite.results_count.disabled_count).to_equal(0); - ut.expect(l_suite.results_count.warnings_count).to_equal(0); - ut.expect(l_suite.results_count.success_count).to_equal(1); - ut.expect(l_suite.results_count.failure_count).to_equal(0); - ut.expect(l_suite.results_count.errored_count).to_equal(1); - end; - - procedure beforetest_errors is - l_suite ut3.ut_suite; - l_test ut3.ut_test; - begin - --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'set_g_number_0', ut3.ut_utils.gc_before_all)); - l_test := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - l_test.before_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_before_test)); - l_test.after_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'add_1_to_g_number', ut3.ut_utils.gc_after_test)); - l_suite.items.extend; - l_suite.items(l_suite.items.last) := l_test; - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - --Act - l_suite.do_execute(); - --Assert - ut.expect(ut_example_tests.g_number).to_equal(2); - ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(l_suite.results_count.disabled_count).to_equal(0); - ut.expect(l_suite.results_count.warnings_count).to_equal(0); - ut.expect(l_suite.results_count.success_count).to_equal(1); - ut.expect(l_suite.results_count.failure_count).to_equal(0); - ut.expect(l_suite.results_count.errored_count).to_equal(1); - end; - - procedure beforeeach_errors is - l_suite ut3.ut_suite; - l_test ut3.ut_test; - begin - --Arrange - l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); - l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'set_g_number_0', ut3.ut_utils.gc_before_all)); - l_test := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - l_test.before_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_before_each)); - l_test.after_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'add_1_to_g_number', ut3.ut_utils.gc_after_each)); - l_suite.items.extend; - l_suite.items(l_suite.items.last) := l_test; - l_suite.items.extend; - l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); - --Act - l_suite.do_execute(); - --Assert - ut.expect(ut_example_tests.g_number).to_equal(2); - ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(l_suite.results_count.disabled_count).to_equal(0); - ut.expect(l_suite.results_count.warnings_count).to_equal(0); - ut.expect(l_suite.results_count.success_count).to_equal(1); - ut.expect(l_suite.results_count.failure_count).to_equal(0); - ut.expect(l_suite.results_count.errored_count).to_equal(1); - end; - - procedure after_each_executed is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - l_test.after_each_list := ut3.ut_executables(ut3.ut_executable(user, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_each)); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); - ut.expect(ut_example_tests.g_number).to_equal(1); - end; - - procedure after_each_proc_name_invalid is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - l_test.after_each_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_after_each) - ); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(ut_example_tests.g_number).to_equal(0); - end; - - procedure after_each_procedure_name_null is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - l_test.after_each_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_after_each) - ); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(ut_example_tests.g_number).to_equal(0); - end; - - procedure create_app_info_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package ut_output_tests - as - --%suite - - gv_before_all_client_info varchar2(200); - gv_before_each_client_info varchar2(200); - gv_before_test_client_info varchar2(200); - gv_after_test_client_info varchar2(200); - gv_after_each_client_info varchar2(200); - gv_after_all_client_info varchar2(200); - - --%test - --%beforetest(before_test) - --%aftertest(after_test) - procedure the_test; - - --%beforeall - procedure beforeall; - - --%beforeeach - procedure beforeeach; - - procedure before_test; - procedure after_test; - - --%aftereach - procedure aftereach; - - --%afterall - procedure afterall; - - end;]'; - execute immediate q'[create or replace package body ut_output_tests - as - - procedure the_test - as - l_module_name varchar2(4000); - l_action_name varchar2(4000); - l_client_info varchar2(4000); - begin - --Generate empty output - dbms_output.put_line(''); - ut.expect(1,'Test 1 Should Pass').to_equal(1); - dbms_application_info.read_module(module_name => l_module_name, action_name => l_action_name); - dbms_application_info.read_client_info(l_client_info); - ut.expect(l_module_name).to_equal('utPLSQL'); - ut.expect(l_action_name).to_be_like('ut_output_tests'); - ut.expect(l_client_info).to_be_like('the_test'); - end; - - procedure beforeall is - begin - dbms_application_info.read_client_info(gv_before_all_client_info); - end; - - procedure beforeeach is - begin - dbms_application_info.read_client_info(gv_before_each_client_info); - end; - - procedure before_test is - begin - dbms_application_info.read_client_info(gv_before_test_client_info); - end; - procedure after_test is - begin - dbms_application_info.read_client_info(gv_after_test_client_info); - end; - - procedure aftereach is - begin - dbms_application_info.read_client_info(gv_after_each_client_info); - end; - - procedure afterall is - begin - dbms_application_info.read_client_info(gv_after_all_client_info); - end; - - end;]'; - end; - - procedure drop_app_info_package is - pragma autonomous_transaction; - begin - execute immediate q'[drop package ut_output_tests]'; - end; - - procedure application_info_on_execution is - l_output_data ut3.ut_varchar2_list; - l_output clob; - function get_test_value(a_variable_name varchar2) return varchar2 is - l_result varchar2(4000); - begin - execute immediate 'begin :i := ut_output_tests.'||a_variable_name||'; end;' using out l_result; - return l_result; - end; - begin - --act - select * bulk collect into l_output_data - from table(ut3.ut.run('ut_output_tests')); - l_output := ut3.ut_utils.table_to_clob(l_output_data); - --assert - - ut.expect(get_test_value('gv_before_all_client_info')).to_equal('beforeall'); - ut.expect(get_test_value('gv_before_each_client_info')).to_equal('beforeeach'); - ut.expect(get_test_value('gv_before_test_client_info')).to_equal('before_test'); - ut.expect(get_test_value('gv_after_test_client_info')).to_equal('after_test'); - ut.expect(get_test_value('gv_after_each_client_info')).to_equal('aftereach'); - ut.expect(get_test_value('gv_after_all_client_info')).to_equal('afterall'); - ut.expect(l_output).to_be_like('%0 failed, 0 errored, 0 disabled, 0 warning(s)%'); - end; - - procedure before_each_executed is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'add_1_to_g_number', - a_line_no => null - ); - begin - l_test.before_each_list := ut3.ut_executables(ut3.ut_executable(user, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_each)); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); - ut.expect(ut_example_tests.g_number).to_equal(1); - end; - - - procedure before_each_proc_name_invalid is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - l_test.before_each_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_before_each) - ); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(ut_example_tests.g_number).to_be_null; - end; - - procedure before_each_proc_name_null is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - l_test.before_each_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_before_each) - ); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(ut_example_tests.g_number).to_be_null; - end; - - procedure ignore_savepoint_exception is - pragma autonomous_transaction; - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'ut_commit_test', - a_line_no => null - ); - begin - l_test.rollback_type := ut3.ut_utils.gc_rollback_auto; - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); - end; - - procedure owner_name_invalid is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_owner => 'invalid owner name', - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - end; - - procedure owner_name_null is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_owner => null, - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); - ut.expect(ut_example_tests.g_number).to_equal(0); - end; - - - procedure create_invalid_package is - pragma autonomous_transaction; - begin - execute immediate 'create or replace package invalid_package is - v_variable non_existing_type; - procedure ut_exampletest; - end;'; - exception when others then - null; - end; - - procedure drop_invalid_package is - pragma autonomous_transaction; - begin - execute immediate 'drop package invalid_package'; - exception when others then - null; - end; - - procedure package_in_invalid_state is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'invalid_package', - a_name => 'ut_exampletest', - a_line_no => null - ); - begin - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - end; - - procedure package_name_invalid is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'invalid package name', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - end; - - procedure package_name_null is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => null, - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - end; - - procedure procedure_name_invalid is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'invalid procedure name', - a_line_no => null - ); - begin - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - end; - - procedure procedure_name_null is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => null, - a_line_no => null - ); - begin - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - end; - - procedure before_test_executed is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'add_1_to_g_number', - a_line_no => null - ); - begin - l_test.before_test_list := ut3.ut_executables(ut3.ut_executable(user, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_test)); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); - ut.expect(ut_example_tests.g_number).to_equal(1); - end; - - procedure before_test_proc_name_invalid is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - l_test.before_test_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_before_test) - ); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(ut_example_tests.g_number).to_be_null; - end; - - procedure before_test_proc_name_null is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - l_test.before_test_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_before_test) - ); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(ut_example_tests.g_number).to_be_null; - end; - - procedure after_test_executed is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - l_test.after_test_list := ut3.ut_executables(ut3.ut_executable(user, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_test)); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); - ut.expect(ut_example_tests.g_number).to_equal(1); - end; - - procedure after_test_proce_name_invalid is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - l_test.after_test_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', 'invalid procedure name', ut3.ut_utils.gc_after_test) - ); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(ut_example_tests.g_number).to_equal(0); - end; - - procedure after_test_proc_name_null is - --Arrange - l_test ut3.ut_test := ut3.ut_test( - a_object_name => 'ut_example_tests', - a_name => 'set_g_number_0', - a_line_no => null - ); - begin - l_test.after_test_list := ut3.ut_executables( - ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_after_test) - ); - --Act - l_test.do_execute(); - --Assert - ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); - ut.expect(ut_example_tests.g_number).to_equal(0); - end; - - procedure create_output_package is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package ut_output_tests - as - --%suite - - --%beforeeach - procedure beforeeach; - - --%aftereach - procedure aftereach; - - --%test - --%beforetest(beforetest) - --%aftertest(aftertest) - procedure ut_passing_test; - - procedure beforetest; - - procedure aftertest; - - --%beforeall - procedure beforeall; - --%afterall - procedure afterall; - - end;]'; - execute immediate q'[create or replace package body ut_output_tests - as - - procedure beforetest is - begin - dbms_output.put_line(''); - end; - - procedure aftertest is - begin - dbms_output.put_line(''); - end; - - procedure beforeeach is - begin - dbms_output.put_line(''); - end; - - procedure aftereach is - begin - dbms_output.put_line(''); - end; - - procedure ut_passing_test is - begin - dbms_output.put_line(''); - ut.expect(1,'Test 1 Should Pass').to_equal(1); - end; - - procedure beforeall is - begin - dbms_output.put_line(''); - end; - - procedure afterall is - begin - dbms_output.put_line(''); - end; - - end;]'; - exception when others then - null; - end; - - procedure drop_output_package is - pragma autonomous_transaction; - begin - execute immediate 'drop package ut_output_tests'; - exception when others then - null; - end; - - procedure test_output_gathering is - l_output_data ut3.ut_varchar2_list; - l_output clob; - begin - select * bulk collect into l_output_data - from table(ut3.ut.run('ut_output_tests')); - l_output := ut3.ut_utils.table_to_clob(l_output_data); - ut.expect(l_output).to_be_like( - '%%%%%%%%1 tests, 0 failed, 0 errored%' - ); - end; - - -end; -/ diff --git a/test/core/test_ut_test.pks b/test/core/test_ut_test.pks deleted file mode 100644 index ee888ecd3..000000000 --- a/test/core/test_ut_test.pks +++ /dev/null @@ -1,94 +0,0 @@ -create or replace package test_ut_test is - - --%suite(ut_test) - --%suitepath(utplsql.core) - - --%beforeeach - procedure cleanup_package_state; - - --%test(Disabled flag for a test skips the tests execution in suite) - procedure disabled_test; - - --%test(Marks test as errored if aftertest raises exception) - procedure aftertest_errors; - - --%test(Marks each test as errored if aftereach raises exception) - procedure aftereach_errors; - - --%test(Marks test as errored if beforetest raises exception) - procedure beforetest_errors; - - --%test(Marks each test as errored if beforeeach raises exception) - procedure beforeeach_errors; - - - --%context(executables in test) - - --%test(Executes aftereach procedure) - procedure after_each_executed; - - --%test(Fails test when aftereach procedure name invalid) - procedure after_each_proc_name_invalid; - --%test(Tails test when aftereach procedure name null) - procedure after_each_procedure_name_null; - - procedure create_app_info_package; - procedure drop_app_info_package; - --%beforetest(create_app_info_package) - --%aftertest(drop_app_info_package) - --%test(Sets application_info on execution of individual items) - procedure application_info_on_execution; - - --%test(Executes beforeeach procedure) - procedure before_each_executed; - --%test(Fails test when beforeeach procedure name invalid) - procedure before_each_proc_name_invalid; - --%test(Fails test when beforeeach procedure name null) - procedure before_each_proc_name_null; - --%test(Does not raise exception when rollback to savepoint fails) - procedure ignore_savepoint_exception; - --%test(Fails when owner name invalid) - procedure owner_name_invalid; - --%test(Runs test as current schema when owner name null) - procedure owner_name_null; - - procedure create_invalid_package; - procedure drop_invalid_package; - --%beforetest(create_app_info_package) - --%aftertest(drop_app_info_package) - --%test(Fails the test that references package with compilation errors) - procedure package_in_invalid_state; - --%test(Fails the test when package name is invalid) - procedure package_name_invalid; - --%test(Fails the test when package name is null) - procedure package_name_null; - --%test(Fails the test when procedure name invalid) - procedure procedure_name_invalid; - --%test(Fails the test when procedure name null) - procedure procedure_name_null; - - - --%test(Executes befroretest procedure) - procedure before_test_executed; - --%test(Fails test when befroretest procedure name invalid) - procedure before_test_proc_name_invalid; - --%test(Fails test when befroretest procedure name is null) - procedure before_test_proc_name_null; - --%test(Executes aftertest procedure) - procedure after_test_executed; - --%test(Fails test when aftertest procedure name invalid) - procedure after_test_proce_name_invalid; - --%test(Fails test when aftertest procedure name is null) - procedure after_test_proc_name_null; - - procedure create_output_package; - procedure drop_output_package; - --%beforetest(create_output_package) - --%aftertest(drop_output_package) - --%test(Test output gathering) - procedure test_output_gathering; - - --%endcontext - -end; -/ diff --git a/test/core/test_ut_utils.pkb b/test/core/test_ut_utils.pkb deleted file mode 100644 index 326f5a49b..000000000 --- a/test/core/test_ut_utils.pkb +++ /dev/null @@ -1,436 +0,0 @@ -create or replace package body test_ut_utils is - - gv_nls_value nls_session_parameters.value%type; - - gc_delimiter varchar2(1) := get_numeric_delimiter(); - - function get_numeric_delimiter return varchar2 is - l_result varchar2(1); - begin - select substr(value, 1, 1) into l_result from nls_session_parameters t where t.parameter = 'NLS_NUMERIC_CHARACTERS'; - return l_result; - end; - - function clob_to_blob(p_clob clob) return blob is - l_blob blob; - l_dest_offset integer := 1; - l_source_offset integer := 1; - l_lang_context integer := dbms_lob.default_lang_ctx; - l_warning integer := dbms_lob.warn_inconvertible_char; - begin - dbms_lob.createtemporary(l_blob, true); - dbms_lob.converttoblob( - dest_lob =>l_blob, - src_clob =>p_clob, - amount =>DBMS_LOB.LOBMAXSIZE, - dest_offset =>l_dest_offset, - src_offset =>l_source_offset, - blob_csid =>DBMS_LOB.DEFAULT_CSID, - lang_context=>l_lang_context, - warning =>l_warning - ); - return l_blob; - end; - - - procedure common_clob_to_table_exec(p_clob varchar2, p_delimiter varchar2, p_expected_list ut3.ut_varchar2_list, p_limit number) is - begin - execute immediate 'declare - l_clob clob := '''||p_clob||'''; - l_delimiter varchar2(1) := '''||p_delimiter||'''; - l_expected ut3.ut_varchar2_list := :p_expected_list; - l_result ut3.ut_varchar2_list; - l_limit integer := '||p_limit||q'[; - l_result_str varchar2(32767); - l_errors integer := 0; - function compare_element(a_element_id integer, a_expected ut3.ut_varchar2_list, a_actual ut3.ut_varchar2_list) return integer is - begin - if a_expected.exists(a_element_id) and a_actual.exists(a_element_id) then - if a_expected(a_element_id) = a_actual(a_element_id) or a_expected(a_element_id) is null and a_actual(a_element_id) is null then - return 0; - else - dbms_output.put('a_expected('||a_element_id||')='||a_expected(a_element_id)||' | a_actual('||a_element_id||')='||a_actual(a_element_id)); - end if; - end if; - if not a_expected.exists(a_element_id) then - dbms_output.put('a_expected('||a_element_id||') does not exist '); - end if; - if not a_actual.exists(a_element_id) then - dbms_output.put('a_actual('||a_element_id||') does not exist '); - end if; - dbms_output.put_line(null); - return 1; - end; -begin ---Act - select column_value bulk collect into l_result from table( ut3.ut_utils.clob_to_table(l_clob, l_limit, l_delimiter) ); - for i in 1 .. l_result.count loop - l_result_str := l_result_str||''''||l_result(i)||''''||l_delimiter; - end loop; - l_result_str := rtrim(l_result_str,l_delimiter); ---Assert - for i in 1 .. greatest(l_expected.count, l_result.count) loop - l_errors := l_errors + compare_element(i, l_expected, l_result); - end loop; - ut.expect(l_errors).to_equal(0); -end;]' using p_expected_list; - end; - - procedure test_clob_to_table is - begin - common_clob_to_table_exec('a,b,c,d', ',', ut3.ut_varchar2_list('a','b','c','d'), 1000); - common_clob_to_table_exec( '', ',', ut3.ut_varchar2_list(), 1000); - common_clob_to_table_exec( '1,b,c,d', '', ut3.ut_varchar2_list('1,b,','c,d'), 4); - common_clob_to_table_exec( 'abcdefg,hijk,axa,a', ',', ut3.ut_varchar2_list('abc','def','g','hij','k','axa','a'), 3); - common_clob_to_table_exec( ',a,,c,d,', ',', ut3.ut_varchar2_list('','a','','c','d',''), 1000); - end; - - procedure test_test_result_to_char is - begin - ut.expect(ut3.ut_utils.test_result_to_char(-1),'test unknown').to_equal('Unknown(-1)'); - ut.expect(ut3.ut_utils.test_result_to_char(null),'test unknown').to_equal('Unknown(NULL)'); - ut.expect(ut3.ut_utils.test_result_to_char(ut3.ut_utils.gc_success),'test unknown').to_equal(ut3.ut_utils.gc_success_char); - end; - - procedure to_string_emptyblob is - begin - ut.expect(ut3.ut_data_value_blob(empty_blob()).to_string()).to_equal('EMPTY'); - end; - - procedure to_string_emptyclob is - begin - ut.expect(ut3.ut_data_value_clob(empty_clob()).to_string()).to_equal('EMPTY'); - end; - - procedure to_string_nullblob is - begin - ut.expect(ut3.ut_data_value_blob(null).to_string()).to_equal('NULL'); - end; - - procedure to_string_nullclob is - begin - ut.expect(ut3.ut_data_value_clob(null).to_string()).to_equal('NULL'); - end; - - procedure to_string_nulldate is - begin - ut.expect(ut3.ut_data_value_date(null).to_string()).to_equal('NULL'); - end; - - procedure to_string_nullnumber is - begin - ut.expect(ut3.ut_data_value_number(null).to_string()).to_equal('NULL'); - end; - - procedure to_string_nulltimestamp is - begin - ut.expect(ut3.ut_data_value_timestamp(null).to_string()).to_equal('NULL'); - end; - - procedure to_string_nulltimestamp_ltz is - begin - ut.expect(ut3.ut_data_value_timestamp_ltz(null).to_string()).to_equal('NULL'); - end; - - procedure to_string_nulltimestamp_tz is - begin - ut.expect(ut3.ut_data_value_timestamp_tz(null).to_string()).to_equal('NULL'); - end; - - procedure to_string_nullvarchar2 is - begin - ut.expect(ut3.ut_data_value_varchar2(null).to_string()).to_equal('NULL'); - end; - - procedure to_string_blob is - l_text varchar2(32767) := 'A test char'; - l_value blob := utl_raw.cast_to_raw(l_text); - l_expected varchar2(32767) := ''''||rawtohex(l_value)||''''; - begin - ut.expect(ut3.ut_data_value_blob(l_value).to_string()).to_equal(l_expected); - end; - - procedure to_string_clob is - l_value clob := 'A test char'; - l_expected varchar2(32767) := ''''||l_value||''''; - begin - ut.expect(ut3.ut_data_value_clob(l_value).to_string()).to_equal(l_expected); - end; - - procedure to_string_date is - l_value date := to_date('2016-12-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss'); - l_expected varchar2(100) := '2016-12-31T23:59:59'; - begin - ut.expect(ut3.ut_data_value_date(l_value).to_string()).to_equal(l_expected); - end; - - procedure to_string_timestamp is - l_value timestamp(9) := to_timestamp('2016-12-31 23:59:59.123456789', 'yyyy-mm-dd hh24:mi:ss.ff'); - l_expected varchar2(100) := '2016-12-31T23:59:59'||gc_delimiter||'123456789'; - begin - ut.expect(ut3.ut_data_value_timestamp(l_value).to_string()).to_equal(l_expected); - end; - - procedure to_string_timestamp_ltz is - l_value timestamp(9) with local time zone := to_timestamp('2016-12-31 23:59:59.123456789', 'yyyy-mm-dd hh24:mi:ss.ff'); - l_expected varchar2(100) := '2016-12-31T23:59:59'||gc_delimiter||'123456789'; - begin - ut.expect(ut3.ut_data_value_timestamp_ltz(l_value).to_string()).to_equal(l_expected); - end; - - procedure to_string_timestamp_tz is - l_value timestamp(9) with time zone := to_timestamp_tz('2016-12-31 23:59:59.123456789 -8:00', 'yyyy-mm-dd hh24:mi:ss.ff tzh:tzm'); - l_expected varchar2(100) := '2016-12-31T23:59:59'||gc_delimiter||'123456789 -08:00'; - begin - ut.expect(ut3.ut_data_value_timestamp_tz(l_value).to_string()).to_equal(l_expected); - end; - - procedure to_string_varchar2 is - l_value varchar2(20) := 'A test char'; - l_expected varchar2(100) := ''''||l_value||''''; - begin - ut.expect(ut3.ut_data_value_varchar2(l_value).to_string()).to_equal(l_expected); - end; - - procedure to_string_verybigblob is - l_text clob := lpad('A test char',32767,'1')||lpad('1',32767,'1'); - l_value blob; - begin - l_value := clob_to_blob(l_text); - ut.expect(length(ut3.ut_data_value_blob(l_value).to_string())).to_equal(ut3.ut_utils.gc_max_output_string_length); - ut.expect(ut3.ut_data_value_blob(l_value).to_string()).to_be_like('%'||ut3.ut_utils.gc_more_data_string); - end; - - procedure to_string_verybigclob is - l_value clob := lpad('A test char',32767,'1')||lpad('1',32767,'1'); - begin - ut.expect(length(ut3.ut_data_value_clob(l_value).to_string())).to_equal(ut3.ut_utils.gc_max_output_string_length); - ut.expect(ut3.ut_data_value_clob(l_value).to_string()).to_be_like('%'||ut3.ut_utils.gc_more_data_string); - end; - - procedure to_string_verybignumber is - l_value number := 1234567890123456789012345678901234567890; - l_expected varchar2(100) := '1234567890123456789012345678901234567890'; - begin - ut.expect(ut3.ut_data_value_number(l_value).to_string()).to_equal(l_expected); - end; - - procedure to_string_verybigvarchar2 is - l_value varchar2(32767) := lpad('A test char',32767,'1'); - l_result varchar2(32767); - begin - ut.expect(length(ut3.ut_data_value_varchar2(l_value).to_string())).to_equal(ut3.ut_utils.gc_max_output_string_length); - ut.expect(ut3.ut_data_value_varchar2(l_value).to_string()).to_be_like('%'||ut3.ut_utils.gc_more_data_string); - end; - - procedure to_string_verysmallnumber is - l_value number := 0.123456789012345678901234567890123456789; - l_expected varchar2(100) := gc_delimiter||'123456789012345678901234567890123456789'; - begin - ut.expect(ut3.ut_data_value_number(l_value).to_string()).to_equal(l_expected); - end; - - procedure test_table_to_clob is - procedure exec_table_to_clob(a_list ut3.ut_varchar2_list, a_delimiter varchar2, a_expected clob) is - l_result clob; - begin - l_result := ut3.ut_utils.table_to_clob(a_list, a_delimiter); - - ut.expect(l_result).to_equal(a_expected, a_nulls_are_equal => true); - end; - begin - exec_table_to_clob(null, ',', ''); - exec_table_to_clob(ut3.ut_varchar2_list(), ',', ''); - exec_table_to_clob(ut3.ut_varchar2_list('a', 'b', 'c', 'd'), ',', 'a,b,c,d'); - exec_table_to_clob(ut3.ut_varchar2_list('1,b,', 'c,d'), ',', '1,b,,c,d'); - exec_table_to_clob(ut3.ut_varchar2_list('', 'a', '', 'c', 'd', ''), ',', ',a,,c,d,'); - end; - - procedure test_append_with_multibyte is - l_lines sys.dbms_preprocessor.source_lines_t; - l_result clob; - begin - l_lines := sys.dbms_preprocessor.get_post_processed_source( - object_type => 'PACKAGE', - schema_name => user, - object_name => 'TST_CHARS' - ); - - for i in 1..l_lines.count loop - l_result := null; - ut3.ut_utils.append_to_clob(l_result, l_lines(i)); - - --Assert - ut.expect(dbms_lob.getlength(l_result),'Error for index '||i).to_equal(dbms_lob.getlength(l_lines(i))); - end loop; - end; - - procedure setup_append_with_multibyte is - pragma autonomous_transaction; - begin - select value into gv_nls_value from nls_session_parameters where parameter = 'NLS_DATE_LANGUAGE'; - execute immediate 'alter session set nls_date_language=ENGLISH'; - execute immediate 'create or replace package tst_chars as --- 2) Status of the process = 😡PE😡 with no linked data -end;'; - execute immediate 'alter session set nls_date_language=RUSSIAN'; - - end; - procedure clean_append_with_multibyte is - pragma autonomous_transaction; - begin - execute immediate 'alter session set nls_date_language='||gv_nls_value; - execute immediate 'drop package tst_chars'; - end; - - procedure test_clob_to_table_multibyte is - l_varchar2_byte_limit integer := 32767; - l_workaround_byte_limit integer := 8191; - l_singlebyte_string_max_size varchar2(32767 char) := rpad('x',l_varchar2_byte_limit,'x'); - l_twobyte_character char(1 char) := '�?'; - l_clob_multibyte clob := l_twobyte_character||l_singlebyte_string_max_size; --here we have 32769(2+32767) bytes and 32768 chars - l_expected ut3.ut_varchar2_list := ut3.ut_varchar2_list(); - l_result ut3.ut_varchar2_list; - begin - l_expected.extend(1); - l_expected(1) := l_twobyte_character||substr(l_singlebyte_string_max_size,1,l_workaround_byte_limit-1); - --Act - l_result := ut3.ut_utils.clob_to_table(l_clob_multibyte); - --Assert - ut.expect(l_result(1)).to_equal(l_expected(1)); - end; - - procedure test_to_version_split is - l_version ut3.ut_utils.t_version; - begin - l_version := ut3.ut_utils.to_version('v034.0.0456.0333'); - ut.expect(l_version.major).to_equal(34); - ut.expect(l_version.minor).to_equal(0); - ut.expect(l_version.bugfix).to_equal(456); - ut.expect(l_version.build).to_equal(333); - end; - - procedure test_trim_list_elements - is - l_list_to_be_equal ut3.ut_varchar2_list := ut3.ut_varchar2_list('hello', 'world', 'okay'); - l_list ut3.ut_varchar2_list := ut3.ut_varchar2_list(' hello ', chr(9)||'world ', 'okay'); - begin - --Act - l_list := ut3.ut_utils.trim_list_elements(l_list); - --Assert - ut.expect(anydata.convertcollection(l_list)).to_equal(anydata.convertcollection(l_list_to_be_equal)); - end; - - procedure trim_list_elemts_null_collect - is - l_list_to_be_null ut3.ut_varchar2_list; - begin - --Act - l_list_to_be_null := ut3.ut_utils.trim_list_elements(l_list_to_be_null); - --Assert - ut.expect(anydata.convertcollection(l_list_to_be_null)).to_be_null; - end; - - procedure trim_list_elemts_empty_collect - is - l_list_to_be_empty ut3.ut_varchar2_list := ut3.ut_varchar2_list(); - begin - --Act - l_list_to_be_empty := ut3.ut_utils.trim_list_elements(l_list_to_be_empty); - --Assert - ut.expect(anydata.convertcollection(l_list_to_be_empty)).to_be_empty; - end; - - procedure test_filter_list - is - l_list_to_be_equal ut3.ut_varchar2_list := ut3.ut_varchar2_list('-12458', '8956', '789'); - l_list ut3.ut_varchar2_list := ut3.ut_varchar2_list('-12458', '8956', 'okay', null,'458963', '789'); - begin - --Act - l_list := ut3.ut_utils.filter_list(l_list, '^-?[[:digit:]]{1,5}$'); - --Assert - ut.expect(anydata.convertcollection(l_list)).to_equal(anydata.convertcollection(l_list_to_be_equal)); - end; - - procedure filter_list_null_collection - is - l_list_to_be_null ut3.ut_varchar2_list; - begin - --Act - l_list_to_be_null := ut3.ut_utils.filter_list(l_list_to_be_null, '^-?[[:digit:]]{1,5}$'); - --Assert - ut.expect(anydata.convertcollection(l_list_to_be_null)).to_be_null; - end; - - procedure filter_list_empty_collection - is - l_list_to_be_empty ut3.ut_varchar2_list := ut3.ut_varchar2_list(); - begin - --Act - l_list_to_be_empty := ut3.ut_utils.filter_list(l_list_to_be_empty, '^-?[[:digit:]]{1,5}$'); - --Assert - ut.expect(anydata.convertcollection(l_list_to_be_empty)).to_be_empty; - end; - - procedure replace_multiline_comments - is - l_source clob; - l_actual clob; - l_expected clob; - begin - --Arrange - l_source := q'[ -create or replace package dummy as - - -- single line comment with disabled /* multi-line comment */ - gv_text0 varchar2(200) := q'{/* multi-line comment - in escaped q'multi-line - string*/}'; - gv_text1 varchar2(200) := '/* multi-line comment in a string*/'; - gv_text2 varchar2(200) := '/* multi-line comment - in a multi-line - string*/'; - -- ignored start of multi-line comment with multi-byte text � /* - -- ignored end of multi-line comment with multi-byte text � */ - /* multi-line comment - with - multi-byte characters ��� - in it */ - gv_text3 varchar2(200) := 'some text'; /* multiline comment*/ --followed by single-line comment - /* multi-line comment in one line*/ - gv_text4 varchar2(200) := q'{/* multi-line comment - in escaped q'multi-line - string*/}'; -end; -]'; - l_expected := q'[ -create or replace package dummy as - - -- single line comment with disabled /* multi-line comment */ - gv_text0 varchar2(200) := q'{/* multi-line comment - in escaped q'multi-line - string*/}'; - gv_text1 varchar2(200) := '/* multi-line comment in a string*/'; - gv_text2 varchar2(200) := '/* multi-line comment - in a multi-line - string*/'; - -- ignored start of multi-line comment with multi-byte text � /* - -- ignored end of multi-line comment with multi-byte text � */ - ]'||q'[ - - - - gv_text3 varchar2(200) := 'some text'; --followed by single-line comment - ]'||q'[ - gv_text4 varchar2(200) := q'{/* multi-line comment - in escaped q'multi-line - string*/}'; -end; -]'; - --Act - l_actual := ut3.ut_utils.replace_multiline_comments(l_source); - --Assert - ut.expect(l_actual).to_equal(l_expected); - end; -end test_ut_utils; -/ diff --git a/test/core/test_ut_utils.pks b/test/core/test_ut_utils.pks deleted file mode 100644 index 8452f84c3..000000000 --- a/test/core/test_ut_utils.pks +++ /dev/null @@ -1,132 +0,0 @@ -create or replace package test_ut_utils is - - --%suite(ut_utils) - --%suitepath(utplsql.core) - - function get_numeric_delimiter return varchar2; - - --%test(clob_to_table - Converts a clob into ut_varchar2_list using specified delimiter) - procedure test_clob_to_table; - - --%test(test_result_to_char - Converts numeric test result to character representation) - procedure test_test_result_to_char; - - - --%context(to_string) - - --%test(Returns 'EMPTY' string for NULL BLOB) - procedure to_string_emptyblob; - - --%test(Returns 'EMPTY' string for NULL CLOB) - procedure to_string_emptyclob; - - --%test(Returns 'NULL' string for NULL BLOB) - procedure to_string_nullblob; - - --%test(Returns 'NULL' string for NULL CLOB) - procedure to_string_nullclob; - - --%test(Returns 'NULL' string for NULL date) - procedure to_string_nulldate; - - --%test(Returns 'NULL' string for NULL number) - procedure to_string_nullnumber; - - --%test(Returns 'NULL' string for NULL timestamp) - procedure to_string_nulltimestamp; - - --%test(Returns 'NULL' string for NULL timestamp with local timezone) - procedure to_string_nulltimestamp_ltz; - - --%test(Returns 'NULL' string for NULL timestamp with timezone) - procedure to_string_nulltimestamp_tz; - - --%test(Returns 'NULL' string for NULL varchar) - procedure to_string_nullvarchar2; - - --%test(Returns string representation of BLOB) - procedure to_string_blob; - - --%test(Returns string representation of CLOB) - procedure to_string_clob; - - --%test(Returns string representation of date) - procedure to_string_date; - - --%test(Returns string representation of timestamp) - procedure to_string_timestamp; - - --%test(Returns string representation of timestamp with local timezone) - procedure to_string_timestamp_ltz; - - --%test(Returns string representation of timestamp with timezone) - procedure to_string_timestamp_tz; - - --%test(Returns varchar value) - procedure to_string_varchar2; - - --%test(Returns BLOB trimmed to 4000 chars with trailing [...]) - procedure to_string_verybigblob; - ---%test(Returns CLOB trimmed to 4000 chars with trailing [...]) - procedure to_string_verybigclob; - - --%test(Returns string representation of large number) - procedure to_string_verybignumber; - - --%test(Returns varchar2 trimmed to 4000 chars with trailing [...]) - procedure to_string_verybigvarchar2; - - --%test(Returns string representation of small number) - procedure to_string_verysmallnumber; - - --%endcontext - - --%test(table_to_clob - converts ut_varchar2_list into a CLOB value) - procedure test_table_to_clob; - - --%test(append_to_clob - adds multibyte varchar to CLOB) - --%beforetest(setup_append_with_multibyte) - --%aftertest(clean_append_with_multibyte) - procedure test_append_with_multibyte; - procedure setup_append_with_multibyte; - procedure clean_append_with_multibyte; - - --%test(clob_to_table - converts multibyte CLOB to ut_varchar2_list) - --%disabled(We cannot run this test successfully on 12.1 until we change NLSCHARACTERSET from US7ASCII to AL32UTF8) - procedure test_clob_to_table_multibyte; - - --%test(to_version - splits version string into individual version components) - procedure test_to_version_split; - - --%context(trim_list_elements) - - --%test(Trims the elements of a collection) - procedure test_trim_list_elements; - - --%test(Trim list elements with null collection) - procedure trim_list_elemts_null_collect; - - --%test(Trim list elements with empty collection) - procedure trim_list_elemts_empty_collect; - - --%endcontext - - --%context(filter_list) - - --%test(Filters the collection's elements) - procedure test_filter_list; - - --%test(Filter list elements with null collection) - procedure filter_list_null_collection; - - --%test(Filter list elements with empty collection) - procedure filter_list_empty_collection; - - --%endcontext - - --%test(replace_multiline_comments - replaces multi-line comments with empty lines) - procedure replace_multiline_comments; - -end test_ut_utils; -/ diff --git a/test/helpers/other_dummy_object.tps b/test/helpers/other_dummy_object.tps deleted file mode 100644 index c1019c415..000000000 --- a/test/helpers/other_dummy_object.tps +++ /dev/null @@ -1,16 +0,0 @@ -declare - l_exists integer; -begin - select count(1) into l_exists from user_types where type_name = 'OTHER_DUMMY_OBJECT'; - if l_exists > 0 then - execute immediate 'drop type other_dummy_object force'; - end if; -end; -/ - -create or replace type other_dummy_object as object ( - id number, - "name" varchar2(30), - "Value" varchar2(30) -) -/ \ No newline at end of file diff --git a/test/helpers/test_dummy_object_list.tps b/test/helpers/test_dummy_object_list.tps deleted file mode 100644 index e1dde66ed..000000000 --- a/test/helpers/test_dummy_object_list.tps +++ /dev/null @@ -1,4 +0,0 @@ -create or replace type test_dummy_object_list as table of test_dummy_object -/ - -grant execute on test_dummy_object_list to ut3$user#; \ No newline at end of file diff --git a/test/helpers/test_event_list.tps b/test/helpers/test_event_list.tps deleted file mode 100644 index 8abf71b13..000000000 --- a/test/helpers/test_event_list.tps +++ /dev/null @@ -1,2 +0,0 @@ -create or replace type test_event_list as table of test_event_object; -/ diff --git a/test/helpers/test_event_object.tps b/test/helpers/test_event_object.tps deleted file mode 100644 index da458d2c2..000000000 --- a/test/helpers/test_event_object.tps +++ /dev/null @@ -1,15 +0,0 @@ -declare - l_exists integer; -begin - select count(1) into l_exists from user_types where type_name = 'TEST_EVENT_OBJECT'; - if l_exists > 0 then - execute immediate 'drop type test_event_object force'; - end if; -end; -/ - -create or replace type test_event_object as object ( - event_type varchar2(1000), - event_doc xmltype -) -/ \ No newline at end of file diff --git a/test/helpers/test_tab_varchar2.tps b/test/helpers/test_tab_varchar2.tps deleted file mode 100644 index 17086292a..000000000 --- a/test/helpers/test_tab_varchar2.tps +++ /dev/null @@ -1,12 +0,0 @@ -declare - l_exists integer; -begin - select count(1) into l_exists from user_types where type_name = 'T_TAB_VARCHAR'; - if l_exists > 0 then - execute immediate 'drop type t_tab_varchar force'; - end if; -end; -/ - -create or replace type t_tab_varchar is table of varchar2(1) -/ \ No newline at end of file diff --git a/test/helpers/test_tab_varray.tps b/test/helpers/test_tab_varray.tps deleted file mode 100644 index 3c684afca..000000000 --- a/test/helpers/test_tab_varray.tps +++ /dev/null @@ -1,13 +0,0 @@ -declare - l_exists integer; -begin - select count(1) into l_exists from user_types where type_name = 'T_VARRAY'; - if l_exists > 0 then - execute immediate 'drop type t_varray force'; - end if; -end; -/ - - -create or replace type t_varray is varray(1) of number -/ \ No newline at end of file diff --git a/test/helpers/ut3user#.test_cursor_grants.pkb b/test/helpers/ut3user#.test_cursor_grants.pkb deleted file mode 100644 index 112d9559e..000000000 --- a/test/helpers/ut3user#.test_cursor_grants.pkb +++ /dev/null @@ -1,114 +0,0 @@ -create or replace package body ut3$user#.test_cursor_grants is - - procedure run_test_join_by_cursor is - begin - ut3.ut.run('test_cursor_grants.test_join_by_cursor'); - end; - - procedure run_test_equal_cursor is - begin - ut3.ut.run('test_cursor_grants.test_equal_cursor'); - end; - - procedure run_test_not_empty_cursor is - begin - ut3.ut.run('test_cursor_grants.test_not_empty_cursor'); - end; - - procedure run_test_have_count_cursor is - begin - ut3.ut.run('test_cursor_grants.test_have_count_cursor'); - end; - - procedure run_test_empty_cursor is - begin - ut3.ut.run('test_cursor_grants.test_empty_cursor'); - end; - - procedure run_test_equal_non_diff_sql is - begin - ut3.ut.run('test_cursor_grants.test_equal_non_diff_sql'); - end; - - procedure test_join_by_cursor is - l_actual SYS_REFCURSOR; - l_expected SYS_REFCURSOR; - begin - --Arrange - open l_actual for select owner, object_name,object_type from all_objects where owner = user - order by 1,2,3 asc; - open l_expected for select owner, object_name,object_type from all_objects where owner = user - order by 1,2,3 desc; - - --Act - ut3.ut.expect(l_actual).to_equal(l_expected).join_by('OBJECT_NAME,OBJECT_TYPE'); - - end; - - procedure test_equal_cursor is - l_actual SYS_REFCURSOR; - l_expected SYS_REFCURSOR; - l_list ut3_tester.test_dummy_object_list; - begin - --Arrange - open l_actual for select value(x) as item from table(l_list) x; - open l_expected for select value(x) as item from table(l_list) x; - - --Act - ut3.ut.expect(l_actual).to_equal(l_expected); - - end; - - procedure test_not_empty_cursor is - l_details_cur SYS_REFCURSOR; - l_expected ut3_tester.test_dummy_object_list; - begin - select ut3_tester.test_dummy_object( rn, 'Something '||rn, rn1) - bulk collect into l_expected - from (select rownum * case when mod(rownum,2) = 0 then -1 else 1 end rn, - rownum * case when mod(rownum,4) = 0 then -1 else 1 end rn1 - from dual connect by level <=10); - - --Arrange - open l_details_cur for - select value(x) as item from table(l_expected) x; - - --Act - ut3.ut.expect(l_details_cur).not_to_be_empty(); - end; - - procedure test_have_count_cursor is - l_expected SYS_REFCURSOR; - begin - --Arrange - open l_expected for - select value(x) as item from table(ut3_tester.test_dummy_object_list()) x; - - --Act - ut3.ut.expect(l_expected).to_have_count(0); - end; - - procedure test_empty_cursor is - l_expected SYS_REFCURSOR; - begin - open l_expected for - select value(x) as item from table(ut3_tester.test_dummy_object_list()) x; - --Act - ut3.ut.expect(l_expected).to_be_empty(); - end; - - procedure test_equal_non_diff_sql is - l_actual SYS_REFCURSOR; - l_expected SYS_REFCURSOR; - begin - open l_actual for - select to_clob('test1') as item from dual; - - open l_expected for - select to_clob('test1') as item from dual; - - ut3.ut.expect(l_actual).to_equal(l_expected); - end; - -end; -/ diff --git a/test/helpers/ut3user#.test_cursor_grants.pks b/test/helpers/ut3user#.test_cursor_grants.pks deleted file mode 100644 index cf829c09f..000000000 --- a/test/helpers/ut3user#.test_cursor_grants.pks +++ /dev/null @@ -1,30 +0,0 @@ -create or replace package ut3$user#.test_cursor_grants is - --%suite() - - procedure run_test_join_by_cursor; - procedure run_test_equal_cursor; - procedure run_test_not_empty_cursor; - procedure run_test_have_count_cursor; - procedure run_test_empty_cursor; - procedure run_test_equal_non_diff_sql; - - --%test(execute join by test) - procedure test_join_by_cursor; - - --%test(execute equal test) - procedure test_equal_cursor; - - --%test(execute not empty test) - procedure test_not_empty_cursor; - - --%test(execute have_count test) - procedure test_have_count_cursor; - - --%test(execute empty test) - procedure test_empty_cursor; - - --%test(execute test with non diff datatype) - procedure test_equal_non_diff_sql; - -end; -/ diff --git a/test/helpers/ut_example_tests.pkb b/test/helpers/ut_example_tests.pkb deleted file mode 100644 index d8afd592a..000000000 --- a/test/helpers/ut_example_tests.pkb +++ /dev/null @@ -1,24 +0,0 @@ -create or replace package body ut_example_tests -as - - procedure set_g_number_0 as - begin - g_number := 0; - end; - - procedure add_1_to_g_number as - begin - g_number := g_number + 1; - end; - - procedure failing_procedure as - begin - g_number := 1 / 0; - end; - - procedure ut_commit_test is - begin - commit; - end; -end; -/ diff --git a/test/helpers/ut_example_tests.pks b/test/helpers/ut_example_tests.pks deleted file mode 100644 index 428d55743..000000000 --- a/test/helpers/ut_example_tests.pks +++ /dev/null @@ -1,8 +0,0 @@ -create or replace package ut_example_tests as - g_number number; - procedure set_g_number_0; - procedure add_1_to_g_number; - procedure failing_procedure; - procedure ut_commit_test; -end; -/ diff --git a/test/helpers/ut_test_table.sql b/test/helpers/ut_test_table.sql deleted file mode 100644 index bccd07bc4..000000000 --- a/test/helpers/ut_test_table.sql +++ /dev/null @@ -1,11 +0,0 @@ -declare - l_exists integer; -begin - select count(1) into l_exists from user_tables where table_name = 'UT$TEST_TABLE'; - if l_exists > 0 then - execute immediate 'drop table ut$test_table'; - end if; -end; -/ - -create table ut$test_table (val varchar2(1)); diff --git a/test/helpers/ut_with_invalid_body.pkb b/test/helpers/ut_with_invalid_body.pkb deleted file mode 100644 index e265bf8de..000000000 --- a/test/helpers/ut_with_invalid_body.pkb +++ /dev/null @@ -1,4 +0,0 @@ -create or replace package body ut_with_invalid_body as - procedure test1; -end; -/ \ No newline at end of file diff --git a/test/helpers/ut_with_invalid_body.pks b/test/helpers/ut_with_invalid_body.pks deleted file mode 100644 index 702affb59..000000000 --- a/test/helpers/ut_with_invalid_body.pks +++ /dev/null @@ -1,4 +0,0 @@ -create or replace package ut_with_invalid_body as - procedure test1; -end; -/ \ No newline at end of file diff --git a/test/helpers/ut_without_body.pks b/test/helpers/ut_without_body.pks deleted file mode 100644 index 45a3c50d4..000000000 --- a/test/helpers/ut_without_body.pks +++ /dev/null @@ -1,4 +0,0 @@ -create or replace package ut_without_body as - procedure test1; -end; -/ \ No newline at end of file diff --git a/test/install_and_run_tests.sh b/test/install_and_run_tests.sh index 385cb46a4..421732be1 100755 --- a/test/install_and_run_tests.sh +++ b/test/install_and_run_tests.sh @@ -6,13 +6,17 @@ git rev-parse && cd "$(git rev-parse --show-cdup)" cd test -time "$SQLCLI" ${UT3_TESTER}/${UT3_TESTER_PASSWORD}@//${CONNECTION_STR} @install_tests.sql +time "$SQLCLI" ${UT3_TESTER_HELPER}/${UT3_TESTER_HELPER_PASSWORD}@//${CONNECTION_STR} @install_ut3_tester_helper.sql -cd .. +time "$SQLCLI" ${UT3_USER}/${UT3_USER_PASSWORD}@//${CONNECTION_STR} @install_ut3_user_tests.sql + +time "$SQLCLI" ${UT3_TESTER}/${UT3_TESTER_PASSWORD}@//${CONNECTION_STR} @install_ut3_tester_tests.sql +cd .. time utPLSQL-cli/bin/utplsql run ${UT3_TESTER}/${UT3_TESTER_PASSWORD}@${CONNECTION_STR} \ -source_path=source -owner=ut3 \ +-p='ut3_tester,ut3$user#' \ -test_path=test -c \ -f=ut_coverage_sonar_reporter -o=coverage.xml \ -f=ut_coverage_html_reporter -o=coverage.html \ diff --git a/test/install_ut3_tester_helper.sql b/test/install_ut3_tester_helper.sql index 0eabb98c9..14586c469 100644 --- a/test/install_ut3_tester_helper.sql +++ b/test/install_ut3_tester_helper.sql @@ -4,12 +4,13 @@ whenever oserror exit failure rollback alter session set plsql_optimize_level=0; --Install ut3_tester_helper -@@ut3_tester_helper/core.pks +@@ut3_tester_helper/test_dummy_object.tps -@@ut3_tester_helper/core.pkb +@@ut3_tester_helper/main_helper.pks +@@ut3_tester_helper/run_helper.pks - -grant execute on ut3_tester_helper.core to UT3$USER#; +@@ut3_tester_helper/main_helper.pkb +@@ut3_tester_helper/run_helper.pkb set linesize 200 set define on @@ -36,6 +37,12 @@ begin else dbms_output.put_line('Installation completed successfully'); end if; + + for i in ( select object_name from user_objects t where t.object_type in ('PACKAGE','TYPE')) + loop + execute immediate 'grant execute on '||i.object_name||' to PUBLIC'; + end loop; + end; / diff --git a/test/install_ut3_tester_tests.sql b/test/install_ut3_tester_tests.sql new file mode 100644 index 000000000..85b0ae201 --- /dev/null +++ b/test/install_ut3_tester_tests.sql @@ -0,0 +1,41 @@ +set define off +whenever sqlerror exit failure rollback +whenever oserror exit failure rollback + +alter session set plsql_optimize_level=0; + + +--Install tests +@@ut3_tester/core/annotations/test_before_after_annotations.pks + +@@ut3_tester/core/annotations/test_before_after_annotations.pkb + +set linesize 200 +set define on +set verify off +column text format a100 +column error_count noprint new_value error_count + +prompt Validating installation + +set heading on +select type, name, sequence, line, position, text, count(1) over() error_count + from all_errors + where owner = USER + and name not like 'BIN$%' --not recycled + and name != 'UT_WITH_INVALID_BODY' + -- errors only. ignore warnings + and attribute = 'ERROR' + order by name, type, sequence +/ + +begin + if to_number('&&error_count') > 0 then + raise_application_error(-20000, 'Not all sources were successfully installed.'); + else + dbms_output.put_line('Installation completed successfully'); + end if; +end; +/ + +exit; diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index 4890d002a..666a410a4 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -6,7 +6,12 @@ alter session set plsql_optimize_level=0; prompt Install user tests @@ut3_user/expectations/test_matchers.pks +@@ut3_user/expectations/test_expectations_cursor.pks +@@ut3_user/api/test_ut_runner.pks + @@ut3_user/expectations/test_matchers.pkb +@@ut3_user/expectations/test_expectations_cursor.pkb +@@ut3_user/api/test_ut_runner.pkb set linesize 200 set define on @@ -33,6 +38,12 @@ begin else dbms_output.put_line('Installation completed successfully'); end if; + + for i in ( select object_name from user_objects t where t.object_type = 'PACKAGE') + loop + execute immediate 'grant execute on '||i.object_name||' to UT3_TESTER'; + end loop; + end; / diff --git a/test/core/annotations/test_before_after_annotations.pkb b/test/ut3_tester/core/annotations/test_before_after_annotations.pkb similarity index 99% rename from test/core/annotations/test_before_after_annotations.pkb rename to test/ut3_tester/core/annotations/test_before_after_annotations.pkb index 0aa9f5c39..804508c61 100644 --- a/test/core/annotations/test_before_after_annotations.pkb +++ b/test/ut3_tester/core/annotations/test_before_after_annotations.pkb @@ -205,7 +205,7 @@ create or replace package body test_before_after_annotations is execute immediate 'drop package dummy_before_after_test'; execute immediate 'drop package shared_test_package'; - g_tests_results := ut3.ut_utils.table_to_clob(l_test_results); + g_tests_results := ut3_tester_helper.main_helper.table_to_clob(l_test_results); end; procedure beforetest_local_procedure is diff --git a/test/core/annotations/test_before_after_annotations.pks b/test/ut3_tester/core/annotations/test_before_after_annotations.pks similarity index 100% rename from test/core/annotations/test_before_after_annotations.pks rename to test/ut3_tester/core/annotations/test_before_after_annotations.pks diff --git a/test/ut3_tester_helper/core.pkb b/test/ut3_tester/core/core.pkb similarity index 100% rename from test/ut3_tester_helper/core.pkb rename to test/ut3_tester/core/core.pkb diff --git a/test/ut3_tester_helper/core.pks b/test/ut3_tester/core/core.pks similarity index 94% rename from test/ut3_tester_helper/core.pks rename to test/ut3_tester/core/core.pks index a722a9871..c011d8916 100644 --- a/test/ut3_tester_helper/core.pks +++ b/test/ut3_tester/core/core.pks @@ -1,4 +1,4 @@ -create or replace package core is +create or replace package main_helper is gc_success number := ut3.ut_utils.gc_success; gc_failure number := ut3.ut_utils.gc_failure; diff --git a/test/ut3_tester_helper/main_helper.pkb b/test/ut3_tester_helper/main_helper.pkb new file mode 100644 index 000000000..9ceedd68a --- /dev/null +++ b/test/ut3_tester_helper/main_helper.pkb @@ -0,0 +1,90 @@ +create or replace package body main_helper is + + function get_dbms_output_as_clob return clob is + l_status number; + l_line varchar2(32767); + l_result clob; + begin + + dbms_output.get_line(line => l_line, status => l_status); + if l_status != 1 then + dbms_lob.createtemporary(l_result, true, dur => dbms_lob.session); + end if; + while l_status != 1 loop + if l_line is not null then + ut3.ut_utils.append_to_clob(l_result, l_line||chr(10)); + end if; + dbms_output.get_line(line => l_line, status => l_status); + end loop; + return l_result; + end; + + procedure execute_autonomous(a_sql varchar2) is + pragma autonomous_transaction; + begin + if a_sql is not null then + execute immediate a_sql; + end if; + commit; + end; + + function run_test(a_path varchar2) return clob is + l_lines ut3.ut_varchar2_list; + begin + select * bulk collect into l_lines from table(ut3.ut.run(a_path)); + return ut3.ut_utils.table_to_clob(l_lines); + end; + + function get_value(a_variable varchar2) return integer is + l_glob_val integer; + begin + execute immediate 'begin :l_glob_val := '||a_variable||'; end;' using out l_glob_val; + return l_glob_val; + end; + + function get_failed_expectations return ut3.ut_varchar2_list is + l_expectations_result ut3.ut_expectation_results := ut3.ut_expectation_processor.get_failed_expectations(); + l_result ut3.ut_varchar2_list := ut3.ut_varchar2_list(); + begin + for i in 1..l_expectations_result.count loop + l_result := l_result multiset union l_expectations_result(i).get_result_lines(); + end loop; + return l_result; + end; + + function get_failed_expectations(a_pos in number) return varchar2 is + l_result varchar2(32767) := ut3.ut_expectation_processor.get_failed_expectations()(a_pos).message; + begin + return l_result; + end; + + function failed_expectations_data return anydata is + begin + return anydata.convertCollection(ut3.ut_expectation_processor.get_failed_expectations()); + end; + + function get_failed_expectations_n return number is + l_num_failed number; + l_results ut3.ut_expectation_results := ut3.ut_expectation_processor.get_failed_expectations(); + begin + l_num_failed := l_results.count; + return l_num_failed; + end; + + procedure clear_expectations is + begin + ut3.ut_expectation_processor.clear_expectations(); + end; + + function table_to_clob(a_results in ut3.ut_varchar2_list) return clob is + begin + return ut3.ut_utils.table_to_clob(a_results); + end; + + function get_warnings return ut3.ut_varchar2_rows is + begin + return ut3.ut_expectation_processor.get_warnings(); + end; + +end; +/ diff --git a/test/ut3_tester_helper/main_helper.pks b/test/ut3_tester_helper/main_helper.pks new file mode 100644 index 000000000..6c7f34bc0 --- /dev/null +++ b/test/ut3_tester_helper/main_helper.pks @@ -0,0 +1,27 @@ +create or replace package main_helper is + + gc_success number := ut3.ut_utils.gc_success; + gc_failure number := ut3.ut_utils.gc_failure; + + procedure execute_autonomous(a_sql varchar2); + + function run_test(a_path varchar2) return clob; + + function get_value(a_variable varchar2) return integer; + + function get_dbms_output_as_clob return clob; + + function get_failed_expectations return ut3.ut_varchar2_list; + + function get_failed_expectations(a_pos in number) return varchar2; + + function get_failed_expectations_n return number; + + procedure clear_expectations; + + function table_to_clob(a_results in ut3.ut_varchar2_list) return clob; + + function get_warnings return ut3.ut_varchar2_rows; + +end; +/ diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb new file mode 100644 index 000000000..0ab574e9d --- /dev/null +++ b/test/ut3_tester_helper/run_helper.pkb @@ -0,0 +1,91 @@ +create or replace package body run_helper is + + procedure setup_cache_objects is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package ut3$user#.dummy_test_package as + --%suite(dummy_test_suite) + --%rollback(manual) + + --%test(dummy_test) + --%beforetest(some_procedure) + procedure some_dummy_test_procedure; + end;]'; + execute immediate q'[create or replace procedure ut3$user#.dummy_test_procedure as + --%some_annotation(some_text) + --%rollback(manual) + begin + null; + end;]'; + execute immediate q'[create or replace procedure ut3_tester_helper.dummy_test_procedure as + --%some_annotation(some_text) + --%rollback(manual) + begin + null; + end;]'; + + execute immediate q'[grant execute on ut3_tester_helper.dummy_test_procedure to public]'; + end; + + + procedure setup_cache is + pragma autonomous_transaction; + begin + setup_cache_objects(); + ut3.ut_annotation_manager.rebuild_annotation_cache('UT3$USER#','PACKAGE'); + ut3.ut_annotation_manager.rebuild_annotation_cache('UT3$USER#','PROCEDURE'); + ut3.ut_annotation_manager.rebuild_annotation_cache('UT3_TESTER_HELPER','PROCEDURE'); + end; + + procedure cleanup_cache is + pragma autonomous_transaction; + begin + delete from ut3.ut_annotation_cache_info + where object_type = 'PROCEDURE' and object_owner in ('UT3$USER#','UT3_TESTER_HELPER') + or object_type = 'PACKAGE' and object_owner = user and object_name = 'DUMMY_TEST_PACKAGE'; + execute immediate q'[drop package ut3$user#.dummy_test_package]'; + execute immediate q'[drop procedure ut3$user#.dummy_test_procedure]'; + execute immediate q'[drop procedure ut3_tester_helper.dummy_test_procedure]'; + end; + + procedure db_link_setup is + l_service_name varchar2(100); + begin + select global_name into l_service_name from global_name; + execute immediate + 'create public database link db_loopback connect to ut3$user# identified by ut3 + using ''(DESCRIPTION= + (ADDRESS=(PROTOCOL=TCP) + (HOST='||sys_context('userenv','SERVER_HOST')||') + (PORT=1521) + ) + (CONNECT_DATA=(SERVICE_NAME='||l_service_name||')))'''; + execute immediate q'[ + create or replace package ut3$user#.test_db_link is + --%suite + + --%test + procedure runs_with_db_link; + end;]'; + + execute immediate q'[ + create or replace package body ut3$user#.test_db_link is + procedure runs_with_db_link is + a_value integer; + begin + select 1 into a_value + from dual@db_loopback; + ut3.ut.expect(a_value).to_be_null(); + end; + end;]'; + + end; + + procedure db_link_cleanup is + begin + begin execute immediate 'drop public database link db_loopback'; exception when others then null; end; + begin execute immediate 'drop package ut3$user#.test_db_link'; exception when others then null; end; + end; + +end; +/ diff --git a/test/ut3_tester_helper/run_helper.pks b/test/ut3_tester_helper/run_helper.pks new file mode 100644 index 000000000..fefd3b546 --- /dev/null +++ b/test/ut3_tester_helper/run_helper.pks @@ -0,0 +1,9 @@ +create or replace package run_helper is + + procedure setup_cache_objects; + procedure setup_cache; + procedure cleanup_cache; + procedure db_link_setup; + procedure db_link_cleanup; +end; +/ diff --git a/test/helpers/test_dummy_object.tps b/test/ut3_tester_helper/test_dummy_object.tps similarity index 100% rename from test/helpers/test_dummy_object.tps rename to test/ut3_tester_helper/test_dummy_object.tps diff --git a/test/api/test_ut_runner.pkb b/test/ut3_user/api/test_ut_runner.pkb similarity index 75% rename from test/api/test_ut_runner.pkb rename to test/ut3_user/api/test_ut_runner.pkb index 79c78d911..4d59c78e2 100644 --- a/test/api/test_ut_runner.pkb +++ b/test/ut3_user/api/test_ut_runner.pkb @@ -1,48 +1,18 @@ create or replace package body test_ut_runner is procedure setup_cache_objects is - pragma autonomous_transaction; begin - execute immediate q'[create or replace package dummy_test_package as - --%suite(dummy_test_suite) - --%rollback(manual) - - --%test(dummy_test) - --%beforetest(some_procedure) - procedure some_dummy_test_procedure; - end;]'; - execute immediate q'[create or replace procedure dummy_test_procedure as - --%some_annotation(some_text) - --%rollback(manual) - begin - null; - end;]'; - execute immediate q'[create or replace procedure ut3.dummy_test_procedure as - --%some_annotation(some_text) - --%rollback(manual) - begin - null; - end;]'; + ut3_tester_helper.run_helper.setup_cache_objects(); end; procedure setup_cache is - pragma autonomous_transaction; begin - setup_cache_objects(); - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE'); - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PROCEDURE'); - ut3.ut_annotation_manager.rebuild_annotation_cache('UT3','PROCEDURE'); + ut3_tester_helper.run_helper.setup_cache(); end; procedure cleanup_cache is - pragma autonomous_transaction; begin - delete from ut3.ut_annotation_cache_info - where object_type = 'PROCEDURE' and object_owner in ('UT3',user) - or object_type = 'PACKAGE' and object_owner = user and object_name = 'DUMMY_TEST_PACKAGE'; - execute immediate q'[drop package dummy_test_package]'; - execute immediate q'[drop procedure dummy_test_procedure]'; - execute immediate q'[drop procedure ut3.dummy_test_procedure]'; + ut3_tester_helper.run_helper.cleanup_cache(); end; procedure create_test_spec @@ -171,7 +141,7 @@ end;'; bulk collect into l_results from table(ut3.ut.run('test_cache')); --Assert - l_actual := ut3.ut_utils.table_to_clob(l_results); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); l_expected := '%ut3.ut.expect(1).to_be_null;%'; ut.expect(l_actual).to_be_like(l_expected); drop_test_package(); @@ -217,29 +187,29 @@ end;'; procedure test_purge_cache_schema_type is l_actual sys_refcursor; begin - + open l_actual for select * from ut3.ut_annotation_cache_info - where object_owner = user and object_type = 'PROCEDURE'; + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PROCEDURE'; ut.expect(l_actual).not_to_be_empty(); --Act - ut3.ut_runner.purge_cache(user,'PROCEDURE'); + ut3.ut_runner.purge_cache(sys_context('USERENV', 'CURRENT_USER'),'PROCEDURE'); --Assert open l_actual for select * from ut3.ut_annotation_cache_info - where object_owner = user and object_type = 'PROCEDURE'; + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PROCEDURE'; --Cache purged for object owner/type ut.expect(l_actual).to_be_empty(); open l_actual for select * from ut3.ut_annotation_cache_info - where object_owner = user and object_type = 'PACKAGE'; + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE'; --Cache not purged for other types ut.expect(l_actual).not_to_be_empty(); open l_actual for select * from ut3.ut_annotation_cache_info - where object_owner = 'UT3' and object_type = 'PROCEDURE'; + where object_owner = 'UT3_TESTER_HELPER' and object_type = 'PROCEDURE'; --Cache not purged for other owners ut.expect(l_actual).not_to_be_empty(); @@ -249,19 +219,19 @@ end;'; l_actual integer; begin --Act - ut3.ut_annotation_manager.rebuild_annotation_cache(user,'PACKAGE'); + ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); --Assert select count(1) into l_actual from ut3.ut_annotation_cache_info i join ut3.ut_annotation_cache c on c.cache_id = i.cache_id - where object_owner = user and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE'; - --Rebuild cache for user/packages + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE'; + --Rebuild cache for sys_context('USERENV', 'CURRENT_USER')/packages ut.expect(l_actual).to_equal(4); select count(1) into l_actual from ut3.ut_annotation_cache_info i join ut3.ut_annotation_cache c on c.cache_id = i.cache_id - where object_owner = 'UT3' and object_type = 'PROCEDURE'; + where object_owner = 'UT3_TESTER_HELPER' and object_type = 'PROCEDURE'; --Did not rebuild cache for ut3/procedures ut.expect(l_actual).to_equal(0); @@ -274,12 +244,12 @@ end;'; --Arrange open l_expected for select - 'UT3_TESTER' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'DUMMY_TEST_PACKAGE' item_name, + 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'DUMMY_TEST_PACKAGE' item_name, 'dummy_test_suite' item_description, 'UT_SUITE' item_type, 2 item_line_no, 'dummy_test_package' path, 0 disabled_flag from dual union all select - 'UT3_TESTER' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'SOME_DUMMY_TEST_PROCEDURE' item_name, + 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'SOME_DUMMY_TEST_PROCEDURE' item_name, 'dummy_test' item_description, 'UT_TEST' item_type, 5 item_line_no, 'dummy_test_package.some_dummy_test_procedure' path, 0 disabled_flag from dual; @@ -316,42 +286,14 @@ end;'; procedure db_link_cleanup is begin - begin execute immediate 'drop public database link db_loopback'; exception when others then null; end; - begin execute immediate 'drop package test_db_link'; exception when others then null; end; + ut3_tester_helper.run_helper.db_link_cleanup(); end; procedure db_link_setup is l_service_name varchar2(100); - begin - select global_name into l_service_name from global_name; - execute immediate - 'create public database link db_loopback connect to ut3_tester identified by ut3 - using ''(DESCRIPTION= - (ADDRESS=(PROTOCOL=TCP) - (HOST='||sys_context('userenv','SERVER_HOST')||') - (PORT=1521) - ) - (CONNECT_DATA=(SERVICE_NAME='||l_service_name||')))'''; - execute immediate q'[ - create or replace package test_db_link is - --%suite - - --%test - procedure runs_with_db_link; - end;]'; - - execute immediate q'[ - create or replace package body test_db_link is - procedure runs_with_db_link is - a_value integer; - begin - select 1 into a_value - from dual@db_loopback; - ut3.ut.expect(a_value).to_be_null(); - end; - end;]'; - - end; + begin + ut3_tester_helper.run_helper.db_link_setup(); + end; procedure raises_20213_on_fail_link is l_reporter ut3.ut_documentation_reporter := ut3.ut_documentation_reporter(); @@ -448,7 +390,7 @@ end;'; bulk collect into l_results from table(ut3.ut.run(ut3.ut_varchar2_list('test_csl_names1','test_csl_names2'))); - l_actual := ut3.ut_utils.table_to_clob(l_results); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like('%Finished in % seconds %4 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'); end; @@ -461,7 +403,7 @@ end;'; bulk collect into l_results from table(ut3.ut.run('test_csl_names1')); - l_actual := ut3.ut_utils.table_to_clob(l_results); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like('%Finished in % seconds %2 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'); end; @@ -474,7 +416,7 @@ end;'; bulk collect into l_results from table(ut3.ut.run('test_csl_names1,test_csl_names2')); - l_actual := ut3.ut_utils.table_to_clob(l_results); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like('%Finished in % seconds %4 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'); end; @@ -487,7 +429,7 @@ end;'; bulk collect into l_results from table(ut3.ut.run('test_csl_names1.one_is_one,test_csl_names2.one_is_one')); - l_actual := ut3.ut_utils.table_to_clob(l_results); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like('%Finished in % seconds %2 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'); end; @@ -500,7 +442,7 @@ end;'; bulk collect into l_results from table(ut3.ut.run('test_csl_names1.one_is_one, test_csl_names2.one_is_one')); - l_actual := ut3.ut_utils.table_to_clob(l_results); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like('%Finished in % seconds %2 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'); end; @@ -520,7 +462,7 @@ end;'; ) ); - l_actual := ut3.ut_utils.table_to_clob(l_results); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like('%Finished in % seconds %2 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'); end; @@ -533,7 +475,7 @@ end;'; bulk collect into l_results from table(ut3.ut.run(ut3.ut_varchar2_list('test_csl_names1.one_is_one,test_csl_names2.one_is_one'))); - l_actual := ut3.ut_utils.table_to_clob(l_results); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like('%Finished in % seconds %2 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'); end; @@ -542,19 +484,19 @@ end;'; begin ut.expect( ut3.ut_runner.is_test( - a_owner => 'UT3_TESTER', + a_owner => 'UT3$USER#', a_package_name => 'DUMMY_TEST_PACKAGE', a_procedure_name => 'SOME_DUMMY_TEST_PROCEDURE' ) ).to_be_true(); - ut.expect( ut3.ut_runner.is_test( 'ut3_tester','dummy_test_package','some_dummy_test_procedure' ) ).to_be_true(); + ut.expect( ut3.ut_runner.is_test( 'ut3$user#','dummy_test_package','some_dummy_test_procedure' ) ).to_be_true(); end; procedure is_test_false is begin - ut.expect( ut3.ut_runner.is_test( 'UT3_TESTER','DUMMY_TEST_PACKAGE', 'BAD' ) ).to_be_false(); - ut.expect( ut3.ut_runner.is_test( 'UT3_TESTER','DUMMY_TEST_PACKAGE', null ) ).to_be_false(); - ut.expect( ut3.ut_runner.is_test( 'UT3_TESTER',null,'some_dummy_test_procedure' ) ).to_be_false(); + ut.expect( ut3.ut_runner.is_test( 'UT3$USER#','DUMMY_TEST_PACKAGE', 'BAD' ) ).to_be_false(); + ut.expect( ut3.ut_runner.is_test( 'UT3$USER#','DUMMY_TEST_PACKAGE', null ) ).to_be_false(); + ut.expect( ut3.ut_runner.is_test( 'UT3$USER#',null,'some_dummy_test_procedure' ) ).to_be_false(); ut.expect( ut3.ut_runner.is_test( null,'DUMMY_TEST_PACKAGE','some_dummy_test_procedure' ) ).to_be_false(); end; @@ -562,26 +504,26 @@ end;'; begin ut.expect( ut3.ut_runner.is_suite( - a_owner => 'UT3_TESTER', + a_owner => 'UT3$USER#', a_package_name => 'DUMMY_TEST_PACKAGE' ) ).to_be_true(); - ut.expect( ut3.ut_runner.is_suite( 'ut3_tester','dummy_test_package' ) ).to_be_true(); + ut.expect( ut3.ut_runner.is_suite( 'ut3$user#','dummy_test_package' ) ).to_be_true(); end; procedure is_suite_false is begin - ut.expect( ut3.ut_runner.is_suite( 'UT3_TESTER','BAD' ) ).to_be_false(); - ut.expect( ut3.ut_runner.is_suite( 'UT3_TESTER', null ) ).to_be_false(); + ut.expect( ut3.ut_runner.is_suite( 'UT3$USER#','BAD' ) ).to_be_false(); + ut.expect( ut3.ut_runner.is_suite( 'UT3$USER#', null ) ).to_be_false(); ut.expect( ut3.ut_runner.is_suite( null,'DUMMY_TEST_PACKAGE' ) ).to_be_false(); end; procedure has_suites_true is begin - ut.expect( ut3.ut_runner.has_suites( a_owner => 'UT3_TESTER' ) ).to_be_true(); + ut.expect( ut3.ut_runner.has_suites( a_owner => 'UT3$USER#' ) ).to_be_true(); - ut.expect( ut3.ut_runner.has_suites( 'ut3_tester' ) ).to_be_true(); + ut.expect( ut3.ut_runner.has_suites( 'ut3$user#' ) ).to_be_true(); end; procedure has_suites_false is diff --git a/test/api/test_ut_runner.pks b/test/ut3_user/api/test_ut_runner.pks similarity index 100% rename from test/api/test_ut_runner.pks rename to test/ut3_user/api/test_ut_runner.pks diff --git a/test/core/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb similarity index 84% rename from test/core/expectations/test_expectations_cursor.pkb rename to test/ut3_user/expectations/test_expectations_cursor.pkb index f0d9ae36e..aa3decb11 100644 --- a/test/core/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -13,7 +13,7 @@ create or replace package body test_expectations_cursor is procedure cleanup_expectations is begin - expectations.cleanup_expectations( ); + ut3_tester_helper.main_helper.clear_expectations( ); end; procedure setup_temp_table_test @@ -50,7 +50,7 @@ create or replace package body test_expectations_cursor is --Act - execute the expectation on cursor opened on GTT ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); --Cleanup rollback; end; @@ -78,7 +78,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); ut3.ut.reset_nls; end; @@ -93,7 +93,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure success_on_both_null @@ -104,7 +104,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure success_to_be_null @@ -114,7 +114,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_null(); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure success_not_to_be_not_null @@ -124,7 +124,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).not_to_be_not_null(); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure success_not_to_be_null @@ -136,7 +136,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_not_null(); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure success_to_be_not_null @@ -148,7 +148,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_not_null(); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure success_is_empty @@ -160,7 +160,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_empty(); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure success_is_not_empty @@ -172,7 +172,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).not_to_be_empty(); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure failure_is_null @@ -184,7 +184,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_null(); --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; procedure failure_is_not_null @@ -194,7 +194,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).not_to_be_null(); --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; procedure failure_is_empty @@ -206,7 +206,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_empty(); --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; procedure failure_is_not_empty @@ -218,7 +218,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).not_to_be_empty(); --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; procedure fail_null_vs_empty @@ -231,7 +231,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).not_to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure fail_on_difference @@ -245,7 +245,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; procedure fail_on_expected_missing @@ -259,7 +259,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; procedure fail_on_actual_missing @@ -273,7 +273,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; procedure fail_on_different_column_name @@ -287,7 +287,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; @@ -302,7 +302,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; procedure pass_on_different_column_order @@ -316,7 +316,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ).unordered_columns; --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure pass_on_diff_column_ord_uc @@ -330,7 +330,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ).uc; --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure fail_on_multi_diff_col_order @@ -351,7 +351,7 @@ create or replace package body test_expectations_cursor is %Rows: [ 1 differences ] %Row No. 1 - Actual: 4030 %Row No. 1 - Expected: 34]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -374,7 +374,7 @@ create or replace package body test_expectations_cursor is %Rows: [ 1 differences ] %Row No. 1 - Actual: 4030 %Row No. 1 - Expected: 34]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -390,7 +390,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; procedure include_time_in_date_with_nls @@ -407,7 +407,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); ut3.ut.reset_nls; end; @@ -422,7 +422,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure exclude_columns_as_list @@ -436,7 +436,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>ut3.ut_varchar2_list('A_COLUMN','Some_Col')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure exclude_columns_as_csv @@ -450,7 +450,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>'A_COLUMN,Some_Col'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure exclude_columns_as_mixed_list is @@ -463,7 +463,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>ut3.ut_varchar2_list('A_COLUMN','/ROW/Some_Col')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure exclude_columns_as_mix_csv_lst is @@ -476,7 +476,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>'A_COLUMN,/ROW/Some_Col'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure exclude_columns_xpath_invalid @@ -501,7 +501,7 @@ create or replace package body test_expectations_cursor is %Row No. 2 - Expected: c %Row No. 3 - Actual: d %Row No. 3 - Expected: c]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -517,7 +517,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>'/ROW/A_COLUMN|/ROW/Some_Col'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure exclude_ignores_invalid_column @@ -531,7 +531,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>ut3.ut_varchar2_list('A_COLUMN','non_existing_column')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure include_columns_as_list @@ -545,7 +545,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure include_columns_as_csv @@ -559,7 +559,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).include('RN,//A_Column, SOME_COL'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure include_columns_xpath @@ -573,7 +573,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).include('/ROW/RN|//A_Column|//SOME_COL'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure include_ignores_invalid_column @@ -587,7 +587,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list(' RN ',' non_existing_column ')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure include_exclude_col_csv_xpath @@ -601,7 +601,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).exclude('Some_Col').include('/ROW/RN|//Some_Col'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure include_exclude_columns_list @@ -615,7 +615,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).exclude(ut3.ut_varchar2_list('A_COLUMN')).include(ut3.ut_varchar2_list('RN','A_Column','A_COLUMN')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure data_diff_on_rows_mismatch @@ -637,7 +637,7 @@ Rows: [ 2 differences ] Row No. 2 - Actual: 6 Row No. 2 - Expected: 2 Row No. 3 - Missing: 3]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -659,7 +659,7 @@ Columns: Column [position: 2, data-type: NUMBER] is not expected in results. Rows: [ 1 differences ] All rows are different as the columns are not matching.]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -682,7 +682,7 @@ Columns: Column data-type is invalid. Expected: NUMBER, actual: VARCHAR2. Rows: [ all different ] All rows are different as the columns position is not matching.]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -704,7 +704,7 @@ Diff: Columns:% Column [data-type: NUMBER] is missing. Expected column position: 2.% Column [position: 2, data-type: NUMBER] is not expected in results.%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -729,7 +729,7 @@ Columns: Column is misplaced. Expected position: 4, actual position: 3. Rows: [ all different ] All rows are different as the columns position is not matching.]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -746,7 +746,7 @@ Rows: [ all different ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).unordered_columns; - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; --%test(Reports only mismatched columns on column data mismatch) @@ -769,7 +769,7 @@ Rows: [ 2 differences ] Row No. 1 - Expected: 1 Row No. 2 - Actual: -2 Row No. 2 - Expected: 2]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -806,7 +806,7 @@ Rows: [ 60 differences, showing first 20 ] Row No. 38 - Expected: 38 Row No. 40 - Actual: -40 Row No. 40 - Expected: 40]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -843,7 +843,7 @@ Rows: [ 4 differences ] Row No. 3 - Actual: JESSICAJONES42345 Row No. 3 - Expected: 3TONYSTARK100000 Row No. 4 - Extra: MLUKESKYWALKER21000]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -879,7 +879,7 @@ Rows: [ 4 differences ] Row No. 3 - Actual: JESSICAJONES42345 Row No. 3 - Expected: 3TONYSTARK100000 Row No. 4 - Extra: MLUKESKYWALKER21000]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -937,7 +937,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_expected).to_equal(l_actual); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure closes_cursor_after_use @@ -1014,7 +1014,7 @@ Rows: [ 4 differences ] ut3.ut.expect(l_actual).to_equal(l_expected); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; function get_cursor return sys_refcursor is @@ -1029,8 +1029,8 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(get_cursor()).to_equal(get_cursor(), a_exclude => 'A_COLUMN,Some_Col'); --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); end; procedure deprec_to_equal_excl_list is @@ -1038,8 +1038,8 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(get_cursor()).to_equal(get_cursor(), a_exclude => ut3.ut_varchar2_list('A_COLUMN','Some_Col')); --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); end; procedure deprec_not_to_equal_excl_varch is @@ -1047,8 +1047,8 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(get_cursor()).not_to_equal(get_cursor(), a_exclude => 'A_COLUMN,Some_Col'); --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); end; procedure deprec_not_to_equal_excl_list is @@ -1056,8 +1056,8 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(get_cursor()).not_to_equal(get_cursor(), a_exclude => ut3.ut_varchar2_list('A_COLUMN','Some_Col')); --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); end; procedure deprec_equal_excl_varch is @@ -1065,8 +1065,8 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(get_cursor()).to_(ut3.equal(get_cursor(), a_exclude => 'A_COLUMN,Some_Col')); --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); end; procedure deprec_equal_excl_list is @@ -1074,8 +1074,8 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(get_cursor()).to_(ut3.equal(get_cursor(), a_exclude => ut3.ut_varchar2_list('A_COLUMN','Some_Col'))); --Assert - ut.expect(cardinality(ut3.ut_expectation_processor.get_warnings())).to_equal(1); - ut.expect(ut3.ut_expectation_processor.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); end; procedure col_diff_on_col_name_implicit is @@ -1099,7 +1099,7 @@ Rows: [ 4 differences ] %Column <2> [position: 2, data-type: CHAR] is not expected in results. %Rows: [ all different ] %All rows are different as the columns position is not matching.]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1116,7 +1116,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_unorderd_compr_success is @@ -1129,7 +1129,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).unordered; --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_unord_compr_success_uc is @@ -1142,7 +1142,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).unordered().uc(); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_unordered_compare_fail is @@ -1168,7 +1168,7 @@ Rows: [ 4 differences ] %Rows: [ 2 differences ]% %Extra: test-666% %Missing: test-667%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1184,7 +1184,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('OBJECT_ID').uc(); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_joinby_compare is @@ -1198,7 +1198,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('OBJECT_ID'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_joinby_col_not_ord @@ -1221,7 +1221,7 @@ Rows: [ 4 differences ] %PK 1 - Expected: 3 %PK 1 - Actual: 40 %PK 1 - Expected: 4]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1237,7 +1237,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by(ut3.ut_varchar2_list('OBJECT_ID,OBJECT_NAME')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_joinby_compare_nokey is @@ -1258,7 +1258,7 @@ Diff:% %Unable to join sets:% %Join key OWNER does not exists in expected% %Join key OWNER does not exists in actual%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1283,7 +1283,7 @@ Diff:% %Join key USER_ID does not exists in expected% %Join key OWNER does not exists in actual% %Join key USER_ID does not exists in actual%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1306,7 +1306,7 @@ Diff:% %Unable to join sets:% %Join key SOME_COL does not exists in expected% %Join key SOME_COL does not exists in actual%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1329,7 +1329,7 @@ Diff:% %Unable to join sets:% %Join key RN does not exists in expected% %Join key RN does not exists in actual%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1351,7 +1351,7 @@ Diff:% Diff:% %Unable to join sets:% %Join key RNI does not exists in expected%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1373,7 +1373,7 @@ Diff:% Diff:% %Unable to join sets:% %Join key RNI does not exists in actual%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1388,7 +1388,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('OBJECT_ID'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_unorder_compare_1000 is @@ -1401,7 +1401,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).unordered; --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_joinby_compare_fail is @@ -1425,7 +1425,7 @@ Diff:% %Rows: [ 1 differences ]% %PK TEST - Actual:%-610% %PK TEST - Expected:%-600%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1451,7 +1451,7 @@ Diff:% %Rows: [ 2 differences ]% %PK TEST-610 - Extra: TEST-610% %PK TEST-600 - Missing: TEST-600%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1477,7 +1477,7 @@ Diff:% %Rows: [ 1 differences ]% %PK TESTY - Actual:%-610% %PK TESTY - Expected:%-600%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1493,7 +1493,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')).unordered; --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure joinby_incl_cols_as_list @@ -1507,7 +1507,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')).join_by('RN'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure joinby_excl_cols_as_list @@ -1521,7 +1521,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).exclude(ut3.ut_varchar2_list('//Some_Col','A_COLUMN')).join_by('RN'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure unord_excl_cols_as_list @@ -1535,7 +1535,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).exclude(ut3.ut_varchar2_list('A_COLUMN|//Some_Col')).unordered; --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure excl_dif_cols_as_list @@ -1549,7 +1549,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).exclude(ut3.ut_varchar2_list('A_COLUMN')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure inlc_dif_cols_as_list @@ -1563,7 +1563,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list('RN')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure inlc_exc_dif_cols_as_list @@ -1577,7 +1577,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list('RN')).exclude(ut3.ut_varchar2_list('A_COLUMN')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure compare_obj_typ_col_un is @@ -1585,16 +1585,16 @@ Diff:% l_expected sys_refcursor; begin --Arrange - open l_actual for select test_dummy_object( rownum, 'Something '||rownum, rownum) as colval + open l_actual for select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) as colval from dual connect by level <=2 order by rownum asc; - open l_expected for select test_dummy_object( rownum, 'Something '||rownum, rownum) as colval + open l_expected for select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) as colval from dual connect by level <=2 order by rownum desc; --Act ut3.ut.expect(l_actual).to_equal(l_expected).unordered; --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure compare_obj_typ_col_jb is @@ -1602,16 +1602,16 @@ Diff:% l_expected sys_refcursor; begin --Arrange - open l_actual for select test_dummy_object( rownum, 'Something '||rownum, rownum) as colval + open l_actual for select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) as colval from dual connect by level <=2 order by rownum asc; - open l_expected for select test_dummy_object( rownum, 'Something '||rownum, rownum) as colval + open l_expected for select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) as colval from dual connect by level <=2 order by rownum desc; --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('COLVAL/ID'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure comp_obj_typ_col_un_fail is @@ -1621,10 +1621,10 @@ Diff:% l_actual_message varchar2(32767); begin --Arrange - open l_actual for select test_dummy_object( rownum, 'Something '||rownum, rownum) as colval + open l_actual for select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) as colval from dual connect by level <=2 order by rownum asc; - open l_expected for select test_dummy_object( rownum, 'Somethings '||rownum, rownum) as colval + open l_expected for select ut3_tester_helper.test_dummy_object( rownum, 'Somethings '||rownum, rownum) as colval from dual connect by level <=3 order by rownum desc; --Act @@ -1637,7 +1637,7 @@ Rows: [ 5 differences% %Missing: 3Somethings 33% %Missing: 2Somethings 22% %Missing: 1Somethings 11%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1647,16 +1647,16 @@ Rows: [ 5 differences% l_expected sys_refcursor; begin --Arrange - open l_actual for select test_dummy_object( rownum, 'Something '||rownum, rownum) as colval + open l_actual for select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) as colval from dual connect by level <=2 order by rownum asc; - open l_expected for select test_dummy_object( rownum, 'Somethings '||rownum, rownum) as colval + open l_expected for select ut3_tester_helper.test_dummy_object( rownum, 'Somethings '||rownum, rownum) as colval from dual connect by level <=2 order by rownum desc; --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('COLVAL/ID'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_not_null(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; procedure comp_obj_typ_col_jb_multi is @@ -1664,16 +1664,16 @@ Rows: [ 5 differences% l_expected sys_refcursor; begin --Arrange - open l_actual for select rownum as rn,test_dummy_object( rownum, 'Something '||rownum, rownum) as colval + open l_actual for select rownum as rn,ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) as colval from dual connect by level <=2 order by rownum asc; - open l_expected for select rownum as rn,test_dummy_object( rownum, 'Something '||rownum, rownum) as colval + open l_expected for select rownum as rn,ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) as colval from dual connect by level <=2 order by rownum desc; --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by(ut3.ut_varchar2_list('RN,COLVAL/ID')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure comp_obj_typ_col_jb_nokey is @@ -1683,10 +1683,10 @@ Rows: [ 5 differences% l_actual_message varchar2(32767); begin --Arrange - open l_actual for select test_dummy_object( rownum, 'Something '||rownum, rownum) as colval + open l_actual for select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) as colval from dual connect by level <=2 order by rownum asc; - open l_expected for select test_dummy_object( rownum, 'Something '||rownum, rownum) as colval + open l_expected for select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) as colval from dual connect by level <=2 order by rownum desc; --Act @@ -1697,7 +1697,7 @@ Diff:% %Unable to join sets:% %Join key COLVAL/IDS does not exists in expected% %Join key COLVAL/IDS does not exists in actual%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1729,7 +1729,7 @@ Diff:% ut3.ut.expect(l_actual).to_equal(l_expected).join_by('KEY'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure compare_nest_tab_col_jb_fail is @@ -1764,7 +1764,7 @@ Diff:% %PK % - Expected: %% %PK % - Actual: %% %PK % - Expected: %%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1796,7 +1796,7 @@ Diff:% ut3.ut.expect(l_actual).to_equal(l_expected).join_by(ut3.ut_varchar2_list('KEY,VALUE')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure compare_nest_tab_cols_jb_fail is @@ -1831,7 +1831,7 @@ Diff:% %PK %% - Extra% %PK %% - Missing% %PK %% - Missing%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -1870,7 +1870,7 @@ Diff:% %PK %%%%%%%%%%%%%Extra%%% %PK %%%%%%%%%%%%%Missing%%% %PK %%%%%%%%%%%%%Missing%%%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); @@ -1902,7 +1902,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; @@ -1940,7 +1940,7 @@ Diff:% %Extra: 21Apples 12Apples 2 %Missing: 11Peaches 12Peaches 2 %Missing: 21Peaches 12Peaches 2%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); @@ -1974,7 +1974,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('NESTED_TABLE'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; @@ -2006,7 +2006,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('NESTED_TABLE/OBJECT_OWNER'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; @@ -2038,7 +2038,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('NESTED_TABLE/ANNOTATIONS'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; @@ -2081,10 +2081,10 @@ Diff:% %Rows: [ 1 differences ] %PK TEST - Actual: TESTTESTTEST%1testtesttest2testtesttest% %PK TEST - Expected: TESTTESTTEST%11testtesttest2testtesttest%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); - --ut.expect(expectations.failed_expectations_data()).not_to_be_empty(); + --ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); end; procedure compare_rec_coll_as_join is @@ -2122,7 +2122,7 @@ Diff:% %Join key NESTED_TABLE/ANNOTATIONS/TEXT does not exists in expected% %Join key NESTED_TABLE/ANNOTATIONS/TEXT does not exists in actual% %Please make sure that your join clause is not refferring to collection element%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); @@ -2154,7 +2154,7 @@ Diff:% %Diff: %Rows: [ 1 differences ] %Missing: Table%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); @@ -2171,9 +2171,9 @@ Diff:% and rownum < 20; --Act - ut3.ut.expect(l_actual).to_( ut3.contain(l_expected) ); + ut3.ut.expect(l_actual).to_contain(l_expected); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_to_contain_uc is @@ -2187,9 +2187,9 @@ Diff:% and rownum < 20; --Act - ut3.ut.expect(l_actual).to_( ut3.contain(l_expected).uc() ); + ut3.ut.expect(l_actual).to_contain(l_expected).uc(); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_to_contain_unordered is @@ -2204,9 +2204,9 @@ Diff:% select owner, object_name,object_type from all_objects where owner = user and rownum < 20; --Act - ut3.ut.expect(l_actual).to_( ut3.contain(l_expected).unordered() ); + ut3.ut.expect(l_actual).to_contain(l_expected).unordered(); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_to_contain_fail is @@ -2232,7 +2232,7 @@ Diff:% %Missing: %%%% %Missing: %%%% %Missing: %%%%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -2248,7 +2248,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).join_by('USERNAME'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_contain_joinby_fail is @@ -2275,7 +2275,7 @@ Diff:% %Rows: [ 1 differences ] %PK TEST - Actual: -600 %PK TEST - Expected: -601%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); @@ -2292,7 +2292,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure to_cont_join_incl_cols_as_lst @@ -2306,7 +2306,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')).join_by('RN'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure contain_join_excl_cols_as_lst @@ -2320,7 +2320,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).exclude(ut3.ut_varchar2_list('//Some_Col','A_COLUMN')).join_by('RN'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure contain_excl_cols_as_list @@ -2334,7 +2334,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).exclude(ut3.ut_varchar2_list('A_COLUMN|//Some_Col')); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_not_to_contain @@ -2351,7 +2351,7 @@ Diff:% --Act ut3.ut.expect(l_actual).not_to_contain(l_expected); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure cursor_not_to_contain_fail is @@ -2379,7 +2379,7 @@ Diff:% %CHARNUMBER% %Data:% %TEST-600%]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; @@ -2395,7 +2395,7 @@ Diff:% --Act ut3.ut.expect(l_actual).not_to_contain(l_expected).join_by('USER_ID'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure not_cont_join_incl_cols_as_lst is @@ -2408,7 +2408,7 @@ Diff:% --Act ut3.ut.expect(l_actual).not_to_contain(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')).join_by('RN'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure not_cont_join_excl_cols_as_lst is @@ -2421,7 +2421,7 @@ Diff:% --Act ut3.ut.expect(l_actual).not_to_contain(l_expected).exclude(ut3.ut_varchar2_list('//Some_Col','A_COLUMN')).join_by('RN'); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure to_contain_duplicates is @@ -2437,7 +2437,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); end; procedure to_contain_duplicates_fail is @@ -2460,10 +2460,70 @@ Diff:% %Missing: % %Missing: % %Missing: %]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); end; + procedure udt_messg_format_eq is + l_actual sys_refcursor; + l_expected sys_refcursor; + l_expected_tab ut3.ut_key_value_pairs := ut3.ut_key_value_pairs(); + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + select ut3.ut_key_value_pair(rownum,'Something '||rownum) + bulk collect into l_expected_tab + from dual connect by level <=2; + + --Arrange + open l_actual for select object_name, owner from all_objects where rownum < 3; + open l_expected for select value(x) as udt from table(l_expected_tab) x; + + --Act + ut3.ut.expect(l_actual).to_contain(l_expected); + --Assert + l_expected_message := q'[%Actual: refcursor [ count = 2 ] was expected to contain: refcursor [ count = 2 ] +%Diff: +%Columns: +%Column [data-type: UT_KEY_VALUE_PAIR] is missing. Expected column position: 1. +%Column [position: 1, data-type: VARCHAR2] is not expected in results. +%Column [position: 2, data-type: VARCHAR2] is not expected in results. +%Rows: [ 2 differences ] +%Missing: 1Something 1 +%Missing: 2Something 2%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure udt_messg_format_empt is + l_actual sys_refcursor; + l_actual_tab ut3.ut_key_value_pairs := ut3.ut_key_value_pairs(); + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + select ut3.ut_key_value_pair(rownum,'Something '||rownum) + bulk collect into l_actual_tab + from dual connect by level <=2; + + --Arrange + open l_actual for select value(x) as udt from table(l_actual_tab) x; + + --Act + ut3.ut.expect(l_actual).to_be_empty(); + --Assert + l_expected_message := q'[%Actual: (refcursor [ count = 2 ]) +%Data-types: +%UT_KEY_VALUE_PAIR +%Data: +%1Something 12Something 2 +%was expected to be empty%]'; + + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + end; / diff --git a/test/core/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks similarity index 98% rename from test/core/expectations/test_expectations_cursor.pks rename to test/ut3_user/expectations/test_expectations_cursor.pks index c0195393e..e8f492674 100644 --- a/test/core/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -390,6 +390,11 @@ create or replace package test_expectations_cursor is --%test(Cursor to contain duplicates fail) procedure to_contain_duplicates_fail; - + + --%test(Display a message with a uer defined type with only type name not structure on equal) + procedure udt_messg_format_eq; + + --%test(Display a message with a uer defined type with only type name not structure on empty) + procedure udt_messg_format_empt; end; / diff --git a/test/ut3_user/expectations/test_matchers.pkb b/test/ut3_user/expectations/test_matchers.pkb index 114e34267..c84a623eb 100644 --- a/test/ut3_user/expectations/test_matchers.pkb +++ b/test/ut3_user/expectations/test_matchers.pkb @@ -2,7 +2,7 @@ create or replace package body test_matchers is procedure cleanup_expectations is begin - ut3_tester_helper.core.clear_expectations( ); + ut3_tester_helper.main_helper.clear_expectations( ); end; procedure exec_matcher(a_type varchar2, a_actual_value varchar2, a_expected_value varchar2, a_matcher varchar2, a_result integer, a_prefix varchar2 := null) is @@ -16,10 +16,10 @@ create or replace package body test_matchers is ut3.ut.expect( l_actual ).'||a_prefix||'to_'||a_matcher||'( l_expected ); end;'; execute immediate l_statement; - if a_result = ut3_tester_helper.core.gc_success then - ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_equal(0); + if a_result = ut3_tester_helper.main_helper.gc_success then + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_equal(0); else - ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_be_greater_than(0); end if; cleanup_expectations(); end exec_matcher; @@ -36,10 +36,10 @@ create or replace package body test_matchers is ut3.ut.expect(l_actual_value).to_be_between(l_lower, l_higher); end;'; execute immediate l_statement; - if a_result = ut3_tester_helper.core.gc_success then - ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_equal(0); + if a_result = ut3_tester_helper.main_helper.gc_success then + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_equal(0); else - ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_be_greater_than(0); end if; cleanup_expectations(); end exec_be_between; @@ -56,10 +56,10 @@ create or replace package body test_matchers is ut3.ut.expect(l_actual_value).'||a_not_prefix||'to_be_between(l_value1, l_value2); end;'; execute immediate l_statement; - if a_result = ut3_tester_helper.core.gc_success then - ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_equal(0); + if a_result = ut3_tester_helper.main_helper.gc_success then + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_equal(0); else - ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_be_greater_than(0); end if; cleanup_expectations(); end exec_be_between2; @@ -76,10 +76,10 @@ create or replace package body test_matchers is ut3.ut.expect( l_actual ).' || a_prefix ||q'[to_be_like(l_pattern, l_escape_char); end;]' using a_pattern, a_escape; - if a_result = ut3_tester_helper.core.gc_success then - ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_equal(0); + if a_result = ut3_tester_helper.main_helper.gc_success then + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_equal(0); else - ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_be_greater_than(0); end if; cleanup_expectations(); end; @@ -97,10 +97,10 @@ create or replace package body test_matchers is ut3.ut.expect( l_actual ).'||a_not_prefix||'to_match(l_pattern, l_modifiers); end;'; execute immediate l_statement using a_pattern, a_modifiers; - if a_result = ut3_tester_helper.core.gc_success then - ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_equal(0); + if a_result = ut3_tester_helper.main_helper.gc_success then + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_equal(0); else - ut.expect(ut3_tester_helper.core.get_failed_expectations_n()).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_be_greater_than(0); end if; cleanup_expectations(); end; @@ -109,135 +109,135 @@ create or replace package body test_matchers is begin --failure when value out of range - exec_be_between2('date', 'sysdate', 'sysdate-2', 'sysdate-1', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('number', '2.0', '1.99', '1.999', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('varchar2(1)', '''c''', '''a''', '''b''', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('timestamp', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('timestamp with time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('interval year to month', '''2-2''', '''2-0''', '''2-1''', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 00:59:59''', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('date', 'sysdate', 'sysdate-2', 'sysdate-1', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('number', '2.0', '1.99', '1.999', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('varchar2(1)', '''c''', '''a''', '''b''', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('timestamp', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('timestamp with time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('interval year to month', '''2-2''', '''2-0''', '''2-1''', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 00:59:59''', ut3_tester_helper.main_helper.gc_failure, ''); --success when value in range - exec_be_between2('date', 'sysdate', 'sysdate-1', 'sysdate+1', ut3_tester_helper.core.gc_success, ''); - exec_be_between2('number', '2.0', '1.99', '2.01', ut3_tester_helper.core.gc_success, ''); - exec_be_between2('varchar2(1)', '''b''', '''a''', '''c''', ut3_tester_helper.core.gc_success, ''); - exec_be_between2('timestamp', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_success, ''); - exec_be_between2('timestamp with local time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_success, ''); - exec_be_between2('timestamp with time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_success, ''); - exec_be_between2('interval year to month', '''2-1''', '''2-0''', '''2-2''', ut3_tester_helper.core.gc_success, ''); - exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 01:00:01''', ut3_tester_helper.core.gc_success, ''); + exec_be_between2('date', 'sysdate', 'sysdate-1', 'sysdate+1', ut3_tester_helper.main_helper.gc_success, ''); + exec_be_between2('number', '2.0', '1.99', '2.01', ut3_tester_helper.main_helper.gc_success, ''); + exec_be_between2('varchar2(1)', '''b''', '''a''', '''c''', ut3_tester_helper.main_helper.gc_success, ''); + exec_be_between2('timestamp', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.main_helper.gc_success, ''); + exec_be_between2('timestamp with local time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.main_helper.gc_success, ''); + exec_be_between2('timestamp with time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.main_helper.gc_success, ''); + exec_be_between2('interval year to month', '''2-1''', '''2-0''', '''2-2''', ut3_tester_helper.main_helper.gc_success, ''); + exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 01:00:01''', ut3_tester_helper.main_helper.gc_success, ''); --success when value not in range - exec_be_between2('date', 'sysdate', 'sysdate-2', 'sysdate-1', ut3_tester_helper.core.gc_success, 'not_'); - exec_be_between2('number', '2.0', '1.99', '1.999', ut3_tester_helper.core.gc_success, 'not_'); - exec_be_between2('varchar2(1)', '''c''', '''a''', '''b''', ut3_tester_helper.core.gc_success, 'not_'); - exec_be_between2('timestamp', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_success, 'not_'); - exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_success, 'not_'); - exec_be_between2('timestamp with time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_success, 'not_'); - exec_be_between2('interval year to month', '''2-2''', '''2-0''', '''2-1''', ut3_tester_helper.core.gc_success, 'not_'); - exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 00:59:59''', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_between2('date', 'sysdate', 'sysdate-2', 'sysdate-1', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_be_between2('number', '2.0', '1.99', '1.999', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_be_between2('varchar2(1)', '''c''', '''a''', '''b''', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_be_between2('timestamp', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_be_between2('timestamp with time zone', 'systimestamp+1', 'systimestamp-1', 'systimestamp', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_be_between2('interval year to month', '''2-2''', '''2-0''', '''2-1''', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 00:59:59''', ut3_tester_helper.main_helper.gc_success, 'not_'); --failure when value not out of range - exec_be_between2('date', 'sysdate', 'sysdate-1', 'sysdate+1', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('number', '2.0', '1.99', '2.01', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('varchar2(1)', '''b''', '''a''', '''c''', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('timestamp', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('timestamp with local time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('timestamp with time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('interval year to month', '''2-1''', '''2-0''', '''2-2''', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 01:00:01''', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('date', 'sysdate', 'sysdate-1', 'sysdate+1', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('number', '2.0', '1.99', '2.01', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('varchar2(1)', '''b''', '''a''', '''c''', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('timestamp', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('timestamp with local time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('timestamp with time zone', 'systimestamp', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('interval year to month', '''2-1''', '''2-0''', '''2-2''', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('interval day to second', '''2 01:00:00''', '''2 00:59:58''', '''2 01:00:01''', ut3_tester_helper.main_helper.gc_failure, 'not_'); --failure when value is null - exec_be_between2('date', 'null', 'sysdate-1', 'sysdate+1', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('number', 'null', '1.99', '2.01', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('varchar2(1)', 'null', '''a''', '''c''', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('timestamp', 'null', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('timestamp with local time zone', 'null', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('timestamp with time zone', 'null', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('interval year to month', 'null', '''2-0''', '''2-2''', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('interval day to second', 'null', '''2 00:59:58''', '''2 01:00:01''', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('date', 'null', 'sysdate-1', 'sysdate+1', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('number', 'null', '1.99', '2.01', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('varchar2(1)', 'null', '''a''', '''c''', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('timestamp', 'null', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('timestamp with local time zone', 'null', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('timestamp with time zone', 'null', 'systimestamp-1', 'systimestamp+1', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('interval year to month', 'null', '''2-0''', '''2-2''', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('interval day to second', 'null', '''2 00:59:58''', '''2 01:00:01''', ut3_tester_helper.main_helper.gc_failure, ''); - exec_be_between2('date', 'null', 'sysdate-2', 'sysdate-1', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('number', 'null', '1.99', '1.999', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('varchar2(1)', 'null', '''a''', '''b''', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('timestamp', 'null', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('timestamp with local time zone', 'null', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('timestamp with time zone', 'null', 'systimestamp-1', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('interval year to month', 'null', '''2-0''', '''2-1''', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('interval day to second', 'null', '''2 00:59:58''', '''2 00:59:59''', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('date', 'null', 'sysdate-2', 'sysdate-1', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('number', 'null', '1.99', '1.999', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('varchar2(1)', 'null', '''a''', '''b''', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('timestamp', 'null', 'systimestamp-1', 'systimestamp', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('timestamp with local time zone', 'null', 'systimestamp-1', 'systimestamp', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('timestamp with time zone', 'null', 'systimestamp-1', 'systimestamp', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('interval year to month', 'null', '''2-0''', '''2-1''', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('interval day to second', 'null', '''2 00:59:58''', '''2 00:59:59''', ut3_tester_helper.main_helper.gc_failure, 'not_'); --failure when lower bound is null - exec_be_between2('date', 'sysdate', 'null', 'sysdate+1', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('number', '2.0', 'null', '2.01', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('varchar2(1)', '''b''', 'null', '''c''', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('timestamp', 'systimestamp', 'null', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('timestamp with local time zone', 'systimestamp', 'null', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('timestamp with time zone', 'systimestamp', 'null', 'systimestamp+1', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('interval year to month', '''2-1''', 'null', '''2-2''', ut3_tester_helper.core.gc_failure, ''); - exec_be_between2('interval day to second', '''2 01:00:00''', 'null', '''2 01:00:01''', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('date', 'sysdate', 'null', 'sysdate+1', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('number', '2.0', 'null', '2.01', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('varchar2(1)', '''b''', 'null', '''c''', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('timestamp', 'systimestamp', 'null', 'systimestamp+1', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('timestamp with local time zone', 'systimestamp', 'null', 'systimestamp+1', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('timestamp with time zone', 'systimestamp', 'null', 'systimestamp+1', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('interval year to month', '''2-1''', 'null', '''2-2''', ut3_tester_helper.main_helper.gc_failure, ''); + exec_be_between2('interval day to second', '''2 01:00:00''', 'null', '''2 01:00:01''', ut3_tester_helper.main_helper.gc_failure, ''); - exec_be_between2('date', 'sysdate', 'null', 'sysdate-1', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('number', '2.0', 'null', '1.999', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('varchar2(1)', '''b''', 'null', '''b''', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('timestamp', 'systimestamp+1', 'null', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'null', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('timestamp with time zone', 'systimestamp+1', 'null', 'systimestamp', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('interval year to month', '''2-2''', 'null', '''2-1''', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_between2('interval day to second', '''2 01:00:00''', 'null', '''2 00:59:59''', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_between2('date', 'sysdate', 'null', 'sysdate-1', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('number', '2.0', 'null', '1.999', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('varchar2(1)', '''b''', 'null', '''b''', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('timestamp', 'systimestamp+1', 'null', 'systimestamp', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('timestamp with local time zone', 'systimestamp+1', 'null', 'systimestamp', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('timestamp with time zone', 'systimestamp+1', 'null', 'systimestamp', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('interval year to month', '''2-2''', 'null', '''2-1''', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_between2('interval day to second', '''2 01:00:00''', 'null', '''2 00:59:59''', ut3_tester_helper.main_helper.gc_failure, 'not_'); --Fails for unsupported data-type - exec_be_between2('clob', '''b''', '''a''', '''c''', ut3_tester_helper.core.gc_failure, ''); + exec_be_between2('clob', '''b''', '''a''', '''c''', ut3_tester_helper.main_helper.gc_failure, ''); end; procedure test_match is begin - exec_match('varchar2(100)', '''Stephen''', '^Ste(v|ph)en$', '', ut3_tester_helper.core.gc_success); - exec_match('varchar2(100)', '''sTEPHEN''', '^Ste(v|ph)en$', 'i', ut3_tester_helper.core.gc_success); - exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', 'Ste(v|ph)en$', '', ut3_tester_helper.core.gc_success); - exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', 'Ste(v|ph)en$', 'i', ut3_tester_helper.core.gc_success); + exec_match('varchar2(100)', '''Stephen''', '^Ste(v|ph)en$', '', ut3_tester_helper.main_helper.gc_success); + exec_match('varchar2(100)', '''sTEPHEN''', '^Ste(v|ph)en$', 'i', ut3_tester_helper.main_helper.gc_success); + exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', 'Ste(v|ph)en$', '', ut3_tester_helper.main_helper.gc_success); + exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', 'Ste(v|ph)en$', 'i', ut3_tester_helper.main_helper.gc_success); - exec_match('varchar2(100)', '''Stephen''', '^Steven$', '', ut3_tester_helper.core.gc_failure); - exec_match('varchar2(100)', '''sTEPHEN''', '^Steven$', 'i', ut3_tester_helper.core.gc_failure); - exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', '^Stephen', '', ut3_tester_helper.core.gc_failure); - exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', '^Stephen', 'i', ut3_tester_helper.core.gc_failure); + exec_match('varchar2(100)', '''Stephen''', '^Steven$', '', ut3_tester_helper.main_helper.gc_failure); + exec_match('varchar2(100)', '''sTEPHEN''', '^Steven$', 'i', ut3_tester_helper.main_helper.gc_failure); + exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', '^Stephen', '', ut3_tester_helper.main_helper.gc_failure); + exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', '^Stephen', 'i', ut3_tester_helper.main_helper.gc_failure); - exec_match('varchar2(100)', '''Stephen''', '^Ste(v|ph)en$', '', ut3_tester_helper.core.gc_failure, 'not_'); - exec_match('varchar2(100)', '''sTEPHEN''', '^Ste(v|ph)en$', 'i', ut3_tester_helper.core.gc_failure, 'not_'); - exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', 'Ste(v|ph)en$', '', ut3_tester_helper.core.gc_failure, 'not_'); - exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', 'Ste(v|ph)en$', 'i', ut3_tester_helper.core.gc_failure, 'not_'); + exec_match('varchar2(100)', '''Stephen''', '^Ste(v|ph)en$', '', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_match('varchar2(100)', '''sTEPHEN''', '^Ste(v|ph)en$', 'i', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', 'Ste(v|ph)en$', '', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', 'Ste(v|ph)en$', 'i', ut3_tester_helper.main_helper.gc_failure, 'not_'); - exec_match('varchar2(100)', '''Stephen''', '^Steven$', '', ut3_tester_helper.core.gc_success, 'not_'); - exec_match('varchar2(100)', '''sTEPHEN''', '^Steven$', 'i', ut3_tester_helper.core.gc_success, 'not_'); - exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', '^Stephen', '', ut3_tester_helper.core.gc_success, 'not_'); - exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', '^Stephen', 'i', ut3_tester_helper.core.gc_success, 'not_'); + exec_match('varchar2(100)', '''Stephen''', '^Steven$', '', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_match('varchar2(100)', '''sTEPHEN''', '^Steven$', 'i', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_match('clob', 'to_clob(rpad('', '',32767)||''Stephen'')', '^Stephen', '', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_match('clob', 'to_clob(rpad('', '',32767)||''sTEPHEN'')', '^Stephen', 'i', ut3_tester_helper.main_helper.gc_success, 'not_'); --Fails for unsupported data-type - exec_match('number', '12345', '^123.*', 'i', ut3_tester_helper.core.gc_failure); + exec_match('number', '12345', '^123.*', 'i', ut3_tester_helper.main_helper.gc_failure); end; procedure test_be_like is begin - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en%', '', ut3_tester_helper.core.gc_success); - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en\_K%', '\', ut3_tester_helper.core.gc_success); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en%', '', ut3_tester_helper.core.gc_success); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en\_K%', '\', ut3_tester_helper.core.gc_success); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en%', '', ut3_tester_helper.main_helper.gc_success); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en\_K%', '\', ut3_tester_helper.main_helper.gc_success); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en%', '', ut3_tester_helper.main_helper.gc_success); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en\_K%', '\', ut3_tester_helper.main_helper.gc_success); - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste_en%', '', ut3_tester_helper.core.gc_failure); - exec_be_like('varchar2(100)', '''Stephen_King''', 'Stephe\__%', '\', ut3_tester_helper.core.gc_failure); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste_en%', '', ut3_tester_helper.core.gc_failure); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Stephe\__%', '\', ut3_tester_helper.core.gc_failure); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste_en%', '', ut3_tester_helper.main_helper.gc_failure); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Stephe\__%', '\', ut3_tester_helper.main_helper.gc_failure); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste_en%', '', ut3_tester_helper.main_helper.gc_failure); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Stephe\__%', '\', ut3_tester_helper.main_helper.gc_failure); - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en%', '', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en\_K%', '\', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en%', '', ut3_tester_helper.core.gc_failure, 'not_'); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en\_K%', '\', ut3_tester_helper.core.gc_failure, 'not_'); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en%', '', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste__en\_K%', '\', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en%', '', ut3_tester_helper.main_helper.gc_failure, 'not_'); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste__en\_K%', '\', ut3_tester_helper.main_helper.gc_failure, 'not_'); - exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste_en%', '', ut3_tester_helper.core.gc_success, 'not_'); - exec_be_like('varchar2(100)', '''Stephen_King''', 'Stephe\__%', '\', ut3_tester_helper.core.gc_success, 'not_'); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste_en%', '', ut3_tester_helper.core.gc_success, 'not_'); - exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Stephe\__%', '\', ut3_tester_helper.core.gc_success, 'not_'); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Ste_en%', '', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_be_like('varchar2(100)', '''Stephen_King''', 'Stephe\__%', '\', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Ste_en%', '', ut3_tester_helper.main_helper.gc_success, 'not_'); + exec_be_like('clob', 'to_clob(rpad(''a'',32767,''a'')||''Stephen_King'')', 'a%Stephe\__%', '\', ut3_tester_helper.main_helper.gc_success, 'not_'); --Fails for unsupported data-type - exec_be_like('number', '12345', '123%', '', ut3_tester_helper.core.gc_failure); + exec_be_like('number', '12345', '123%', '', ut3_tester_helper.main_helper.gc_failure); end; procedure test_timestamp_between is From c56943e8cbe11303cbcc35d2119e2008fe3fedec Mon Sep 17 00:00:00 2001 From: Lukasz Date: Sun, 24 Mar 2019 16:47:14 +0000 Subject: [PATCH 009/181] Update properties --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index ce865e05a..f23501e05 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,6 +25,8 @@ env: - UT3_USER_PASSWORD=ut3 - UT3_TESTER=ut3_tester - UT3_TESTER_PASSWORD=ut3 + - UT3_TESTER_HELPER=ut3_tester_helper + - UT3_TESTER_HELPER_PASSWORD=ut3 - UT3_TABLESPACE=users # Environment for building a release - CURRENT_BRANCH=${TRAVIS_BRANCH} From 5afba1000b1a2ccdb0f6a3b7621dab107eabb556 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sun, 24 Mar 2019 18:02:00 +0000 Subject: [PATCH 010/181] Change user that executes tests as helper that is super user. --- .travis/install.sh | 1 - test/install_and_run_tests.sh | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index 3cd476981..a6ab0cc16 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -86,7 +86,6 @@ grant drop public database link to $UT3_TESTER_HELPER; set feedback on --Needed for testing coverage outside of main UT3 schema. grant create any procedure, drop any procedure, execute any procedure, create any type, drop any type, execute any type, under any type, select any table, update any table, insert any table, delete any table, create any table, drop any table, alter any table, select any dictionary to $UT3_TESTER_HELPER; -revoke execute on dbms_crypto from $UT3_TESTER_HELPER; grant create job to $UT3_TESTER_HELPER; exit SQL diff --git a/test/install_and_run_tests.sh b/test/install_and_run_tests.sh index 421732be1..953d75bc7 100755 --- a/test/install_and_run_tests.sh +++ b/test/install_and_run_tests.sh @@ -14,7 +14,7 @@ time "$SQLCLI" ${UT3_TESTER}/${UT3_TESTER_PASSWORD}@//${CONNECTION_STR} @install cd .. -time utPLSQL-cli/bin/utplsql run ${UT3_TESTER}/${UT3_TESTER_PASSWORD}@${CONNECTION_STR} \ +time utPLSQL-cli/bin/utplsql run ${UT3_TESTER_HELPER}/${UT3_TESTER_HELPER_PASSWORD}@${CONNECTION_STR} \ -source_path=source -owner=ut3 \ -p='ut3_tester,ut3$user#' \ -test_path=test -c \ From 423bf333aa4fd5867d002aafdc734341faebd5ce Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 24 Mar 2019 18:16:47 +0000 Subject: [PATCH 011/181] Updated version to `3.1.7` --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d80dc339d..e5e2ba276 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.1.6 +v3.1.7 From fab90fd51ed32bc6040ae42efe07964bc7986664 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 24 Mar 2019 18:50:06 +0000 Subject: [PATCH 012/181] Updated project version after build [skip ci] --- VERSION | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- sonar-project.properties | 2 +- source/core/ut_utils.pks | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/VERSION b/VERSION index e5e2ba276..5ae33779b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.1.7 +v3.1.7-develop diff --git a/docs/about/authors.md b/docs/about/authors.md index b3abfac6c..a2893d370 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index b55ca2d4d..5d89726af 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 51c135cfc..bddb264dd 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 4a7720d37..e9b56bee3 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 772c7d463..305afe3d4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 63f0461f6..64a242840 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 4e888ee95..de5d76f16 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index b47b90c91..8b68d667b 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 4f2a30688..e154a77b1 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 2a220efad..af60ac266 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 25de3c652..3b6e7ce45 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 6f59dc759..2621221e5 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 0a47fcfd1..e0916fa6f 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 50aa661f5..2b25f2ae5 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 104795ded..b7d114bcf 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 3703fa4d8..4abe304b5 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index b803a671a..70dd4c551 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.6.2729-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) # Upgrading from version 2 diff --git a/sonar-project.properties b/sonar-project.properties index c137871ee..d6744053e 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -2,7 +2,7 @@ sonar.projectKey=utPLSQL # this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1. sonar.projectName=utPLSQL -sonar.projectVersion=v3.1.6 +sonar.projectVersion=v3.1.7-develop # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. # Since SonarQube 4.2, this property is optional if sonar.modules is set. diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index a9ecf9ac6..da8f0c2dd 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.6.2729'; + gc_version constant varchar2(50) := 'v3.1.7.2737-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 7cd92e77e4807e1ae33776a2b70ab05211df8d09 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sun, 24 Mar 2019 23:05:11 +0000 Subject: [PATCH 013/181] Adding next set of tests migrated. expectations/binary/test_equal expectations/binary/test_expect_to_be_less_than expectations/test_expectation_anydata expectations/test_expectation_processor --- test/grant_ut3_owner_to_ut3_tester.sql | 35 + test/install_and_run_tests.sh | 2 + test/install_ut3_tester_helper.sql | 6 + test/install_ut3_tester_tests.sql | 4 + test/install_ut3_user_tests.sql | 6 + test/ut3_tester/core.pkb | 11 + test/ut3_tester/core.pks | 10 + .../test_before_after_annotations.pks | 2 +- test/ut3_tester/core/core.pkb | 125 --- test/ut3_tester/core/core.pks | 32 - .../test_expectation_processor.pkb | 71 ++ .../test_expectation_processor.pks | 17 + .../ut3_tester_helper/expectations_helper.pkb | 57 + .../ut3_tester_helper/expectations_helper.pks | 25 + test/ut3_tester_helper/main_helper.pkb | 10 + test/ut3_tester_helper/main_helper.pks | 6 +- test/ut3_tester_helper/other_dummy_object.tps | 16 + test/ut3_tester_helper/test_dummy_object.tps | 3 - .../test_dummy_object_list.tps | 2 + test/ut3_tester_helper/test_tab_varchar2.tps | 12 + test/ut3_tester_helper/test_tab_varray.tps | 13 + test/ut3_user/api/test_ut_runner.pks | 2 +- .../expectations/binary/test_equal.pkb | 264 +++++ .../expectations/binary/test_equal.pks | 38 + .../binary/test_expect_to_be_less_than.pkb | 263 +++++ .../binary/test_expect_to_be_less_than.pks | 97 ++ .../expectations/test_expectation_anydata.pkb | 974 ++++++++++++++++++ .../expectations/test_expectation_anydata.pks | 202 ++++ .../expectations/test_expectations_cursor.pks | 2 +- test/ut3_user/expectations/test_matchers.pks | 2 +- 30 files changed, 2144 insertions(+), 165 deletions(-) create mode 100644 test/grant_ut3_owner_to_ut3_tester.sql create mode 100644 test/ut3_tester/core.pkb create mode 100644 test/ut3_tester/core.pks delete mode 100644 test/ut3_tester/core/core.pkb delete mode 100644 test/ut3_tester/core/core.pks create mode 100644 test/ut3_tester/core/expectations/test_expectation_processor.pkb create mode 100644 test/ut3_tester/core/expectations/test_expectation_processor.pks create mode 100644 test/ut3_tester_helper/expectations_helper.pkb create mode 100644 test/ut3_tester_helper/expectations_helper.pks create mode 100644 test/ut3_tester_helper/other_dummy_object.tps create mode 100644 test/ut3_tester_helper/test_dummy_object_list.tps create mode 100644 test/ut3_tester_helper/test_tab_varchar2.tps create mode 100644 test/ut3_tester_helper/test_tab_varray.tps create mode 100644 test/ut3_user/expectations/binary/test_equal.pkb create mode 100644 test/ut3_user/expectations/binary/test_equal.pks create mode 100644 test/ut3_user/expectations/binary/test_expect_to_be_less_than.pkb create mode 100644 test/ut3_user/expectations/binary/test_expect_to_be_less_than.pks create mode 100644 test/ut3_user/expectations/test_expectation_anydata.pkb create mode 100644 test/ut3_user/expectations/test_expectation_anydata.pks diff --git a/test/grant_ut3_owner_to_ut3_tester.sql b/test/grant_ut3_owner_to_ut3_tester.sql new file mode 100644 index 000000000..d06a24ace --- /dev/null +++ b/test/grant_ut3_owner_to_ut3_tester.sql @@ -0,0 +1,35 @@ +set define off +whenever sqlerror exit failure rollback +whenever oserror exit failure rollback + +alter session set plsql_optimize_level=0; + +set linesize 200 +set define on +set verify off + +prompt Empowering UT3_TESTER to UT3_OWNER objects + +begin + for i in ( select object_name from all_objects t + where t.object_type in ('PACKAGE','TYPE') + and owner = 'UT3' + and generated = 'N' + and lower(object_name) not like 'sys%') + loop + execute immediate 'grant execute on ut3.'||i.object_name||' to UT3_TESTER'; + end loop; +end; +/ + +prompt Empowering UT3_TESTER to UT3_OWNER tables + +begin + for i in ( select table_name from all_tables t where owner = 'UT3' and nested = 'NO' and IOT_TYPE is NULL) + loop + execute immediate 'grant select on UT3.'||i.table_name||' to UT3_TESTER'; + end loop; +end; +/ + +exit; diff --git a/test/install_and_run_tests.sh b/test/install_and_run_tests.sh index 953d75bc7..9f5752b5e 100755 --- a/test/install_and_run_tests.sh +++ b/test/install_and_run_tests.sh @@ -6,6 +6,8 @@ git rev-parse && cd "$(git rev-parse --show-cdup)" cd test +time "$SQLCLI" sys/${ORACLE_PWD}@//${CONNECTION_STR} AS SYSDBA @grant_ut3_owner_to_ut3_tester.sql + time "$SQLCLI" ${UT3_TESTER_HELPER}/${UT3_TESTER_HELPER_PASSWORD}@//${CONNECTION_STR} @install_ut3_tester_helper.sql time "$SQLCLI" ${UT3_USER}/${UT3_USER_PASSWORD}@//${CONNECTION_STR} @install_ut3_user_tests.sql diff --git a/test/install_ut3_tester_helper.sql b/test/install_ut3_tester_helper.sql index 14586c469..acfb55aff 100644 --- a/test/install_ut3_tester_helper.sql +++ b/test/install_ut3_tester_helper.sql @@ -5,12 +5,18 @@ whenever oserror exit failure rollback alter session set plsql_optimize_level=0; --Install ut3_tester_helper @@ut3_tester_helper/test_dummy_object.tps +@@ut3_tester_helper/other_dummy_object.tps +@@ut3_tester_helper/test_dummy_object_list.tps +@@ut3_tester_helper/test_tab_varchar2.tps +@@ut3_tester_helper/test_tab_varray.tps @@ut3_tester_helper/main_helper.pks @@ut3_tester_helper/run_helper.pks +@@ut3_tester_helper/expectations_helper.pks @@ut3_tester_helper/main_helper.pkb @@ut3_tester_helper/run_helper.pkb +@@ut3_tester_helper/expectations_helper.pkb set linesize 200 set define on diff --git a/test/install_ut3_tester_tests.sql b/test/install_ut3_tester_tests.sql index 85b0ae201..146a3a211 100644 --- a/test/install_ut3_tester_tests.sql +++ b/test/install_ut3_tester_tests.sql @@ -6,9 +6,13 @@ alter session set plsql_optimize_level=0; --Install tests +@@ut3_tester/core.pks @@ut3_tester/core/annotations/test_before_after_annotations.pks +@@ut3_tester/core/expectations/test_expectation_processor.pks +@@ut3_tester/core.pkb @@ut3_tester/core/annotations/test_before_after_annotations.pkb +@@ut3_tester/core/expectations/test_expectation_processor.pkb set linesize 200 set define on diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index 666a410a4..b38375c34 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -5,11 +5,17 @@ whenever oserror exit failure rollback alter session set plsql_optimize_level=0; prompt Install user tests +@@ut3_user/expectations/binary/test_equal.pks +@@ut3_user/expectations/binary/test_expect_to_be_less_than.pks @@ut3_user/expectations/test_matchers.pks +@@ut3_user/expectations/test_expectation_anydata.pks @@ut3_user/expectations/test_expectations_cursor.pks @@ut3_user/api/test_ut_runner.pks +@@ut3_user/expectations/binary/test_equal.pkb +@@ut3_user/expectations/binary/test_expect_to_be_less_than.pkb @@ut3_user/expectations/test_matchers.pkb +@@ut3_user/expectations/test_expectation_anydata.pkb @@ut3_user/expectations/test_expectations_cursor.pkb @@ut3_user/api/test_ut_runner.pkb diff --git a/test/ut3_tester/core.pkb b/test/ut3_tester/core.pkb new file mode 100644 index 000000000..a1da097a9 --- /dev/null +++ b/test/ut3_tester/core.pkb @@ -0,0 +1,11 @@ +create or replace package body core is + + procedure global_setup is + begin + ut3.ut_coverage.set_develop_mode(true); + --improve performance of test execution by disabling all compiler optimizations + ut3_tester_helper.main_helper.execute_autonomous('ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=0'); + end; + +end; +/ diff --git a/test/ut3_tester/core.pks b/test/ut3_tester/core.pks new file mode 100644 index 000000000..0edf2ae54 --- /dev/null +++ b/test/ut3_tester/core.pks @@ -0,0 +1,10 @@ +create or replace package core is + + --%suite + --%suitepath(utplsql) + + --%beforeall + procedure global_setup; + +end; +/ diff --git a/test/ut3_tester/core/annotations/test_before_after_annotations.pks b/test/ut3_tester/core/annotations/test_before_after_annotations.pks index a4ce52727..1a0a2ebaf 100644 --- a/test/ut3_tester/core/annotations/test_before_after_annotations.pks +++ b/test/ut3_tester/core/annotations/test_before_after_annotations.pks @@ -1,7 +1,7 @@ create or replace package test_before_after_annotations is --%suite(annotations - beforetest and aftertest) - --%suitepath(utplsql.core.annotations) + --%suitepath(utplsql.framework_tester.core.annotations) subtype t_procedure_name is varchar2(250) not null; type t_procedures is table of t_procedure_name; diff --git a/test/ut3_tester/core/core.pkb b/test/ut3_tester/core/core.pkb deleted file mode 100644 index 9b70f3826..000000000 --- a/test/ut3_tester/core/core.pkb +++ /dev/null @@ -1,125 +0,0 @@ -create or replace package body core is - - function get_dbms_output_as_clob return clob is - l_status number; - l_line varchar2(32767); - l_result clob; - begin - - dbms_output.get_line(line => l_line, status => l_status); - if l_status != 1 then - dbms_lob.createtemporary(l_result, true, dur => dbms_lob.session); - end if; - while l_status != 1 loop - if l_line is not null then - ut3.ut_utils.append_to_clob(l_result, l_line||chr(10)); - end if; - dbms_output.get_line(line => l_line, status => l_status); - end loop; - return l_result; - end; - - procedure global_setup is - begin - ut3.ut_coverage.set_develop_mode(true); - --improve performance of test execution by disabling all compiler optimizations - execute_autonomous('ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=0'); - - execute_autonomous( - q'[create or replace package ut_transaction_control as - function count_rows(a_val varchar2) return number; - procedure setup; - procedure test; - procedure test_failure; - end;]' - ); - execute_autonomous( - q'[create or replace package body ut_transaction_control - as - - function count_rows(a_val varchar2) return number is - l_cnt number; - begin - select count(*) into l_cnt from ut$test_table t where t.val = a_val; - return l_cnt; - end; - procedure setup is begin - insert into ut$test_table values ('s'); - end; - procedure test is - begin - insert into ut$test_table values ('t'); - end; - procedure test_failure is - begin - insert into ut$test_table values ('t'); - --raise no_data_found; - raise_application_error(-20001,'Error'); - end; - end;]' - ); - end; - - procedure global_cleanup is - begin - execute_autonomous('drop package ut_transaction_control'); - end; - - procedure execute_autonomous(a_sql varchar2) is - pragma autonomous_transaction; - begin - if a_sql is not null then - execute immediate a_sql; - end if; - commit; - end; - - function run_test(a_path varchar2) return clob is - l_lines ut3.ut_varchar2_list; - begin - select * bulk collect into l_lines from table(ut3.ut.run(a_path)); - return ut3.ut_utils.table_to_clob(l_lines); - end; - - function get_value(a_variable varchar2) return integer is - l_glob_val integer; - begin - execute immediate 'begin :l_glob_val := '||a_variable||'; end;' using out l_glob_val; - return l_glob_val; - end; - - function get_failed_expectations return ut3.ut_varchar2_list is - l_expectations_result ut3.ut_expectation_results := ut3.ut_expectation_processor.get_failed_expectations(); - l_result ut3.ut_varchar2_list; - begin - for i in 1..l_expectations_result.count loop - l_result := l_result multiset union l_expectations_result(i).get_result_lines(); - end loop; - return l_result; - end; - - function failed_expectations_data return anydata is - begin - return anydata.convertCollection(ut3.ut_expectation_processor.get_failed_expectations()); - end; - - function get_failed_expectations_n return number is - l_num_failed number; - l_results ut3.ut_expectation_results := ut3.ut_expectation_processor.get_failed_expectations(); - begin - l_num_failed := l_results.count; - return l_num_failed; - end; - - procedure clear_expectations is - begin - ut3.ut_expectation_processor.clear_expectations(); - end; - - function table_to_clob(a_results in ut3.ut_varchar2_list) return clob is - begin - return ut3.ut_utils.table_to_clob(a_results); - end; - -end; -/ diff --git a/test/ut3_tester/core/core.pks b/test/ut3_tester/core/core.pks deleted file mode 100644 index c011d8916..000000000 --- a/test/ut3_tester/core/core.pks +++ /dev/null @@ -1,32 +0,0 @@ -create or replace package main_helper is - - gc_success number := ut3.ut_utils.gc_success; - gc_failure number := ut3.ut_utils.gc_failure; - - --%suite - --%suitepath(utplsql) - - --%beforeall - procedure global_setup; - - --%afterall - procedure global_cleanup; - - procedure execute_autonomous(a_sql varchar2); - - function run_test(a_path varchar2) return clob; - - function get_value(a_variable varchar2) return integer; - - function get_dbms_output_as_clob return clob; - - function get_failed_expectations return ut3.ut_varchar2_list; - - function get_failed_expectations_n return number; - - procedure clear_expectations; - - function table_to_clob(a_results in ut3.ut_varchar2_list) return clob; - -end; -/ diff --git a/test/ut3_tester/core/expectations/test_expectation_processor.pkb b/test/ut3_tester/core/expectations/test_expectation_processor.pkb new file mode 100644 index 000000000..17ffbec3c --- /dev/null +++ b/test/ut3_tester/core/expectations/test_expectation_processor.pkb @@ -0,0 +1,71 @@ +create or replace package body test_expectation_processor is + + procedure who_called_expectation is + l_stack_trace varchar2(4000); + l_source_line varchar2(4000); + begin + l_stack_trace := q'[----- PL/SQL Call Stack ----- + object line object + handle number name +34f88e4420 124 package body SCH_TEST.UT_EXPECTATION_PROCESSOR +353dfeb2f8 26 SCH_TEST.UT_EXPECTATION_RESULT +cba249ce0 112 SCH_TEST.UT_EXPECTATION +3539881cf0 21 SCH_TEST.UT_EXPECTATION_NUMBER +351a608008 28 package body SCH_TEST.TPKG_PRIOR_YEAR_GENERATION +351a6862b8 6 anonymous block +351fe31010 1825 package body SYS.DBMS_SQL +20befbe4d8 129 SCH_TEST.UT_EXECUTABLE +20befbe4d8 65 SCH_TEST.UT_EXECUTABLE +34f8ab7cd8 80 SCH_TEST.UT_TEST +34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM +34f8ab9b10 74 SCH_TEST.UT_SUITE +34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM +cba24bfd0 75 SCH_TEST.UT_LOGICAL_SUITE +353dfecf30 59 SCH_TEST.UT_RUN +34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM +357f5421e8 77 package body SCH_TEST.UT_RUNNER +357f5421e8 111 package body SCH_TEST.UT_RUNNER +20be951ab0 292 package body SCH_TEST.UT +20be951ab0 320 package body SCH_TEST.UT +]'; + ut.expect( + ut3.ut_expectation_processor.who_called_expectation(l_stack_trace) + ).to_be_like('at "SCH_TEST.TPKG_PRIOR_YEAR_GENERATION", line 28 %'); + end; + + + procedure who_called_expectation_0x is + l_stack_trace varchar2(4000); + l_source_line varchar2(4000); + begin + l_stack_trace := q'[----- PL/SQL Call Stack ----- + object line object + handle number name +34f88e4420 124 package body SCH_TEST.UT_EXPECTATION_PROCESSOR +353dfeb2f8 26 SCH_TEST.UT_EXPECTATION_RESULT +cba249ce0 112 SCH_TEST.UT_EXPECTATION +3539881cf0 21 SCH_TEST.UT_EXPECTATION_NUMBER +351a608008 28 package body SCH_TEST.TPKG_PRIOR_YEAR_GENERATION +351a6862b8 6 anonymous block +351fe31010 1825 package body SYS.DBMS_SQL +20befbe4d8 129 SCH_TEST.UT_EXECUTABLE +20befbe4d8 65 SCH_TEST.UT_EXECUTABLE +34f8ab7cd8 80 SCH_TEST.UT_TEST +34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM +34f8ab9b10 74 SCH_TEST.UT_SUITE +34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM +cba24bfd0 75 SCH_TEST.UT_LOGICAL_SUITE +353dfecf30 59 SCH_TEST.UT_RUN +34f8ab98f0 48 SCH_TEST.UT_SUITE_ITEM +357f5421e8 77 package body SCH_TEST.UT_RUNNER +357f5421e8 111 package body SCH_TEST.UT_RUNNER +20be951ab0 292 package body SCH_TEST.UT +20be951ab0 320 package body SCH_TEST.UT +]'; + ut.expect( + ut3.ut_expectation_processor.who_called_expectation(l_stack_trace) + ).to_be_like('at "SCH_TEST.TPKG_PRIOR_YEAR_GENERATION", line 28 %'); + end; + +end; +/ diff --git a/test/ut3_tester/core/expectations/test_expectation_processor.pks b/test/ut3_tester/core/expectations/test_expectation_processor.pks new file mode 100644 index 000000000..c6f80f20d --- /dev/null +++ b/test/ut3_tester/core/expectations/test_expectation_processor.pks @@ -0,0 +1,17 @@ +create or replace package test_expectation_processor is + + --%suite(expectation_processor) + --%suitepath(utplsql.framework_tester.core.expectations) + + --%context(who_called_expectation) + + --%test(parses stack trace and returns object and line that called expectation) + procedure who_called_expectation; + + --%test(parses stack trace containing 0x and returns object and line that called expectation) + procedure who_called_expectation_0x; + + --%endcontext + +end; +/ diff --git a/test/ut3_tester_helper/expectations_helper.pkb b/test/ut3_tester_helper/expectations_helper.pkb new file mode 100644 index 000000000..cc86f18a6 --- /dev/null +++ b/test/ut3_tester_helper/expectations_helper.pkb @@ -0,0 +1,57 @@ +create or replace package body expectations_helper is + + function unary_expectation_block( + a_matcher_name varchar2, + a_data_type varchar2, + a_data_value varchar2 + ) return varchar2 is + l_execute varchar2(32000); + begin + l_execute := ' + declare + l_expected '||a_data_type||' := '||a_data_value||'; + begin + --act - execute the expectation + ut3.ut.expect(l_expected).'||a_matcher_name||'(); + end;'; + return l_execute; + end; + + function unary_expectation_object_block( + a_matcher_name varchar2, + a_object_name varchar2, + a_object_value varchar2, + a_object_type varchar2 + ) return varchar2 is + begin + return ' + declare + l_object '||a_object_name||' := '||a_object_value||'; + begin + ut3.ut.expect(anydata.convert'||a_object_type||'(l_object)).'||a_matcher_name||'(); + end;'; + end; + + function binary_expectation_block( + a_matcher_name varchar2, + a_actual_data_type varchar2, + a_actual_data varchar2, + a_expected_data_type varchar2, + a_expected_data varchar2 + ) return varchar2 + is + l_execute varchar2(32000); + begin + l_execute := ' + declare + l_actual '||a_actual_data_type||' := '||a_actual_data||'; + l_expected '||a_expected_data_type||' := '||a_expected_data||'; + begin + --act - execute the expectation + ut3.ut.expect( l_actual ).'||a_matcher_name||'(l_expected); + end;'; + return l_execute; + end; + +end; +/ diff --git a/test/ut3_tester_helper/expectations_helper.pks b/test/ut3_tester_helper/expectations_helper.pks new file mode 100644 index 000000000..9c1d54333 --- /dev/null +++ b/test/ut3_tester_helper/expectations_helper.pks @@ -0,0 +1,25 @@ +create or replace package expectations_helper is + + function unary_expectation_block( + a_matcher_name varchar2, + a_data_type varchar2, + a_data_value varchar2 + ) return varchar2; + + function unary_expectation_object_block( + a_matcher_name varchar2, + a_object_name varchar2, + a_object_value varchar2, + a_object_type varchar2 + ) return varchar2; + + function binary_expectation_block( + a_matcher_name varchar2, + a_actual_data_type varchar2, + a_actual_data varchar2, + a_expected_data_type varchar2, + a_expected_data varchar2 + ) return varchar2; + +end; +/ diff --git a/test/ut3_tester_helper/main_helper.pkb b/test/ut3_tester_helper/main_helper.pkb index 9ceedd68a..4c93720cd 100644 --- a/test/ut3_tester_helper/main_helper.pkb +++ b/test/ut3_tester_helper/main_helper.pkb @@ -86,5 +86,15 @@ create or replace package body main_helper is return ut3.ut_expectation_processor.get_warnings(); end; + procedure reset_nulls_equal is + begin + ut3.ut_expectation_processor.nulls_Are_equal(ut3.ut_expectation_processor.gc_default_nulls_are_equal); + end; + + procedure nulls_are_equal(a_nulls_equal boolean := true) is + begin + ut3.ut_expectation_processor.nulls_Are_equal(a_nulls_equal); + end; + end; / diff --git a/test/ut3_tester_helper/main_helper.pks b/test/ut3_tester_helper/main_helper.pks index 6c7f34bc0..be755fea6 100644 --- a/test/ut3_tester_helper/main_helper.pks +++ b/test/ut3_tester_helper/main_helper.pks @@ -22,6 +22,10 @@ create or replace package main_helper is function table_to_clob(a_results in ut3.ut_varchar2_list) return clob; function get_warnings return ut3.ut_varchar2_rows; - + + procedure reset_nulls_equal; + + procedure nulls_are_equal(a_nulls_equal boolean := true); + end; / diff --git a/test/ut3_tester_helper/other_dummy_object.tps b/test/ut3_tester_helper/other_dummy_object.tps new file mode 100644 index 000000000..7453d5dcf --- /dev/null +++ b/test/ut3_tester_helper/other_dummy_object.tps @@ -0,0 +1,16 @@ +declare + l_exists integer; +begin + select count(1) into l_exists from user_types where type_name = 'OTHER_DUMMY_OBJECT'; + if l_exists > 0 then + execute immediate 'drop type other_dummy_object force'; + end if; +end; +/ + +create or replace type other_dummy_object as object ( + id number, + "name" varchar2(30), + "Value" varchar2(30) +) +/ diff --git a/test/ut3_tester_helper/test_dummy_object.tps b/test/ut3_tester_helper/test_dummy_object.tps index 79eed3e6e..7f095fc0a 100644 --- a/test/ut3_tester_helper/test_dummy_object.tps +++ b/test/ut3_tester_helper/test_dummy_object.tps @@ -14,6 +14,3 @@ create or replace type test_dummy_object as object ( "Value" varchar2(30) ) / - - -grant execute on test_dummy_object to ut3$user#; \ No newline at end of file diff --git a/test/ut3_tester_helper/test_dummy_object_list.tps b/test/ut3_tester_helper/test_dummy_object_list.tps new file mode 100644 index 000000000..67bba558e --- /dev/null +++ b/test/ut3_tester_helper/test_dummy_object_list.tps @@ -0,0 +1,2 @@ +create or replace type test_dummy_object_list as table of test_dummy_object +/ diff --git a/test/ut3_tester_helper/test_tab_varchar2.tps b/test/ut3_tester_helper/test_tab_varchar2.tps new file mode 100644 index 000000000..17086292a --- /dev/null +++ b/test/ut3_tester_helper/test_tab_varchar2.tps @@ -0,0 +1,12 @@ +declare + l_exists integer; +begin + select count(1) into l_exists from user_types where type_name = 'T_TAB_VARCHAR'; + if l_exists > 0 then + execute immediate 'drop type t_tab_varchar force'; + end if; +end; +/ + +create or replace type t_tab_varchar is table of varchar2(1) +/ \ No newline at end of file diff --git a/test/ut3_tester_helper/test_tab_varray.tps b/test/ut3_tester_helper/test_tab_varray.tps new file mode 100644 index 000000000..3c684afca --- /dev/null +++ b/test/ut3_tester_helper/test_tab_varray.tps @@ -0,0 +1,13 @@ +declare + l_exists integer; +begin + select count(1) into l_exists from user_types where type_name = 'T_VARRAY'; + if l_exists > 0 then + execute immediate 'drop type t_varray force'; + end if; +end; +/ + + +create or replace type t_varray is varray(1) of number +/ \ No newline at end of file diff --git a/test/ut3_user/api/test_ut_runner.pks b/test/ut3_user/api/test_ut_runner.pks index d67ee45fc..70eed747f 100644 --- a/test/ut3_user/api/test_ut_runner.pks +++ b/test/ut3_user/api/test_ut_runner.pks @@ -1,7 +1,7 @@ create or replace package test_ut_runner is --%suite(ut_runner) - --%suitepath(utplsql.api) + --%suitepath(utplsql.test_user.api) --%rollback(manual) --%test(transaction stays open after the run if it was opened before the run) diff --git a/test/ut3_user/expectations/binary/test_equal.pkb b/test/ut3_user/expectations/binary/test_equal.pkb new file mode 100644 index 000000000..8b369d0e7 --- /dev/null +++ b/test/ut3_user/expectations/binary/test_equal.pkb @@ -0,0 +1,264 @@ +create or replace package body test_equal is + + procedure reset_nulls_equal is + begin + ut3_tester_helper.main_helper.reset_nulls_equal; + end; + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + function to_equal_block( + a_matcher_name varchar2, + a_actual_type varchar2, + a_expected_type varchar2, + a_actual varchar2, + a_expected varchar2, + a_nulls_equal boolean := null + ) return varchar2 is + l_nulls_equal varchar2(10); + begin + l_nulls_equal := case when a_nulls_equal then 'true' when not a_nulls_equal then 'false' else 'null' end; + return ' + declare + l_actual '||a_actual_type||' := '||a_actual||'; + l_expected '||a_expected_type||' := '||a_expected||'; + begin + ut3.ut.expect( l_actual ).'||a_matcher_name||'(l_expected, a_nulls_are_equal=>'||l_nulls_equal||'); + end;'; + end; + + procedure test_to_equal_success( + a_actual_type varchar2, + a_expected_type varchar2, + a_actual varchar2, + a_expected varchar2, + a_nulls_equal boolean := null + ) is + begin + execute immediate + to_equal_block( 'to_equal', a_actual_type, a_expected_type, a_actual, a_expected, a_nulls_equal ); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + cleanup_expectations; + end; + + procedure test_to_equal_success( + a_actual_type varchar2, + a_actual varchar2, + a_expected varchar2, + a_nulls_equal boolean := null + ) is + begin + test_to_equal_success(a_actual_type, a_actual_type, a_actual, a_expected, a_nulls_equal); + end; + + + procedure test_to_equal_fail( + a_actual_type varchar2, + a_expected_type varchar2, + a_actual varchar2, + a_expected varchar2, + a_nulls_equal boolean := null + ) is + begin + execute immediate + to_equal_block( 'to_equal', a_actual_type, a_expected_type, a_actual, a_expected, a_nulls_equal ); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + cleanup_expectations; + end; + + procedure test_not_to_equal_fail( + a_actual_type varchar2, + a_expected_type varchar2, + a_actual varchar2, + a_expected varchar2, + a_nulls_equal boolean := null + ) is + begin + execute immediate + to_equal_block( 'not_to_equal', a_actual_type, a_expected_type, a_actual, a_expected, a_nulls_equal ); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + cleanup_expectations; + end; + + procedure test_to_equal_fail( + a_actual_type varchar2, + a_actual varchar2, + a_expected varchar2, + a_nulls_equal boolean := null + ) is + begin + test_to_equal_fail(a_actual_type, a_actual_type, a_actual, a_expected, a_nulls_equal); + end; + + procedure equal_fail_on_type_diff is + begin + test_to_equal_fail('boolean', 'integer', 'true', '1'); + test_to_equal_fail('integer', 'boolean', '1', 'true'); + test_to_equal_fail('blob', 'clob', 'to_blob(''ABC'')', '''ABC'''); + test_to_equal_fail('clob', 'blob', '''ABC''', 'to_blob(''ABC'')'); + test_to_equal_fail('clob', 'anydata', '''ABC''', 'null'); + test_to_equal_fail('anydata', 'sys_refcursor', 'null', 'null'); + test_to_equal_fail('sys_refcursor', 'anydata', 'null', 'null'); + test_to_equal_fail('clob', 'varchar2(4000)', '''Abc''', '''Abc'''); + test_to_equal_fail('date', 'timestamp', 'sysdate', 'sysdate'); + test_to_equal_fail('date', 'timestamp with local time zone', 'sysdate', 'sysdate'); + test_to_equal_fail('timestamp', 'date', 'sysdate', 'sysdate'); + test_to_equal_fail('timestamp with local time zone', 'timestamp', 'sysdate', 'sysdate'); + test_to_equal_fail('timestamp with local time zone', 'timestamp with time zone', 'sysdate', 'sysdate'); + test_to_equal_fail('number', 'varchar2(4000)', '1', '''1'''); + test_to_equal_fail('varchar2(4000)', 'number', '''1''', '1'); + test_to_equal_fail('varchar2(4000)', 'boolean', '''true''', 'true'); + test_to_equal_fail('interval day to second', 'interval year to month', '''2 01:00:00''', '''1-1'''); + test_to_equal_fail('interval year to month', 'interval day to second', '''1-1''', '''2 01:00:00'''); + end; + + procedure not_equal_fail_on_type_diff is + begin + test_not_to_equal_fail('boolean', 'integer', 'true', '1'); + test_not_to_equal_fail('integer', 'boolean', '1', 'true'); + test_not_to_equal_fail('blob', 'clob', 'to_blob(''ABC'')', '''ABC'''); + test_not_to_equal_fail('clob', 'blob', '''ABC''', 'to_blob(''ABC'')'); + test_not_to_equal_fail('clob', 'anydata', '''ABC''', 'null'); + test_not_to_equal_fail('anydata', 'sys_refcursor', 'null', 'null'); + test_not_to_equal_fail('sys_refcursor', 'anydata', 'null', 'null'); + test_not_to_equal_fail('clob', 'varchar2(4000)', '''Abc''', '''Abc'''); + test_not_to_equal_fail('date', 'timestamp', 'sysdate', 'sysdate'); + test_not_to_equal_fail('date', 'timestamp with local time zone', 'sysdate', 'sysdate'); + test_not_to_equal_fail('timestamp', 'date', 'sysdate', 'sysdate'); + test_not_to_equal_fail('timestamp with local time zone', 'timestamp', 'sysdate', 'sysdate'); + test_not_to_equal_fail('timestamp with local time zone', 'timestamp with time zone', 'sysdate', 'sysdate'); + test_not_to_equal_fail('number', 'varchar2(4000)', '1', '''1'''); + test_not_to_equal_fail('varchar2(4000)', 'number', '''1''', '1'); + test_not_to_equal_fail('varchar2(4000)', 'boolean', '''true''', 'true'); + test_not_to_equal_fail('interval day to second', 'interval year to month', '''2 01:00:00''', '''1-1'''); + test_not_to_equal_fail('interval year to month', 'interval day to second', '''1-1''', '''2 01:00:00'''); + end; + + procedure failure_on_data_diff is + begin + test_to_equal_fail('blob', 'to_blob(''abc'')', 'to_blob(''abd'')'); + test_to_equal_fail('boolean', 'false', 'true'); + test_to_equal_fail('boolean', 'true', 'false'); + test_to_equal_fail('clob', '''Abc''', '''abc'''); + test_to_equal_fail('date', 'sysdate', 'sysdate-1'); + test_to_equal_fail('number', '0.1', '0.3'); + test_to_equal_fail('timestamp', 'systimestamp', 'systimestamp'); + test_to_equal_fail('timestamp with local time zone', 'systimestamp', 'systimestamp'); + test_to_equal_fail('timestamp with time zone', 'systimestamp', 'systimestamp'); + test_to_equal_fail('varchar2(4000)', '''Abc''', '''abc'''); + test_to_equal_fail('interval day to second', '''2 01:00:00''', '''2 01:00:01'''); + test_to_equal_fail('interval year to month', '''1-1''', '''1-2'''); + end; + + procedure failure_on_actual_null is + begin + test_to_equal_fail('blob', 'NULL', 'to_blob(''abc'')'); + test_to_equal_fail('boolean', 'NULL', 'true'); + test_to_equal_fail('clob', 'NULL', '''abc'''); + test_to_equal_fail('date', 'NULL', 'sysdate'); + test_to_equal_fail('number', 'NULL', '1'); + test_to_equal_fail('timestamp', 'NULL', 'systimestamp'); + test_to_equal_fail('timestamp with local time zone', 'NULL', 'systimestamp'); + test_to_equal_fail('timestamp with time zone', 'NULL', 'systimestamp'); + test_to_equal_fail('varchar2(4000)', 'NULL', '''abc'''); + test_to_equal_fail('interval day to second', 'NULL', '''2 01:00:00'''); + test_to_equal_fail('interval year to month', 'NULL', '''1-1'''); + end; + + procedure failure_on_expected_null is + begin + test_to_equal_fail('blob', 'to_blob(''abc'')', 'NULL'); + test_to_equal_fail('boolean', 'true', 'NULL'); + test_to_equal_fail('clob', '''abc''', 'NULL'); + test_to_equal_fail('date', 'sysdate', 'NULL'); + test_to_equal_fail('number', '1234', 'NULL'); + test_to_equal_fail('timestamp', 'systimestamp', 'NULL'); + test_to_equal_fail('timestamp with local time zone', 'systimestamp', 'NULL'); + test_to_equal_fail('timestamp with time zone', 'systimestamp', 'NULL'); + test_to_equal_fail('varchar2(4000)', '''abc''', 'NULL'); + test_to_equal_fail('interval day to second', '''2 01:00:00''', 'NULL'); + test_to_equal_fail('interval year to month', '''1-1''', 'NULL'); + end; + + procedure failure_on_both_null_with_parm is + begin + test_to_equal_fail('blob', 'NULL', 'NULL', false); + test_to_equal_fail('boolean', 'NULL', 'NULL', false); + test_to_equal_fail('clob', 'NULL', 'NULL', false); + test_to_equal_fail('date', 'NULL', 'NULL', false); + test_to_equal_fail('number', 'NULL', 'NULL', false); + test_to_equal_fail('timestamp', 'NULL', 'NULL', false); + test_to_equal_fail('timestamp with local time zone', 'NULL', 'NULL', false); + test_to_equal_fail('timestamp with time zone', 'NULL', 'NULL', false); + test_to_equal_fail('varchar2(4000)', 'NULL', 'NULL', false); + test_to_equal_fail('interval day to second', 'NULL', 'NULL', false); + test_to_equal_fail('interval year to month', 'NULL', 'NULL', false); + end; + + procedure failure_on_both_null_with_conf is + begin + ut3_tester_helper.main_helper.nulls_are_equal(false); + test_to_equal_fail('blob', 'NULL', 'NULL'); + test_to_equal_fail('boolean', 'NULL', 'NULL'); + test_to_equal_fail('clob', 'NULL', 'NULL'); + test_to_equal_fail('date', 'NULL', 'NULL'); + test_to_equal_fail('number', 'NULL', 'NULL'); + test_to_equal_fail('timestamp', 'NULL', 'NULL'); + test_to_equal_fail('timestamp with local time zone', 'NULL', 'NULL'); + test_to_equal_fail('timestamp with time zone', 'NULL', 'NULL'); + test_to_equal_fail('varchar2(4000)', 'NULL', 'NULL'); + test_to_equal_fail('interval day to second', 'NULL', 'NULL'); + test_to_equal_fail('interval year to month', 'NULL', 'NULL'); + end; + + procedure success_on_equal_data is + begin + test_to_equal_success('blob', 'to_blob(''Abc'')', 'to_blob(''abc'')'); + test_to_equal_success('boolean', 'true', 'true'); + test_to_equal_success('clob', '''Abc''', '''Abc'''); + test_to_equal_success('date', 'sysdate', 'sysdate'); + test_to_equal_success('number', '12345', '12345'); + test_to_equal_success('timestamp(9)', 'to_Timestamp(''2016 123456789'',''yyyy ff'')', 'to_Timestamp(''2016 123456789'',''yyyy ff'')'); + test_to_equal_success('timestamp(9) with local time zone', 'to_Timestamp(''2016 123456789'',''yyyy ff'')', 'to_Timestamp(''2016 123456789'',''yyyy ff'')'); + test_to_equal_success('timestamp(9) with time zone', 'to_Timestamp(''2016 123456789'',''yyyy ff'')', 'to_Timestamp(''2016 123456789'',''yyyy ff'')'); + test_to_equal_success('varchar2(4000)', '''Abc''', '''Abc'''); + test_to_equal_success('interval day to second', '''2 01:00:00''', '''2 01:00:00'''); + test_to_equal_success('interval year to month', '''1-1''', '''1-1'''); + end; + + procedure success_on_both_null is + begin + test_to_equal_success('blob', 'NULL', 'NULL'); + test_to_equal_success('boolean', 'NULL', 'NULL'); + test_to_equal_success('clob', 'NULL', 'NULL'); + test_to_equal_success('date', 'NULL', 'NULL'); + test_to_equal_success('number', 'NULL', 'NULL'); + test_to_equal_success('timestamp', 'NULL', 'NULL'); + test_to_equal_success('timestamp with local time zone', 'NULL', 'NULL'); + test_to_equal_success('timestamp with time zone', 'NULL', 'NULL'); + test_to_equal_success('varchar2(4000)', 'NULL', 'NULL'); + test_to_equal_success('interval day to second', 'NULL', 'NULL'); + test_to_equal_success('interval year to month', 'NULL', 'NULL'); + end; + + procedure success_on_both_null_with_parm is + begin + ut3_tester_helper.main_helper.nulls_are_equal(false); + test_to_equal_success('blob', 'NULL', 'NULL', true); + test_to_equal_success('boolean', 'NULL', 'NULL', true); + test_to_equal_success('clob', 'NULL', 'NULL', true); + test_to_equal_success('date', 'NULL', 'NULL', true); + test_to_equal_success('number', 'NULL', 'NULL', true); + test_to_equal_success('timestamp', 'NULL', 'NULL', true); + test_to_equal_success('timestamp with local time zone', 'NULL', 'NULL', true); + test_to_equal_success('timestamp with time zone', 'NULL', 'NULL', true); + test_to_equal_success('varchar2(4000)', 'NULL', 'NULL', true); + test_to_equal_success('interval day to second', 'NULL', 'NULL', true); + test_to_equal_success('interval year to month', 'NULL', 'NULL', true); + end; + +end; +/ diff --git a/test/ut3_user/expectations/binary/test_equal.pks b/test/ut3_user/expectations/binary/test_equal.pks new file mode 100644 index 000000000..923d43a31 --- /dev/null +++ b/test/ut3_user/expectations/binary/test_equal.pks @@ -0,0 +1,38 @@ +create or replace package test_equal is + + --%suite((not)to_be_equal) + --%suitepath(utplsql.test_user.expectations.binary) + + procedure reset_nulls_equal; + + --%aftereach + procedure cleanup_expectations; + + --%test(Gives failure for different data types) + procedure equal_fail_on_type_diff; + --%test(Negated - gives failure for different data types) + procedure not_equal_fail_on_type_diff; + --%test(Gives failure for different data values) + procedure failure_on_data_diff; + --%test(Gives failure when actual is null) + procedure failure_on_actual_null; + --%test(Gives failure when expected is null) + procedure failure_on_expected_null; + --%test(Gives failure when both values are null and argument nulls_are_equal is false) + procedure failure_on_both_null_with_parm; + + --%test(Gives failure when both values are null and configuration nulls_are_equal is false) + --%aftertest(reset_nulls_equal) + procedure failure_on_both_null_with_conf; + + --%test(Gives success for equal values) + procedure success_on_equal_data; + --%test(Gives success when both values are null) + procedure success_on_both_null; + + --%test(Gives success when both values are null and argument nulls_are_equal is true) + --%aftertest(reset_nulls_equal) + procedure success_on_both_null_with_parm; + +end; +/ diff --git a/test/ut3_user/expectations/binary/test_expect_to_be_less_than.pkb b/test/ut3_user/expectations/binary/test_expect_to_be_less_than.pkb new file mode 100644 index 000000000..4212e4822 --- /dev/null +++ b/test/ut3_user/expectations/binary/test_expect_to_be_less_than.pkb @@ -0,0 +1,263 @@ +create or replace package body test_expect_to_be_less_than is + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + function to_be_less_than_block( + a_data_type varchar2, + a_actual varchar2, + a_expected varchar2 + ) return varchar2 is + begin + return ut3_tester_helper.expectations_helper.binary_expectation_block( + 'to_be_less_than', a_data_type, a_actual, a_data_type, a_expected + ); + end; + + function not_to_be_less_than_block( + a_data_type varchar2, + a_actual varchar2, + a_expected varchar2 + ) return varchar2 is + begin + return ut3_tester_helper.expectations_helper.binary_expectation_block( + 'not_to_be_less_than', a_data_type, a_actual, a_data_type, a_expected + ); + end; + + procedure actual_date_greater is + begin + --Act + execute immediate to_be_less_than_block('date', 'sysdate', 'sysdate-1'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_number_greater is + begin + --Act + execute immediate to_be_less_than_block('number', '2.0', '1.99'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_interval_ym_greater is + begin + --Act + execute immediate to_be_less_than_block('interval year to month', '''2-1''', '''2-0'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_interval_ds_greater is + begin + --Act + execute immediate to_be_less_than_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_timestamp_greater is + begin + --Act + execute immediate to_be_less_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_timestamp_tz_greater is + begin + --Act + execute immediate to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_timestamp_ltz_greater is + begin + --Act + execute immediate to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_date_equal is + begin + --Act + execute immediate to_be_less_than_block('date', 'sysdate', 'sysdate'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_number_equal is + begin + --Act + execute immediate to_be_less_than_block('number', '2.0', '2.00'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_interval_ym_equal is + begin + --Act + execute immediate to_be_less_than_block('interval year to month', '''2-1''', '''2-1'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_interval_ds_equal is + begin + --Act + execute immediate to_be_less_than_block('interval day to second', '''2 01:00:00''', '''2 01:00:00'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_timestamp_equal is + begin + --Act + execute immediate to_be_less_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_timestamp_tz_equal is + begin + --Act + execute immediate to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_timestamp_ltz_equal is + begin + --Act + execute immediate to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure actual_date_less is + begin + --Act + execute immediate to_be_less_than_block('date', 'sysdate-1', 'sysdate'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure actual_number_less is + begin + --Act + execute immediate to_be_less_than_block('number', '1.0', '1.01'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure actual_interval_ym_less is + begin + --Act + execute immediate to_be_less_than_block('interval year to month', '''2-1''', '''2-2'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure actual_interval_ds_less is + begin + --Act + execute immediate to_be_less_than_block('interval day to second', '''2 00:59:58''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure actual_timestamp_less is + begin + --Act + execute immediate to_be_less_than_block('timestamp', 'to_timestamp(''1997 12'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure actual_timestamp_tz_less is + begin + --Act + execute immediate to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure actual_timestamp_ltz_less is + begin + --Act + execute immediate to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure not_actual_date_greater is + begin + --Act + execute immediate not_to_be_less_than_block('date', 'sysdate', 'sysdate-1'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure not_actual_number_greater is + begin + --Act + execute immediate not_to_be_less_than_block('number', '2.0', '1.99'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure not_actual_interval_ym_greater is + begin + --Act + execute immediate not_to_be_less_than_block('interval year to month', '''2-1''', '''2-0'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure not_actual_interval_ds_greater is + begin + --Act + execute immediate not_to_be_less_than_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure not_actual_timestamp_greater is + begin + --Act + execute immediate not_to_be_less_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure not_actual_timestamp_tz_gretr is + begin + --Act + execute immediate not_to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure not_actual_timestamp_ltz_gretr is + begin + --Act + execute immediate not_to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure actual_clob is + begin + --Act + ut3.ut.expect(to_clob('3')).to_( ut3.be_less_than(4) ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + +end; +/ diff --git a/test/ut3_user/expectations/binary/test_expect_to_be_less_than.pks b/test/ut3_user/expectations/binary/test_expect_to_be_less_than.pks new file mode 100644 index 000000000..c03f0d28e --- /dev/null +++ b/test/ut3_user/expectations/binary/test_expect_to_be_less_than.pks @@ -0,0 +1,97 @@ +create or replace package test_expect_to_be_less_than is + + --%suite((not)to_be_less_than) + --%suitepath(utplsql.test_user.expectations.binary) + + --%aftereach + procedure cleanup_expectations; + + --%test(Gives failure when actual date is greater than expected) + procedure actual_date_greater; + + --%test(Gives failure when actual number is greater than expected) + procedure actual_number_greater; + + --%test(Gives failure when actual interval year to month is greater than expected) + procedure actual_interval_ym_greater; + + --%test(Gives failure when actual interval day to second is greater than expected) + procedure actual_interval_ds_greater; + + --%test(Gives failure when actual timestamp is greater than expected) + procedure actual_timestamp_greater; + + --%test(Gives failure when actual timestamp with time zone is greater than expected) + procedure actual_timestamp_tz_greater; + + --%test(Gives failure when actual timestamp with local time zone is greater than expected) + procedure actual_timestamp_ltz_greater; + + --%test(Gives failure when actual date is equal expected) + procedure actual_date_equal; + + --%test(Gives failure when actual number is equal expected) + procedure actual_number_equal; + + --%test(Gives failure when actual interval year to month is equal expected) + procedure actual_interval_ym_equal; + + --%test(Gives failure when actual interval day to second is equal expected) + procedure actual_interval_ds_equal; + + --%test(Gives failure when actual timestamp is equal expected) + procedure actual_timestamp_equal; + + --%test(Gives failure when actual timestamp with time zone is equal expected) + procedure actual_timestamp_tz_equal; + + --%test(Gives failure when actual timestamp with local time zone is equal expected) + procedure actual_timestamp_ltz_equal; + + --%test(Gives success when actual date is less than expected) + procedure actual_date_less; + + --%test(Gives success when actual number is less than expected) + procedure actual_number_less; + + --%test(Gives success when actual interval year to month is less than expected) + procedure actual_interval_ym_less; + + --%test(Gives success when actual interval day to second is less than expected) + procedure actual_interval_ds_less; + + --%test(Gives success when actual timestamp is less than expected) + procedure actual_timestamp_less; + + --%test(Gives success when actual timestamp with time zone is less than expected) + procedure actual_timestamp_tz_less; + + --%test(Gives success when actual timestamp with local time zone is less than expected) + procedure actual_timestamp_ltz_less; + + --%test(Negated - Gives success when actual date is greater than expected) + procedure not_actual_date_greater; + + --%test(Negated - Gives success when actual number is greater than expected) + procedure not_actual_number_greater; + + --%test(Negated - Gives success when actual interval year to month is greater than expected) + procedure not_actual_interval_ym_greater; + + --%test(Negated - Gives success when actual interval day to second is greater than expected) + procedure not_actual_interval_ds_greater; + + --%test(Negated - Gives success when actual timestamp is greater than expected) + procedure not_actual_timestamp_greater; + + --%test(Negated - Gives success when actual timestamp with time zone is greater than expected) + procedure not_actual_timestamp_tz_gretr; + + --%test(Negated - Gives success when actual timestamp with local time zone is greater than expected) + procedure not_actual_timestamp_ltz_gretr; + + --%test(Gives failure when running against CLOB) + procedure actual_clob; + +end; +/ diff --git a/test/ut3_user/expectations/test_expectation_anydata.pkb b/test/ut3_user/expectations/test_expectation_anydata.pkb new file mode 100644 index 000000000..21445cb3b --- /dev/null +++ b/test/ut3_user/expectations/test_expectation_anydata.pkb @@ -0,0 +1,974 @@ +create or replace package body test_expectation_anydata is + + g_test_expected anydata; + g_test_actual anydata; + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + procedure cleanup is + begin + g_test_expected := null; + g_test_actual := null; + cleanup_expectations(); + end; + + procedure fail_on_different_type_null is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + g_test_expected := anydata.convertObject( cast(null as ut3_tester_helper.test_dummy_object) ); + g_test_actual := anydata.convertObject( cast(null as ut3_tester_helper.other_dummy_object) ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + l_expected_message := q'[%Actual (ut3_tester_helper.other_dummy_object) cannot be compared to Expected (ut3_tester_helper.test_dummy_object) using matcher 'equal'.]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure fail_on_different_type is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.other_dummy_object(1, 'A', '0') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + l_expected_message := q'[%Actual (ut3_tester_helper.other_dummy_object) cannot be compared to Expected (ut3_tester_helper.test_dummy_object) using matcher 'equal'.]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure fail_on_different_object_data is + begin + --Arrange + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, null, '0') ); + --Act + ut3.ut.expect( g_test_actual ).not_to_equal( g_test_expected ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure fail_on_one_object_null is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + g_test_actual := anydata.convertObject( cast(null as ut3_tester_helper.test_dummy_object) ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + l_expected_message := q'[%Actual: ut3_tester_helper.test_dummy_object was expected to equal: ut3_tester_helper.test_dummy_object +%Diff: +%Rows: [ 1 differences ] +%Row No. 1 - Missing: 1A0]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + + end; + + procedure fail_on_collection_vs_object is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list(ut3_tester_helper.test_dummy_object(1, 'A', '0')) ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + l_expected_message := q'[%Actual (ut3_tester_helper.test_dummy_object_list) cannot be compared to Expected (ut3_tester_helper.test_dummy_object) using matcher 'equal'.]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure fail_on_null_vs_empty_coll is + l_null_list ut3_tester_helper.test_dummy_object_list; + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list() ); + g_test_actual := anydata.convertCollection( l_null_list ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + l_expected_message := q'[%Actual: ut3_tester_helper.test_dummy_object_list [ count = ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 0 ] +%Diff: +%Rows: [ all different ] +%All rows are different as the columns position is not matching.]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + + end; + + procedure fail_on_one_collection_null is + l_null_list ut3_tester_helper.test_dummy_object_list; + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list(ut3_tester_helper.test_dummy_object(1, 'A', '0')) ); + g_test_actual := anydata.convertCollection( l_null_list ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + l_expected_message := q'[%Actual: ut3_tester_helper.test_dummy_object_list [ count = ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 1 ] +%Diff: +%Rows: [ 1 differences ] +%Row No. 1 - Missing: 1A0]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure fail_on_one_collection_empty is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list(ut3_tester_helper.test_dummy_object(1, 'A', '0')) ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list() ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + l_expected_message := q'[%Actual: ut3_tester_helper.test_dummy_object_list [ count = 0 ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 1 ] +%Diff: +%Rows: [ 1 differences ] +%Row No. 1 - Missing: 1A0]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + + end; + + procedure fail_on_different_coll_data is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + l_obj ut3_tester_helper.test_dummy_object := ut3_tester_helper.test_dummy_object(1, 'A', '0'); + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list(l_obj) ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list(l_obj, l_obj) ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + l_expected_message := q'[%Actual: ut3_tester_helper.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 1 ] +%Diff: +%Rows: [ 1 differences ] +%Row No. 2 - Extra: 1A0]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + --%test(Gives success when both anydata are NULL) + procedure success_on_both_anydata_null is + --Arrange + l_null_anydata anydata; + begin + --Act + ut3.ut.expect( l_null_anydata ).to_equal( l_null_anydata ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure success_on_both_object_null is + --Arrange + l_null_object ut3_tester_helper.test_dummy_object; + l_anydata anydata := anydata.convertObject(l_null_object); + begin + --Act + ut3.ut.expect( l_anydata ).to_equal( l_anydata ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure success_on_both_coll_null is + --Arrange + l_null_collection ut3_tester_helper.test_dummy_object_list; + l_anydata anydata := anydata.convertCollection(l_null_collection); + begin + --Act + ut3.ut.expect( l_anydata ).to_equal( l_anydata ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure success_on_same_coll_data is + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list(ut3_tester_helper.test_dummy_object(1, 'A', '0')) ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list(ut3_tester_helper.test_dummy_object(1, 'A', '0')) ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure fail_on_coll_different_order is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + l_first_obj ut3_tester_helper.test_dummy_object := ut3_tester_helper.test_dummy_object(1, 'A', '0'); + l_second_obj ut3_tester_helper.test_dummy_object := ut3_tester_helper.test_dummy_object(2, 'b', '1'); + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list(l_first_obj, l_second_obj) ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list(l_second_obj, l_first_obj) ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + end; + + procedure success_on_same_object_data is + begin + --Arrange + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure exclude_attributes_as_list is + l_list ut3.ut_varchar2_list; + begin + --Arrange + l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','/TEST_DUMMY_OBJECT/ID'); + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>3, "name"=>'A',"Value"=>'1') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_list ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure exclude_attributes_as_csv is + l_list varchar2(100); + begin + --Arrange + l_list := 'TEST_DUMMY_OBJECT/Value,TEST_DUMMY_OBJECT/ID'; + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>2, "name"=>'A',"Value"=>'1') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_list ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure exclude_attributes_xpath is + l_xpath varchar2(100); + begin + --Arrange + l_xpath := '//TEST_DUMMY_OBJECT/Value|//TEST_DUMMY_OBJECT/ID'; + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>2, "name"=>'A',"Value"=>'1') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_xpath ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure exclude_ignores_invalid_attrib is + l_exclude varchar2(100); + begin + --Arrange + l_exclude := 'BadAttributeName'; + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_exclude ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure include_attributes_as_list is + l_list ut3.ut_varchar2_list; + begin + --Arrange + l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','TEST_DUMMY_OBJECT/ID'); + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'b',"Value"=>'0') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_list ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure include_attributes_as_csv is + l_xpath varchar2(100); + begin + --Arrange + l_xpath := 'TEST_DUMMY_OBJECT/key,TEST_DUMMY_OBJECT/ID'; + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_xpath ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure include_attributes_xpath is + l_xpath varchar2(100); + begin + --Arrange + l_xpath := '//TEST_DUMMY_OBJECT/key|//TEST_DUMMY_OBJECT/ID'; + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_xpath ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure include_ignores_invalid_attrib is + l_include varchar2(100); + begin + --Arrange + l_include := ' BadAttributeName, TEST_DUMMY_OBJECT/ID '; + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'B',"Value"=>'0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_include ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure include_exclude_attributes_csv is + l_exclude varchar2(100); + l_include varchar2(100); + begin + --Arrange + l_include := 'TEST_DUMMY_OBJECT/key,TEST_DUMMY_OBJECT/ID,TEST_DUMMY_OBJECT/Value'; + l_exclude := '//TEST_DUMMY_OBJECT/key|//TEST_DUMMY_OBJECT/Value'; + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'B',"Value"=>'0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).exclude( l_exclude ).include( l_include ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure include_exclude_attrib_list is + l_exclude ut3.ut_varchar2_list; + l_include ut3.ut_varchar2_list; + l_expected varchar2(32767); + l_actual varchar2(32767); + begin + --Arrange + l_include := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/key','TEST_DUMMY_OBJECT/ID','TEST_DUMMY_OBJECT/Value'); + l_exclude := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/key','TEST_DUMMY_OBJECT/Value'); + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'B',"Value"=>'0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).exclude( l_exclude ).include( l_include ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure reports_diff_attribute is + l_expected varchar2(32767); + l_actual varchar2(32767); + begin + --Arrange + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, NULL, '0') ); + l_expected := q'[Actual: ut3_tester_helper.test_dummy_object was expected to equal: ut3_tester_helper.test_dummy_object +Diff: +Rows: [ 1 differences ] + Row No. 1 - Actual: + Row No. 1 - Expected: A]'; + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + l_actual := ut3_tester_helper.main_helper.get_failed_expectations(1); + ut.expect(l_actual).to_be_like(l_expected); + end; + + + procedure reports_diff_structure is + l_obj ut3_tester_helper.test_dummy_object := ut3_tester_helper.test_dummy_object(1, 'A', '0'); + l_expected varchar2(32767); + l_actual varchar2(32767); + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list(l_obj) ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list(l_obj, l_obj) ); + l_expected := q'[Actual: ut3_tester_helper.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 1 ] +Diff: +Rows: [ 1 differences ] + Row No. 2 - Extra: 1A0]'; + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + --Assert + l_actual := ut3_tester_helper.main_helper.get_failed_expectations(1); + ut.expect(l_actual).to_be_like(l_expected); + end; + + function get_anydata return anydata is + begin + return anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'B', '0') ); + end; + + procedure deprec_to_equal_excl_varch is + begin + --Act + ut3.ut.expect(get_anydata()).to_equal(get_anydata(), a_exclude => 'A_COLUMN,Some_Col'); + --Assert + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + end; + + procedure deprec_to_equal_excl_list is + begin + --Act + ut3.ut.expect(get_anydata()).to_equal(get_anydata(), a_exclude => ut3.ut_varchar2_list('A_COLUMN','Some_Col')); + --Assert + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + end; + + procedure deprec_not_to_equal_excl_varch is + begin + --Act + ut3.ut.expect(get_anydata()).not_to_equal(get_anydata(), a_exclude => 'A_COLUMN,Some_Col'); + --Assert + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + end; + + procedure deprec_not_to_equal_excl_list is + begin + --Act + ut3.ut.expect(get_anydata()).not_to_equal(get_anydata(), a_exclude => ut3.ut_varchar2_list('A_COLUMN','Some_Col')); + --Assert + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + end; + + procedure deprec_equal_excl_varch is + begin + --Act + ut3.ut.expect(get_anydata()).to_(ut3.equal(get_anydata(), a_exclude => 'A_COLUMN,Some_Col')); + --Assert + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + end; + + procedure deprec_equal_excl_list is + begin + --Act + ut3.ut.expect(get_anydata()).to_(ut3.equal(get_anydata(), a_exclude => ut3.ut_varchar2_list('A_COLUMN','Some_Col'))); + --Assert + ut.expect(cardinality(ut3_tester_helper.main_helper.get_warnings())).to_equal(1); + ut.expect(ut3_tester_helper.main_helper.get_warnings()(1)).to_be_like('The syntax: "%" is deprecated.%'); + end; + + procedure data_diff_on_atr_data_mismatch is + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_actual + from dual connect by level <=2; + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=2 + order by rownum desc; + --Act + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + l_expected_message := q'[Actual: ut3_tester_helper.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 2 ] +Diff: +Rows: [ 2 differences ] + Row No. 1 - Actual: 1Something 11 + Row No. 1 - Expected: 2Something 22 + Row No. 2 - Actual: 2Something 22 + Row No. 2 - Expected: 1Something 11]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure data_diff_on_20_rows_only is + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + select ut3_tester_helper.test_dummy_object( rn, 'Something '||rn, rn1) + bulk collect into l_actual + from (select rownum * case when mod(rownum,2) = 0 then -1 else 1 end rn, + rownum * case when mod(rownum,4) = 0 then -1 else 1 end rn1 + from dual connect by level <=100); + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=110; + --Act + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + l_expected_message := q'[Actual: ut3_tester_helper.test_dummy_object_list [ count = 100 ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 110 ] +Diff: +Rows: [ 60 differences, showing first 20 ] + Row No. 2 - Actual: -2Something -2 + Row No. 2 - Expected: 2Something 2 + Row No. 4 - Actual: -4Something -4-4 + Row No. 4 - Expected: 4Something 44 + % + Row No. 38 - Actual: -38Something -38 + Row No. 38 - Expected: 38Something 38 + Row No. 40 - Actual: -40Something -40-40 + Row No. 40 - Expected: 40Something 4040]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure collection_include_list is + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + l_list ut3.ut_varchar2_list; + begin + l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','TEST_DUMMY_OBJECT/ID'); + --Arrange + select ut3_tester_helper.test_dummy_object( rownum, 'SomethingsDifferent '||rownum, rownum) + bulk collect into l_actual + from dual connect by level <=2; + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=2; + --Act + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).include( l_list ); + + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure collection_exclude_list is + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + l_list ut3.ut_varchar2_list; + begin + l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','TEST_DUMMY_OBJECT/ID'); + --Arrange + select ut3_tester_helper.test_dummy_object( rownum*2, 'Something '||rownum, rownum*2) + bulk collect into l_actual + from dual connect by level <=2; + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=2; + --Act + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).exclude( l_list ); + + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure collection_include_list_fail is + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + l_list ut3.ut_varchar2_list; + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/name'); + --Arrange + select ut3_tester_helper.test_dummy_object( rownum, 'SomethingsDifferent '||rownum, rownum) + bulk collect into l_actual + from dual connect by level <=2; + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=2; + --Act + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).include( l_list ); + + l_expected_message := q'[%Actual: ut3_tester_helper.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 2 ] +%Diff: +%Rows: [ 2 differences ] +%All rows are different as the columns are not matching.]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure array_same_data is + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.t_tab_varchar('A') ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.t_tab_varchar('A') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure array_diff_data is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.t_tab_varchar('A') ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.t_tab_varchar('B') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + l_expected_message := q'[%Actual: ut3_tester_helper.t_tab_varchar [ count = 1 ] was expected to equal: ut3_tester_helper.t_tab_varchar [ count = 1 ] +%Diff: +%Rows: [ 1 differences ] +%Row No. 1 - Actual: B +%Row No. 1 - Expected: A]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure array_is_null is + l_is_null ut3_tester_helper.t_tab_varchar ; + begin + ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_be_null; + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure array_null_equal_array_null is + l_is_null ut3_tester_helper.t_tab_varchar ; + l_is_null_bis ut3_tester_helper.t_tab_varchar ; + begin + ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_equal(anydata.convertCollection( l_is_null_bis )); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure array_null_equal_array_notnull is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + l_is_null ut3_tester_helper.t_tab_varchar ; + begin + --Arrange + g_test_expected := anydata.convertCollection( l_is_null ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.t_tab_varchar('A') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + l_expected_message := q'[%Actual: ut3_tester_helper.t_tab_varchar [ count = 1 ] was expected to equal: ut3_tester_helper.t_tab_varchar [ count = ] +%Diff: +%Rows: [ 1 differences ] +%Row No. 1 - Extra: A]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure empty_array_have_zero_elem is + begin + ut3.ut.expect( anydata.convertCollection(ut3_tester_helper.t_tab_varchar())).to_have_count(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure array_empty_equal_array_empty is + begin + --Arrange + g_test_expected := anydata.convertCollection(ut3_tester_helper.t_tab_varchar()); + g_test_actual := anydata.convertCollection(ut3_tester_helper.t_tab_varchar()); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure arr_empty_equal_arr_notempty is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + l_is_null ut3_tester_helper.t_tab_varchar ; + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.t_tab_varchar() ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.t_tab_varchar('A') ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + l_expected_message := q'[%Actual: ut3_tester_helper.t_tab_varchar [ count = 1 ] was expected to equal: ut3_tester_helper.t_tab_varchar [ count = 0 ] +%Diff: +%Rows: [ 1 differences ] +%Row No. 1 - Extra: A]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure collection_is_null is + l_null_list ut3_tester_helper.test_dummy_object_list; + begin + --Arrange + g_test_actual := anydata.convertCollection( l_null_list ); + --Act + ut3.ut.expect( g_test_actual ).to_be_null; + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure collection_is_empty is + begin + --Arrange + g_test_actual := anydata.convertCollection( ut3_tester_helper.test_dummy_object_list() ); + --Act + ut3.ut.expect( g_test_actual ).to_have_count(0); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + + end; + + procedure varray_same_data is + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.t_varray(1) ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.t_varray(1) ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure varray_diff_data is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.t_varray(1) ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.t_varray(2) ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + l_expected_message := q'[%Actual: ut3_tester_helper.t_varray [ count = 1 ] was expected to equal: ut3_tester_helper.t_varray [ count = 1 ] +%Diff: +%Rows: [ 1 differences ] +%Row No. 1 - Actual: 2 +%Row No. 1 - Expected: 1]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure varray_is_null is + l_is_null ut3_tester_helper.t_varray ; + begin + ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_be_null; + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure varray_null_equal_varray_null is + l_is_null ut3_tester_helper.t_varray ; + l_is_null_bis ut3_tester_helper.t_varray ; + begin + ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_equal(anydata.convertCollection( l_is_null_bis )); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure varr_null_equal_varr_notnull is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + l_is_null ut3_tester_helper.t_varray ; + begin + --Arrange + g_test_expected := anydata.convertCollection( l_is_null ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.t_varray(1) ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + l_expected_message := q'[%Actual: ut3_tester_helper.t_varray [ count = 1 ] was expected to equal: ut3_tester_helper.t_varray [ count = ] +%Diff: +%Rows: [ 1 differences ] +%Row No. 1 - Extra: 1]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure empty_varray_have_zero_elem is + begin + ut3.ut.expect( anydata.convertCollection(ut3_tester_helper.t_varray())).to_have_count(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure varr_empty_equal_varr_empty is + begin + --Arrange + g_test_expected := anydata.convertCollection(ut3_tester_helper.t_varray()); + g_test_actual := anydata.convertCollection(ut3_tester_helper.t_varray()); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure varr_empty_equal_varr_notempty is + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + l_is_null ut3_tester_helper.t_varray ; + begin + --Arrange + g_test_expected := anydata.convertCollection( ut3_tester_helper.t_varray() ); + g_test_actual := anydata.convertCollection( ut3_tester_helper.t_varray(1) ); + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); + l_expected_message := q'[%Actual: ut3_tester_helper.t_varray [ count = 1 ] was expected to equal: ut3_tester_helper.t_varray [ count = 0 ] +%Diff: +%Rows: [ 1 differences ] +%Row No. 1 - Extra: 1]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure collection_join_by is + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_actual + from dual connect by level <=2; + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=2 + order by rownum desc; + --Act + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).join_by('TEST_DUMMY_OBJECT/ID'); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure collection_join_by_fail is + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_actual + from dual connect by level <=2; + select ut3_tester_helper.test_dummy_object( rownum * 2, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=2 + order by rownum desc; + --Act + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).join_by('TEST_DUMMY_OBJECT/ID'); + l_expected_message := q'[%Actual: ut3_tester_helper.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 2 ] +%Diff: +%Rows: [ 3 differences ] +%PK 2 - Actual: Something 2 +%PK 2 - Actual: 2 +%PK 2 - Expected: Something 1 +%PK 2 - Expected: 1 +%PK 1 - Extra: 1Something 11 +%PK 4 - Missing: 4Something 22]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure collection_unordered is + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + begin + --Arrange + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_actual + from dual connect by level <=3; + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=3 + order by rownum desc; + --Act + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).unordered; + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure collection_unordered_fail is + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_actual + from dual connect by level <=2; + select ut3_tester_helper.test_dummy_object( rownum * 2, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=2 + order by rownum desc; + + l_expected_message := q'[%Actual: ut3_tester_helper.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 2 ] +%Diff: +%Rows: [ 4 differences ] +%Extra: 1Something 11 +%Extra: 2Something 22 +%Missing: 4Something 22 +%Missing: 2Something 11]'; + + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).unordered; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure object_join_by is + begin + --Arrange + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + + --Act + ut3.ut.expect(g_test_actual).to_equal(g_test_expected).join_by('TEST_DUMMY_OBJECT/ID'); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure object_unordered is + begin + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + + --Act + ut3.ut.expect(g_test_actual).to_equal(g_test_expected).unordered; + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure collection_to_contain is + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + begin + --Arrange + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_actual + from dual connect by level <=4; + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=2 + order by rownum desc; + --Act + ut3.ut.expect(anydata.convertCollection(l_actual)).to_contain(anydata.convertCollection(l_expected)); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + + procedure object_to_contain is + begin + --Arrange + g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); + + --Act + ut3.ut.expect(g_test_actual).to_contain(g_test_expected); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + end; + +end; +/ \ No newline at end of file diff --git a/test/ut3_user/expectations/test_expectation_anydata.pks b/test/ut3_user/expectations/test_expectation_anydata.pks new file mode 100644 index 000000000..dd414a5c2 --- /dev/null +++ b/test/ut3_user/expectations/test_expectation_anydata.pks @@ -0,0 +1,202 @@ +create or replace package test_expectation_anydata is + + --%suite(equal on anydata) + --%suitepath(utplsql.test_user.expectations) + + --%aftereach + procedure cleanup; + + --%test(Gives failure when comparing NULL objects of different type) + procedure fail_on_different_type_null; + + --%test(Gives failure when comparing objects of different type) + procedure fail_on_different_type; + + --%test(Gives failure when objects holds different data) + procedure fail_on_different_object_data; + + --%test(Gives failure when one of objects is NULL) + procedure fail_on_one_object_null; + + --%test(Gives failure when comparing object to collection) + procedure fail_on_collection_vs_object; + + --%test(Gives failure when comparing empty collection to NULL collection) + procedure fail_on_null_vs_empty_coll; + + --%test(Gives failure when one of collections is NULL) + procedure fail_on_one_collection_null; + + --%test(Gives failure when one of collections is empty) + procedure fail_on_one_collection_empty; + + --%test(Gives failure when collections holds different data) + procedure fail_on_different_coll_data; + + --%test(Gives success when both anydata are NULL) + procedure success_on_both_anydata_null; + + --%test(Gives success when both objects are null) + procedure success_on_both_object_null; + + --%test(Gives success when both collections are null) + procedure success_on_both_coll_null; + + --%test(Gives success when both collections are of same type contain identical data) + procedure success_on_same_coll_data; + + --%test(Gives failure when both collections contain the same data in different order) + procedure fail_on_coll_different_order; + + --%test(Gives success when both objects are of same type and hold the same data) + procedure success_on_same_object_data; + + --%test(List of attributes to exclude is case sensitive) + procedure exclude_attributes_as_list; + + --%test(Comma separated list of attributes to exclude is case sensitive) + procedure exclude_attributes_as_csv; + + --%test(Exclude attributes by XPath is case sensitive) + procedure exclude_attributes_xpath; + + --%test(Excludes existing attributes when some of attributes on exclude are not valid column names) + procedure exclude_ignores_invalid_attrib; + + --%test(List of attributes to include is case sensitive) + procedure include_attributes_as_list; + + --%test(Comma separated list of attributes to include is case sensitive) + procedure include_attributes_as_csv; + + --%test(Include attributes by XPath is case sensitive) + procedure include_attributes_xpath; + + --%test(Includes existing attributes when some of attributes on exclude are not valid column names) + procedure include_ignores_invalid_attrib; + + --%test(Includes only attributes that are not excluded) + procedure include_exclude_attributes_csv; + + --%test(Includes only attributes that are not on exclude list) + procedure include_exclude_attrib_list; + + --%test(Reports diff on incorrect attributes of an object type) + procedure reports_diff_attribute; + + --%test(Reports diff on incorrect rows and attributes of a collection type) + procedure reports_diff_structure; + + --%test(Adds a warning when using depreciated syntax to_equal( a_expected anydata, a_exclude varchar2 )) + procedure deprec_to_equal_excl_varch; + + --%test(Adds a warning when using depreciated syntax to_equal( a_expected anydata, a_exclude ut_varchar2_list )) + procedure deprec_to_equal_excl_list; + + --%test(Adds a warning when using depreciated syntax not_to_equal( a_expected anydata, a_exclude varchar2 )) + procedure deprec_not_to_equal_excl_varch; + + --%test(Adds a warning when using depreciated syntax not_to_equal( a_expected anydata, a_exclude ut_varchar2_list )) + procedure deprec_not_to_equal_excl_list; + + --%test(Adds a warning when using depreciated syntax to_( equal( a_expected anydata, a_exclude varchar2 ) )) + procedure deprec_equal_excl_varch; + + --%test(Adds a warning when using depreciated syntax to_( equal( a_expected anydata, a_exclude ut_varchar2_list )) ) + procedure deprec_equal_excl_list; + + --%test(Reports only mismatched attributes on row data mismatch) + procedure data_diff_on_atr_data_mismatch; + + --%test(Reports only first 20 rows of diff and gives a full diff count) + procedure data_diff_on_20_rows_only; + + --%test(Validate include list on collections of objects) + procedure collection_include_list; + + --%test(Validate exclude list on collections of objects) + procedure collection_exclude_list; + + --%test(Validate include list on collections of objects fail) + procedure collection_include_list_fail; + + --%test(Two ARRAYS with same data) + procedure array_same_data; + + --%test(Two ARRAYS with different data) + procedure array_diff_data; + + --%test(ARRAY is atomically null) + procedure array_is_null; + + --%test(Compare two null ARRAYs) + procedure array_null_equal_array_null; + + --%test(Compare null ARRAY to ARRAY with data) + procedure array_null_equal_array_notnull; + + --%test(Empty ARRAY have count of 0) + procedure empty_array_have_zero_elem; + + --%test(Compare two empty ARRAYs) + procedure array_empty_equal_array_empty; + + --%test(Compare empty ARRAY to ARRAY with data) + procedure arr_empty_equal_arr_notempty; + + --%test(Collection is atomically NULL) + procedure collection_is_null; + + --%test(Collection is empty) + procedure collection_is_empty; + + --%test(Two VARRAYS with same data) + procedure varray_same_data; + + --%test(Two VARRAYS with different data) + procedure varray_diff_data; + + --%test(VARRAY is atomically null) + procedure varray_is_null; + + --%test(Compare two null VARRAYs) + procedure varray_null_equal_varray_null; + + --%test(Compare null VARRAY to VARRAY with data) + procedure varr_null_equal_varr_notnull; + + --%test(Empty VARRAY have count of 0) + procedure empty_varray_have_zero_elem; + + --%test(Compare two empty VARRAYs) + procedure varr_empty_equal_varr_empty; + + --%test(Compare empty VARRAY to VARRAY with data) + procedure varr_empty_equal_varr_notempty; + + --%test( Anydata collection using joinby ) + procedure collection_join_by; + + --%test( Anydata collection using joinby fail) + procedure collection_join_by_fail; + + --%test( Anydata collection unordered ) + procedure collection_unordered; + + --%test( Anydata collection unordered fail ) + procedure collection_unordered_fail; + + --%test( Anydata object using joinby ) + procedure object_join_by; + + --%test( Anydata object unordered ) + procedure object_unordered; + + --%test( Success when anydata collection contains data from another anydata collection) + procedure collection_to_contain; + + --%test( Success when anydata object contains data from another anydata) + procedure object_to_contain; + +end; +/ diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index e8f492674..ae37b37d3 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -1,7 +1,7 @@ create or replace package test_expectations_cursor is --%suite(cursor expectations) - --%suitepath(utplsql.core.expectations) + --%suitepath(utplsql.test_user.expectations) --%aftereach procedure cleanup_expectations; diff --git a/test/ut3_user/expectations/test_matchers.pks b/test/ut3_user/expectations/test_matchers.pks index b8fc699ee..e3e22e0cd 100644 --- a/test/ut3_user/expectations/test_matchers.pks +++ b/test/ut3_user/expectations/test_matchers.pks @@ -1,7 +1,7 @@ create or replace package test_matchers is --%suite(matchers) - --%suitepath(utplsql.core.expectations) + --%suitepath(utplsql.test_user.expectations) --%aftereach procedure cleanup_expectations; From e2561bc70599bc0fffa20480ba1aab5248b9eb7a Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 25 Mar 2019 07:32:46 +0000 Subject: [PATCH 014/181] Adding next set of tests migrated. expectations/binary/test_be_less_or_equal changing name of function to more meaningful. --- test/install_ut3_user_tests.sql | 2 + test/ut3_tester_helper/main_helper.pkb | 2 +- test/ut3_tester_helper/main_helper.pks | 2 +- .../binary/test_be_less_or_equal.pkb | 263 ++++++++++++++++++ .../binary/test_be_less_or_equal.pks | 97 +++++++ .../expectations/binary/test_equal.pkb | 6 +- .../binary/test_expect_to_be_less_than.pkb | 58 ++-- .../expectations/test_expectation_anydata.pkb | 74 ++--- .../expectations/test_expectations_cursor.pkb | 158 +++++------ test/ut3_user/expectations/test_matchers.pkb | 20 +- 10 files changed, 522 insertions(+), 160 deletions(-) create mode 100644 test/ut3_user/expectations/binary/test_be_less_or_equal.pkb create mode 100644 test/ut3_user/expectations/binary/test_be_less_or_equal.pks diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index b38375c34..aad875984 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -7,6 +7,7 @@ alter session set plsql_optimize_level=0; prompt Install user tests @@ut3_user/expectations/binary/test_equal.pks @@ut3_user/expectations/binary/test_expect_to_be_less_than.pks +@@ut3_user/expectations/binary/test_be_less_or_equal.pks @@ut3_user/expectations/test_matchers.pks @@ut3_user/expectations/test_expectation_anydata.pks @@ut3_user/expectations/test_expectations_cursor.pks @@ -14,6 +15,7 @@ prompt Install user tests @@ut3_user/expectations/binary/test_equal.pkb @@ut3_user/expectations/binary/test_expect_to_be_less_than.pkb +@@ut3_user/expectations/binary/test_be_less_or_equal.pkb @@ut3_user/expectations/test_matchers.pkb @@ut3_user/expectations/test_expectation_anydata.pkb @@ut3_user/expectations/test_expectations_cursor.pkb diff --git a/test/ut3_tester_helper/main_helper.pkb b/test/ut3_tester_helper/main_helper.pkb index 4c93720cd..1085e5c47 100644 --- a/test/ut3_tester_helper/main_helper.pkb +++ b/test/ut3_tester_helper/main_helper.pkb @@ -63,7 +63,7 @@ create or replace package body main_helper is return anydata.convertCollection(ut3.ut_expectation_processor.get_failed_expectations()); end; - function get_failed_expectations_n return number is + function get_failed_expectations_num return number is l_num_failed number; l_results ut3.ut_expectation_results := ut3.ut_expectation_processor.get_failed_expectations(); begin diff --git a/test/ut3_tester_helper/main_helper.pks b/test/ut3_tester_helper/main_helper.pks index be755fea6..8f904501f 100644 --- a/test/ut3_tester_helper/main_helper.pks +++ b/test/ut3_tester_helper/main_helper.pks @@ -15,7 +15,7 @@ create or replace package main_helper is function get_failed_expectations(a_pos in number) return varchar2; - function get_failed_expectations_n return number; + function get_failed_expectations_num return number; procedure clear_expectations; diff --git a/test/ut3_user/expectations/binary/test_be_less_or_equal.pkb b/test/ut3_user/expectations/binary/test_be_less_or_equal.pkb new file mode 100644 index 000000000..81634f7f5 --- /dev/null +++ b/test/ut3_user/expectations/binary/test_be_less_or_equal.pkb @@ -0,0 +1,263 @@ +create or replace package body test_be_less_or_equal is + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + function to_less_or_equal_block( + a_data_type varchar2, + a_actual varchar2, + a_expected varchar2 + ) return varchar2 is + begin + return ut3_tester_helper.expectations_helper.binary_expectation_block( + 'to_be_less_or_equal', a_data_type, a_actual, a_data_type, a_expected + ); + end; + + function not_to_less_or_equal_block( + a_data_type varchar2, + a_actual varchar2, + a_expected varchar2 + ) return varchar2 is + begin + return ut3_tester_helper.expectations_helper.binary_expectation_block( + 'not_to_be_less_or_equal', a_data_type, a_actual, a_data_type, a_expected + ); + end; + + procedure actual_date_greater is + begin + --Act + execute immediate to_less_or_equal_block('date', 'sysdate', 'sysdate-1'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_number_greater is + begin + --Act + execute immediate to_less_or_equal_block('number', '2.0', '1.99'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_interval_ym_greater is + begin + --Act + execute immediate to_less_or_equal_block('interval year to month', '''2-1''', '''2-0'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_interval_ds_greater is + begin + --Act + execute immediate to_less_or_equal_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_greater is + begin + --Act + execute immediate to_less_or_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_tz_greater is + begin + --Act + execute immediate to_less_or_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_ltz_greater is + begin + --Act + execute immediate to_less_or_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_date_equal is + begin + --Act + execute immediate to_less_or_equal_block('date', 'sysdate', 'sysdate'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_number_equal is + begin + --Act + execute immediate to_less_or_equal_block('number', '2.0', '2.00'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_interval_ym_equal is + begin + --Act + execute immediate to_less_or_equal_block('interval year to month', '''2-1''', '''2-1'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_interval_ds_equal is + begin + --Act + execute immediate to_less_or_equal_block('interval day to second', '''2 01:00:00''', '''2 01:00:00'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_equal is + begin + --Act + execute immediate to_less_or_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_tz_equal is + begin + --Act + execute immediate to_less_or_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_ltz_equal is + begin + --Act + execute immediate to_less_or_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_date_less is + begin + --Act + execute immediate to_less_or_equal_block('date', 'sysdate-1', 'sysdate'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_number_less is + begin + --Act + execute immediate to_less_or_equal_block('number', '1.0', '1.01'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_interval_ym_less is + begin + --Act + execute immediate to_less_or_equal_block('interval year to month', '''2-1''', '''2-2'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_interval_ds_less is + begin + --Act + execute immediate to_less_or_equal_block('interval day to second', '''2 00:59:58''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_less is + begin + --Act + execute immediate to_less_or_equal_block('timestamp', 'to_timestamp(''1997 12'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_tz_less is + begin + --Act + execute immediate to_less_or_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_ltz_less is + begin + --Act + execute immediate to_less_or_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure not_actual_date_greater is + begin + --Act + execute immediate not_to_less_or_equal_block('date', 'sysdate', 'sysdate-1'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure not_actual_number_greater is + begin + --Act + execute immediate not_to_less_or_equal_block('number', '2.0', '1.99'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure not_actual_interval_ym_greater is + begin + --Act + execute immediate not_to_less_or_equal_block('interval year to month', '''2-1''', '''2-0'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure not_actual_interval_ds_greater is + begin + --Act + execute immediate not_to_less_or_equal_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure not_actual_timestamp_greater is + begin + --Act + execute immediate not_to_less_or_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure not_actual_timestamp_tz_gretr is + begin + --Act + execute immediate not_to_less_or_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure not_actual_timestamp_ltz_gretr is + begin + --Act + execute immediate not_to_less_or_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_clob is + begin + --Act + ut3.ut.expect(to_clob('3')).to_( ut3.be_less_or_equal(3) ); + --Assert + ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); + end; + +end; +/ diff --git a/test/ut3_user/expectations/binary/test_be_less_or_equal.pks b/test/ut3_user/expectations/binary/test_be_less_or_equal.pks new file mode 100644 index 000000000..a6ab01664 --- /dev/null +++ b/test/ut3_user/expectations/binary/test_be_less_or_equal.pks @@ -0,0 +1,97 @@ +create or replace package test_be_less_or_equal is + + --%suite((not)to_be_less_or_equal) + --%suitepath(utplsql.core.expectations.binary) + + --%aftereach + procedure cleanup_expectations; + + --%test(Gives failure when actual date is greater than expected) + procedure actual_date_greater; + + --%test(Gives failure when actual number is greater than expected) + procedure actual_number_greater; + + --%test(Gives failure when actual interval year to month is greater than expected) + procedure actual_interval_ym_greater; + + --%test(Gives failure when actual interval day to second is greater than expected) + procedure actual_interval_ds_greater; + + --%test(Gives failure when actual timestamp is greater than expected) + procedure actual_timestamp_greater; + + --%test(Gives failure when actual timestamp with time zone is greater than expected) + procedure actual_timestamp_tz_greater; + + --%test(Gives failure when actual timestamp with local time zone is greater than expected) + procedure actual_timestamp_ltz_greater; + + --%test(Gives success when actual date is equal expected) + procedure actual_date_equal; + + --%test(Gives success when actual number is equal expected) + procedure actual_number_equal; + + --%test(Gives success when actual interval year to month is equal expected) + procedure actual_interval_ym_equal; + + --%test(Gives success when actual interval day to second is equal expected) + procedure actual_interval_ds_equal; + + --%test(Gives success when actual timestamp is equal expected) + procedure actual_timestamp_equal; + + --%test(Gives success when actual timestamp with time zone is equal expected) + procedure actual_timestamp_tz_equal; + + --%test(Gives success when actual timestamp with local time zone is equal expected) + procedure actual_timestamp_ltz_equal; + + --%test(Gives success when actual date is less than expected) + procedure actual_date_less; + + --%test(Gives success when actual number is less than expected) + procedure actual_number_less; + + --%test(Gives success when actual interval year to month is less than expected) + procedure actual_interval_ym_less; + + --%test(Gives success when actual interval day to second is less than expected) + procedure actual_interval_ds_less; + + --%test(Gives success when actual timestamp is less than expected) + procedure actual_timestamp_less; + + --%test(Gives success when actual timestamp with time zone is less than expected) + procedure actual_timestamp_tz_less; + + --%test(Gives success when actual timestamp with local time zone is less than expected) + procedure actual_timestamp_ltz_less; + + --%test(Negated - Gives success when actual date is greater than expected) + procedure not_actual_date_greater; + + --%test(Negated - Gives success when actual number is greater than expected) + procedure not_actual_number_greater; + + --%test(Negated - Gives success when actual interval year to month is greater than expected) + procedure not_actual_interval_ym_greater; + + --%test(Negated - Gives success when actual interval day to second is greater than expected) + procedure not_actual_interval_ds_greater; + + --%test(Negated - Gives success when actual timestamp is greater than expected) + procedure not_actual_timestamp_greater; + + --%test(Negated - Gives success when actual timestamp with time zone is greater than expected) + procedure not_actual_timestamp_tz_gretr; + + --%test(Negated - Gives success when actual timestamp with local time zone is greater than expected) + procedure not_actual_timestamp_ltz_gretr; + + --%test(Gives failure when running against CLOB) + procedure actual_clob; + +end; +/ diff --git a/test/ut3_user/expectations/binary/test_equal.pkb b/test/ut3_user/expectations/binary/test_equal.pkb index 8b369d0e7..95fd594c7 100644 --- a/test/ut3_user/expectations/binary/test_equal.pkb +++ b/test/ut3_user/expectations/binary/test_equal.pkb @@ -40,7 +40,7 @@ create or replace package body test_equal is begin execute immediate to_equal_block( 'to_equal', a_actual_type, a_expected_type, a_actual, a_expected, a_nulls_equal ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); cleanup_expectations; end; @@ -65,7 +65,7 @@ create or replace package body test_equal is begin execute immediate to_equal_block( 'to_equal', a_actual_type, a_expected_type, a_actual, a_expected, a_nulls_equal ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); cleanup_expectations; end; @@ -79,7 +79,7 @@ create or replace package body test_equal is begin execute immediate to_equal_block( 'not_to_equal', a_actual_type, a_expected_type, a_actual, a_expected, a_nulls_equal ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); cleanup_expectations; end; diff --git a/test/ut3_user/expectations/binary/test_expect_to_be_less_than.pkb b/test/ut3_user/expectations/binary/test_expect_to_be_less_than.pkb index 4212e4822..d7bf5533b 100644 --- a/test/ut3_user/expectations/binary/test_expect_to_be_less_than.pkb +++ b/test/ut3_user/expectations/binary/test_expect_to_be_less_than.pkb @@ -32,7 +32,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('date', 'sysdate', 'sysdate-1'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_number_greater is @@ -40,7 +40,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('number', '2.0', '1.99'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_interval_ym_greater is @@ -48,7 +48,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('interval year to month', '''2-1''', '''2-0'''); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_interval_ds_greater is @@ -56,7 +56,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_timestamp_greater is @@ -64,7 +64,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_timestamp_tz_greater is @@ -72,7 +72,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_timestamp_ltz_greater is @@ -80,7 +80,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_date_equal is @@ -88,7 +88,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('date', 'sysdate', 'sysdate'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_number_equal is @@ -96,7 +96,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('number', '2.0', '2.00'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_interval_ym_equal is @@ -104,7 +104,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('interval year to month', '''2-1''', '''2-1'''); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_interval_ds_equal is @@ -112,7 +112,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('interval day to second', '''2 01:00:00''', '''2 01:00:00'''); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_timestamp_equal is @@ -120,7 +120,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_timestamp_tz_equal is @@ -128,7 +128,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_timestamp_ltz_equal is @@ -136,7 +136,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure actual_date_less is @@ -144,7 +144,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('date', 'sysdate-1', 'sysdate'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure actual_number_less is @@ -152,7 +152,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('number', '1.0', '1.01'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure actual_interval_ym_less is @@ -160,7 +160,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('interval year to month', '''2-1''', '''2-2'''); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure actual_interval_ds_less is @@ -168,7 +168,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('interval day to second', '''2 00:59:58''', '''2 00:59:59'''); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure actual_timestamp_less is @@ -176,7 +176,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('timestamp', 'to_timestamp(''1997 12'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure actual_timestamp_tz_less is @@ -184,7 +184,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure actual_timestamp_ltz_less is @@ -192,7 +192,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure not_actual_date_greater is @@ -200,7 +200,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate not_to_be_less_than_block('date', 'sysdate', 'sysdate-1'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure not_actual_number_greater is @@ -208,7 +208,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate not_to_be_less_than_block('number', '2.0', '1.99'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure not_actual_interval_ym_greater is @@ -216,7 +216,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate not_to_be_less_than_block('interval year to month', '''2-1''', '''2-0'''); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure not_actual_interval_ds_greater is @@ -224,7 +224,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate not_to_be_less_than_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure not_actual_timestamp_greater is @@ -232,7 +232,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate not_to_be_less_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure not_actual_timestamp_tz_gretr is @@ -240,7 +240,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate not_to_be_less_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure not_actual_timestamp_ltz_gretr is @@ -248,7 +248,7 @@ create or replace package body test_expect_to_be_less_than is --Act execute immediate not_to_be_less_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure actual_clob is @@ -256,7 +256,7 @@ create or replace package body test_expect_to_be_less_than is --Act ut3.ut.expect(to_clob('3')).to_( ut3.be_less_than(4) ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; end; diff --git a/test/ut3_user/expectations/test_expectation_anydata.pkb b/test/ut3_user/expectations/test_expectation_anydata.pkb index 21445cb3b..edab706c0 100644 --- a/test/ut3_user/expectations/test_expectation_anydata.pkb +++ b/test/ut3_user/expectations/test_expectation_anydata.pkb @@ -55,7 +55,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).not_to_equal( g_test_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure fail_on_one_object_null is @@ -183,7 +183,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( l_null_anydata ).to_equal( l_null_anydata ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure success_on_both_object_null is @@ -194,7 +194,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( l_anydata ).to_equal( l_anydata ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure success_on_both_coll_null is @@ -205,7 +205,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( l_anydata ).to_equal( l_anydata ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure success_on_same_coll_data is @@ -216,7 +216,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure fail_on_coll_different_order is @@ -231,7 +231,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure success_on_same_object_data is @@ -242,7 +242,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure exclude_attributes_as_list is @@ -255,7 +255,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_list ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure exclude_attributes_as_csv is @@ -268,7 +268,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_list ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure exclude_attributes_xpath is @@ -281,7 +281,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_xpath ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure exclude_ignores_invalid_attrib is @@ -294,7 +294,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected, a_exclude=> l_exclude ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_attributes_as_list is @@ -307,7 +307,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_list ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_attributes_as_csv is @@ -320,7 +320,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_xpath ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_attributes_xpath is @@ -333,7 +333,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_xpath ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_ignores_invalid_attrib is @@ -346,7 +346,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).include( l_include ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_exclude_attributes_csv is @@ -361,7 +361,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).exclude( l_exclude ).include( l_include ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_exclude_attrib_list is @@ -378,7 +378,7 @@ create or replace package body test_expectation_anydata is --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).exclude( l_exclude ).include( l_include ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure reports_diff_attribute is @@ -559,7 +559,7 @@ Rows: [ 60 differences, showing first 20 ] --Act ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).include( l_list ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure collection_exclude_list is @@ -578,7 +578,7 @@ Rows: [ 60 differences, showing first 20 ] --Act ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).exclude( l_list ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure collection_include_list_fail is @@ -615,7 +615,7 @@ Rows: [ 60 differences, showing first 20 ] g_test_actual := anydata.convertCollection( ut3_tester_helper.t_tab_varchar('A') ); --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure array_diff_data is @@ -641,7 +641,7 @@ Rows: [ 60 differences, showing first 20 ] l_is_null ut3_tester_helper.t_tab_varchar ; begin ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_be_null; - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure array_null_equal_array_null is @@ -649,7 +649,7 @@ Rows: [ 60 differences, showing first 20 ] l_is_null_bis ut3_tester_helper.t_tab_varchar ; begin ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_equal(anydata.convertCollection( l_is_null_bis )); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure array_null_equal_array_notnull is @@ -674,7 +674,7 @@ Rows: [ 60 differences, showing first 20 ] procedure empty_array_have_zero_elem is begin ut3.ut.expect( anydata.convertCollection(ut3_tester_helper.t_tab_varchar())).to_have_count(0); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure array_empty_equal_array_empty is @@ -684,7 +684,7 @@ Rows: [ 60 differences, showing first 20 ] g_test_actual := anydata.convertCollection(ut3_tester_helper.t_tab_varchar()); --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure arr_empty_equal_arr_notempty is @@ -714,7 +714,7 @@ Rows: [ 60 differences, showing first 20 ] --Act ut3.ut.expect( g_test_actual ).to_be_null; --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure collection_is_empty is @@ -724,7 +724,7 @@ Rows: [ 60 differences, showing first 20 ] --Act ut3.ut.expect( g_test_actual ).to_have_count(0); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; @@ -735,7 +735,7 @@ Rows: [ 60 differences, showing first 20 ] g_test_actual := anydata.convertCollection( ut3_tester_helper.t_varray(1) ); --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure varray_diff_data is @@ -761,7 +761,7 @@ Rows: [ 60 differences, showing first 20 ] l_is_null ut3_tester_helper.t_varray ; begin ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_be_null; - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure varray_null_equal_varray_null is @@ -769,7 +769,7 @@ Rows: [ 60 differences, showing first 20 ] l_is_null_bis ut3_tester_helper.t_varray ; begin ut3.ut.expect( anydata.convertCollection( l_is_null ) ).to_equal(anydata.convertCollection( l_is_null_bis )); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure varr_null_equal_varr_notnull is @@ -794,7 +794,7 @@ Rows: [ 60 differences, showing first 20 ] procedure empty_varray_have_zero_elem is begin ut3.ut.expect( anydata.convertCollection(ut3_tester_helper.t_varray())).to_have_count(0); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure varr_empty_equal_varr_empty is @@ -804,7 +804,7 @@ Rows: [ 60 differences, showing first 20 ] g_test_actual := anydata.convertCollection(ut3_tester_helper.t_varray()); --Act ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure varr_empty_equal_varr_notempty is @@ -842,7 +842,7 @@ Rows: [ 60 differences, showing first 20 ] order by rownum desc; --Act ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).join_by('TEST_DUMMY_OBJECT/ID'); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure collection_join_by_fail is @@ -889,7 +889,7 @@ Rows: [ 60 differences, showing first 20 ] order by rownum desc; --Act ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).unordered; - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure collection_unordered_fail is @@ -929,7 +929,7 @@ Rows: [ 60 differences, showing first 20 ] --Act ut3.ut.expect(g_test_actual).to_equal(g_test_expected).join_by('TEST_DUMMY_OBJECT/ID'); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure object_unordered is @@ -939,7 +939,7 @@ Rows: [ 60 differences, showing first 20 ] --Act ut3.ut.expect(g_test_actual).to_equal(g_test_expected).unordered; - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure collection_to_contain is @@ -956,7 +956,7 @@ Rows: [ 60 differences, showing first 20 ] order by rownum desc; --Act ut3.ut.expect(anydata.convertCollection(l_actual)).to_contain(anydata.convertCollection(l_expected)); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure object_to_contain is @@ -967,7 +967,7 @@ Rows: [ 60 differences, showing first 20 ] --Act ut3.ut.expect(g_test_actual).to_contain(g_test_expected); - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; end; diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 5bae87df6..a83fb0ae9 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -50,7 +50,7 @@ create or replace package body test_expectations_cursor is --Act - execute the expectation on cursor opened on GTT ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); --Cleanup rollback; end; @@ -78,7 +78,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); ut3.ut.reset_nls; end; @@ -93,7 +93,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure success_on_both_null @@ -104,7 +104,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure success_to_be_null @@ -114,7 +114,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_null(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure success_not_to_be_not_null @@ -124,7 +124,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).not_to_be_not_null(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure success_not_to_be_null @@ -136,7 +136,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_not_null(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure success_to_be_not_null @@ -148,7 +148,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_not_null(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure success_is_empty @@ -160,7 +160,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_empty(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure success_is_not_empty @@ -172,7 +172,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).not_to_be_empty(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure failure_is_null @@ -184,7 +184,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_null(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure failure_is_not_null @@ -194,7 +194,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).not_to_be_null(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure failure_is_empty @@ -206,7 +206,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_be_empty(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure failure_is_not_empty @@ -218,7 +218,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).not_to_be_empty(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure fail_null_vs_empty @@ -231,7 +231,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).not_to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure fail_on_difference @@ -245,7 +245,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure fail_on_expected_missing @@ -259,7 +259,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure fail_on_actual_missing @@ -273,7 +273,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure fail_on_different_column_name @@ -287,7 +287,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; @@ -302,7 +302,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure pass_on_different_column_order @@ -316,7 +316,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ).unordered_columns; --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure pass_on_diff_column_ord_uc @@ -330,7 +330,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ).uc; --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure fail_on_multi_diff_col_order @@ -390,7 +390,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure include_time_in_date_with_nls @@ -407,7 +407,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); ut3.ut.reset_nls; end; @@ -422,7 +422,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure exclude_columns_as_list @@ -436,7 +436,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>ut3.ut_varchar2_list('A_COLUMN','Some_Col')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure exclude_columns_as_csv @@ -450,7 +450,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>'A_COLUMN,Some_Col'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure exclude_columns_as_mixed_list is @@ -463,7 +463,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>ut3.ut_varchar2_list('A_COLUMN','/ROW/Some_Col')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure exclude_columns_as_mix_csv_lst is @@ -476,7 +476,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>'A_COLUMN,/ROW/Some_Col'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure exclude_columns_xpath_invalid @@ -517,7 +517,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>'/ROW/A_COLUMN|/ROW/Some_Col'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure exclude_ignores_invalid_column @@ -531,7 +531,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected, a_exclude=>ut3.ut_varchar2_list('A_COLUMN','non_existing_column')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_columns_as_list @@ -545,7 +545,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_columns_as_csv @@ -559,7 +559,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).include('RN,//A_Column, SOME_COL'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_columns_xpath @@ -573,7 +573,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).include('/ROW/RN|//A_Column|//SOME_COL'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_ignores_invalid_column @@ -587,7 +587,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list(' RN ',' non_existing_column ')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_exclude_col_csv_xpath @@ -601,7 +601,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).exclude('Some_Col').include('/ROW/RN|//Some_Col'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure include_exclude_columns_list @@ -615,7 +615,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect(l_actual).to_equal(l_expected).exclude(ut3.ut_varchar2_list('A_COLUMN')).include(ut3.ut_varchar2_list('RN','A_Column','A_COLUMN')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure data_diff_on_rows_mismatch @@ -746,7 +746,7 @@ Rows: [ all different ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).unordered_columns; - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; --%test(Reports only mismatched columns on column data mismatch) @@ -937,7 +937,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_expected).to_equal(l_actual); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure closes_cursor_after_use @@ -1014,7 +1014,7 @@ Rows: [ 4 differences ] ut3.ut.expect(l_actual).to_equal(l_expected); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; function get_cursor return sys_refcursor is @@ -1116,7 +1116,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_unorderd_compr_success is @@ -1129,7 +1129,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).unordered; --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_unord_compr_success_uc is @@ -1142,7 +1142,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).unordered().uc(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_unordered_compare_fail is @@ -1184,7 +1184,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('OBJECT_ID').uc(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_joinby_compare is @@ -1198,7 +1198,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('OBJECT_ID'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_joinby_col_not_ord @@ -1237,7 +1237,7 @@ Rows: [ 4 differences ] --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by(ut3.ut_varchar2_list('OBJECT_ID,OBJECT_NAME')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_joinby_compare_nokey is @@ -1388,7 +1388,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('OBJECT_ID'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_unorder_compare_1000 is @@ -1401,7 +1401,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).unordered; --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_joinby_compare_fail is @@ -1493,7 +1493,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')).unordered; --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure joinby_incl_cols_as_list @@ -1507,7 +1507,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')).join_by('RN'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure joinby_excl_cols_as_list @@ -1521,7 +1521,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).exclude(ut3.ut_varchar2_list('//Some_Col','A_COLUMN')).join_by('RN'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure unord_excl_cols_as_list @@ -1535,7 +1535,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).exclude(ut3.ut_varchar2_list('A_COLUMN|//Some_Col')).unordered; --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure excl_dif_cols_as_list @@ -1549,7 +1549,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).exclude(ut3.ut_varchar2_list('A_COLUMN')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure inlc_dif_cols_as_list @@ -1563,7 +1563,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list('RN')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure inlc_exc_dif_cols_as_list @@ -1577,7 +1577,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).include(ut3.ut_varchar2_list('RN')).exclude(ut3.ut_varchar2_list('A_COLUMN')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure compare_obj_typ_col_un is @@ -1594,7 +1594,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).unordered; --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure compare_obj_typ_col_jb is @@ -1611,7 +1611,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('COLVAL/ID'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure comp_obj_typ_col_un_fail is @@ -1656,7 +1656,7 @@ Rows: [ 5 differences% --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('COLVAL/ID'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure comp_obj_typ_col_jb_multi is @@ -1673,7 +1673,7 @@ Rows: [ 5 differences% --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by(ut3.ut_varchar2_list('RN,COLVAL/ID')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure comp_obj_typ_col_jb_nokey is @@ -1729,7 +1729,7 @@ Diff:% ut3.ut.expect(l_actual).to_equal(l_expected).join_by('KEY'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure compare_nest_tab_col_jb_fail is @@ -1796,7 +1796,7 @@ Diff:% ut3.ut.expect(l_actual).to_equal(l_expected).join_by(ut3.ut_varchar2_list('KEY,VALUE')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure compare_nest_tab_cols_jb_fail is @@ -1902,7 +1902,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; @@ -1974,7 +1974,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('NESTED_TABLE'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; @@ -2006,7 +2006,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('NESTED_TABLE/OBJECT_OWNER'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; @@ -2038,7 +2038,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_equal(l_expected).join_by('NESTED_TABLE/ANNOTATIONS'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; @@ -2084,7 +2084,7 @@ Diff:% l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); - --ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_be_greater_than(0); + --ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; procedure compare_rec_coll_as_join is @@ -2173,7 +2173,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_to_contain_uc is @@ -2189,7 +2189,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).uc(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_to_contain_unordered is @@ -2206,7 +2206,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).unordered(); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_to_contain_fail is @@ -2246,7 +2246,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).join_by('USERNAME'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_contain_joinby_fail is @@ -2290,7 +2290,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure to_cont_join_incl_cols_as_lst @@ -2304,7 +2304,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')).join_by('RN'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure contain_join_excl_cols_as_lst @@ -2318,7 +2318,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).exclude(ut3.ut_varchar2_list('//Some_Col','A_COLUMN')).join_by('RN'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure contain_excl_cols_as_list @@ -2332,7 +2332,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected).exclude(ut3.ut_varchar2_list('A_COLUMN|//Some_Col')); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_not_to_contain @@ -2349,7 +2349,7 @@ Diff:% --Act ut3.ut.expect(l_actual).not_to_contain(l_expected); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure cursor_not_to_contain_fail is @@ -2393,7 +2393,7 @@ Diff:% --Act ut3.ut.expect(l_actual).not_to_contain(l_expected).join_by('USER_ID'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure not_cont_join_incl_cols_as_lst is @@ -2406,7 +2406,7 @@ Diff:% --Act ut3.ut.expect(l_actual).not_to_contain(l_expected).include(ut3.ut_varchar2_list('RN','//A_Column','SOME_COL')).join_by('RN'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure not_cont_join_excl_cols_as_lst is @@ -2419,7 +2419,7 @@ Diff:% --Act ut3.ut.expect(l_actual).not_to_contain(l_expected).exclude(ut3.ut_varchar2_list('//Some_Col','A_COLUMN')).join_by('RN'); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure to_contain_duplicates is @@ -2435,7 +2435,7 @@ Diff:% --Act ut3.ut.expect(l_actual).to_contain(l_expected); --Assert - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; procedure to_contain_duplicates_fail is diff --git a/test/ut3_user/expectations/test_matchers.pkb b/test/ut3_user/expectations/test_matchers.pkb index c84a623eb..88e25e8b1 100644 --- a/test/ut3_user/expectations/test_matchers.pkb +++ b/test/ut3_user/expectations/test_matchers.pkb @@ -17,9 +17,9 @@ create or replace package body test_matchers is end;'; execute immediate l_statement; if a_result = ut3_tester_helper.main_helper.gc_success then - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num()).to_equal(0); else - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num()).to_be_greater_than(0); end if; cleanup_expectations(); end exec_matcher; @@ -37,9 +37,9 @@ create or replace package body test_matchers is end;'; execute immediate l_statement; if a_result = ut3_tester_helper.main_helper.gc_success then - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num()).to_equal(0); else - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num()).to_be_greater_than(0); end if; cleanup_expectations(); end exec_be_between; @@ -57,9 +57,9 @@ create or replace package body test_matchers is end;'; execute immediate l_statement; if a_result = ut3_tester_helper.main_helper.gc_success then - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num()).to_equal(0); else - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num()).to_be_greater_than(0); end if; cleanup_expectations(); end exec_be_between2; @@ -77,9 +77,9 @@ create or replace package body test_matchers is end;]' using a_pattern, a_escape; if a_result = ut3_tester_helper.main_helper.gc_success then - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num()).to_equal(0); else - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num()).to_be_greater_than(0); end if; cleanup_expectations(); end; @@ -98,9 +98,9 @@ create or replace package body test_matchers is end;'; execute immediate l_statement using a_pattern, a_modifiers; if a_result = ut3_tester_helper.main_helper.gc_success then - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num()).to_equal(0); else - ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_n()).to_be_greater_than(0); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num()).to_be_greater_than(0); end if; cleanup_expectations(); end; From 887e46ab25e2f690a27539fc571ef35cee0a494b Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 25 Mar 2019 07:50:58 +0000 Subject: [PATCH 015/181] Fixing test package --- test/ut3_user/expectations/binary/test_be_less_or_equal.pkb | 2 +- test/ut3_user/expectations/binary/test_be_less_or_equal.pks | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ut3_user/expectations/binary/test_be_less_or_equal.pkb b/test/ut3_user/expectations/binary/test_be_less_or_equal.pkb index 81634f7f5..bf7632cc4 100644 --- a/test/ut3_user/expectations/binary/test_be_less_or_equal.pkb +++ b/test/ut3_user/expectations/binary/test_be_less_or_equal.pkb @@ -256,7 +256,7 @@ create or replace package body test_be_less_or_equal is --Act ut3.ut.expect(to_clob('3')).to_( ut3.be_less_or_equal(3) ); --Assert - ut.expect( expectations.failed_expectations_data( ) ).not_to_be_empty( ); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; end; diff --git a/test/ut3_user/expectations/binary/test_be_less_or_equal.pks b/test/ut3_user/expectations/binary/test_be_less_or_equal.pks index a6ab01664..d6baf037e 100644 --- a/test/ut3_user/expectations/binary/test_be_less_or_equal.pks +++ b/test/ut3_user/expectations/binary/test_be_less_or_equal.pks @@ -1,7 +1,7 @@ create or replace package test_be_less_or_equal is --%suite((not)to_be_less_or_equal) - --%suitepath(utplsql.core.expectations.binary) + --%suitepath(utplsql.test_user.expectations.binary) --%aftereach procedure cleanup_expectations; From 28dbd1e0bcffc560109195394feb22f4f29650f0 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 25 Mar 2019 11:55:38 +0000 Subject: [PATCH 016/181] Added set of tests: expectations/binary/test_be_greater_or_equal expectations/binary/test_be_greater_than expectations/unary/test_expect_not_to_be_null Passing username implicit into ut_test_runner. --- test/install_ut3_user_tests.sql | 6 + test/ut3_user/api/test_ut_runner.pkb | 2 +- .../binary/test_be_greater_or_equal.pkb | 263 +++++++++++++++++ .../binary/test_be_greater_or_equal.pks | 97 +++++++ .../binary/test_be_greater_than.pkb | 263 +++++++++++++++++ .../binary/test_be_greater_than.pks | 97 +++++++ .../unary/test_expect_not_to_be_null.pkb | 265 ++++++++++++++++++ .../unary/test_expect_not_to_be_null.pks | 97 +++++++ 8 files changed, 1089 insertions(+), 1 deletion(-) create mode 100644 test/ut3_user/expectations/binary/test_be_greater_or_equal.pkb create mode 100644 test/ut3_user/expectations/binary/test_be_greater_or_equal.pks create mode 100644 test/ut3_user/expectations/binary/test_be_greater_than.pkb create mode 100644 test/ut3_user/expectations/binary/test_be_greater_than.pks create mode 100644 test/ut3_user/expectations/unary/test_expect_not_to_be_null.pkb create mode 100644 test/ut3_user/expectations/unary/test_expect_not_to_be_null.pks diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index aad875984..09bc29c24 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -5,17 +5,23 @@ whenever oserror exit failure rollback alter session set plsql_optimize_level=0; prompt Install user tests +@@ut3_user/expectations/unary/test_expect_not_to_be_null.pks @@ut3_user/expectations/binary/test_equal.pks @@ut3_user/expectations/binary/test_expect_to_be_less_than.pks @@ut3_user/expectations/binary/test_be_less_or_equal.pks +@@ut3_user/expectations/binary/test_be_greater_or_equal.pks +@@ut3_user/expectations/binary/test_be_greater_than.pks @@ut3_user/expectations/test_matchers.pks @@ut3_user/expectations/test_expectation_anydata.pks @@ut3_user/expectations/test_expectations_cursor.pks @@ut3_user/api/test_ut_runner.pks +@@ut3_user/expectations/unary/test_expect_not_to_be_null.pkb @@ut3_user/expectations/binary/test_equal.pkb @@ut3_user/expectations/binary/test_expect_to_be_less_than.pkb @@ut3_user/expectations/binary/test_be_less_or_equal.pkb +@@ut3_user/expectations/binary/test_be_greater_or_equal.pkb +@@ut3_user/expectations/binary/test_be_greater_than.pkb @@ut3_user/expectations/test_matchers.pkb @@ut3_user/expectations/test_expectation_anydata.pkb @@ut3_user/expectations/test_expectations_cursor.pkb diff --git a/test/ut3_user/api/test_ut_runner.pkb b/test/ut3_user/api/test_ut_runner.pkb index 4d59c78e2..0c47248bd 100644 --- a/test/ut3_user/api/test_ut_runner.pkb +++ b/test/ut3_user/api/test_ut_runner.pkb @@ -254,7 +254,7 @@ end;'; 'dummy_test_package.some_dummy_test_procedure' path, 0 disabled_flag from dual; --Act - open l_actual for select * from table(ut3.ut_runner.get_suites_info(NULL,'DUMMY_TEST_PACKAGE')); + open l_actual for select * from table(ut3.ut_runner.get_suites_info('UT3$USER#','DUMMY_TEST_PACKAGE')); --Assert ut.expect(l_actual).to_equal(l_expected); end; diff --git a/test/ut3_user/expectations/binary/test_be_greater_or_equal.pkb b/test/ut3_user/expectations/binary/test_be_greater_or_equal.pkb new file mode 100644 index 000000000..5d99d07b6 --- /dev/null +++ b/test/ut3_user/expectations/binary/test_be_greater_or_equal.pkb @@ -0,0 +1,263 @@ +create or replace package body test_be_greater_or_equal is + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + function to_greater_equal_block( + a_data_type varchar2, + a_actual varchar2, + a_expected varchar2 + ) return varchar2 is + begin + return ut3_tester_helper.expectations_helper.binary_expectation_block( + 'to_be_greater_or_equal', a_data_type, a_actual, a_data_type, a_expected + ); + end; + + function not_to_greater_equal_block( + a_data_type varchar2, + a_actual varchar2, + a_expected varchar2 + ) return varchar2 is + begin + return ut3_tester_helper.expectations_helper.binary_expectation_block( + 'not_to_be_greater_or_equal', a_data_type, a_actual, a_data_type, a_expected + ); + end; + + procedure actual_date_greater is + begin + --Act + execute immediate to_greater_equal_block('date', 'sysdate', 'sysdate-1'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_number_greater is + begin + --Act + execute immediate to_greater_equal_block('number', '2.0', '1.99'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_interval_ym_greater is + begin + --Act + execute immediate to_greater_equal_block('interval year to month', '''2-1''', '''2-0'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_interval_ds_greater is + begin + --Act + execute immediate to_greater_equal_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_greater is + begin + --Act + execute immediate to_greater_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_tz_greater is + begin + --Act + execute immediate to_greater_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_ltz_greater is + begin + --Act + execute immediate to_greater_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_date_equal is + begin + --Act + execute immediate to_greater_equal_block('date', 'sysdate', 'sysdate'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_number_equal is + begin + --Act + execute immediate to_greater_equal_block('number', '2.0', '2.00'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_interval_ym_equal is + begin + --Act + execute immediate to_greater_equal_block('interval year to month', '''2-1''', '''2-1'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_interval_ds_equal is + begin + --Act + execute immediate to_greater_equal_block('interval day to second', '''2 01:00:00''', '''2 01:00:00'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_equal is + begin + --Act + execute immediate to_greater_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_tz_equal is + begin + --Act + execute immediate to_greater_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_ltz_equal is + begin + --Act + execute immediate to_greater_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_date_less is + begin + --Act + execute immediate to_greater_equal_block('date', 'sysdate-1', 'sysdate'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_number_less is + begin + --Act + execute immediate to_greater_equal_block('number', '1.0', '1.01'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_interval_ym_less is + begin + --Act + execute immediate to_greater_equal_block('interval year to month', '''2-1''', '''2-2'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_interval_ds_less is + begin + --Act + execute immediate to_greater_equal_block('interval day to second', '''2 00:59:58''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_less is + begin + --Act + execute immediate to_greater_equal_block('timestamp', 'to_timestamp(''1997 12'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_tz_less is + begin + --Act + execute immediate to_greater_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_ltz_less is + begin + --Act + execute immediate to_greater_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_date_greater is + begin + --Act + execute immediate not_to_greater_equal_block('date', 'sysdate', 'sysdate-1'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_number_greater is + begin + --Act + execute immediate not_to_greater_equal_block('number', '2.0', '1.99'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_interval_ym_greater is + begin + --Act + execute immediate not_to_greater_equal_block('interval year to month', '''2-1''', '''2-0'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_interval_ds_greater is + begin + --Act + execute immediate not_to_greater_equal_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_timestamp_greater is + begin + --Act + execute immediate not_to_greater_equal_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_timestamp_tz_gretr is + begin + --Act + execute immediate not_to_greater_equal_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_timestamp_ltz_gretr is + begin + --Act + execute immediate not_to_greater_equal_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_clob is + begin + --Act + ut3.ut.expect(to_clob('3')).to_( ut3.be_greater_or_equal(3) ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + +end; +/ diff --git a/test/ut3_user/expectations/binary/test_be_greater_or_equal.pks b/test/ut3_user/expectations/binary/test_be_greater_or_equal.pks new file mode 100644 index 000000000..3f51e8e3f --- /dev/null +++ b/test/ut3_user/expectations/binary/test_be_greater_or_equal.pks @@ -0,0 +1,97 @@ +create or replace package test_be_greater_or_equal is + + --%suite((not)to_be_greater_or_equal) + --%suitepath(utplsql.test_user.expectations.binary) + + --%aftereach + procedure cleanup_expectations; + + --%test(Gives success when actual date is greater than expected) + procedure actual_date_greater; + + --%test(Gives success when actual number is greater than expected) + procedure actual_number_greater; + + --%test(Gives success when actual interval year to month is greater than expected) + procedure actual_interval_ym_greater; + + --%test(Gives success when actual interval day to second is greater than expected) + procedure actual_interval_ds_greater; + + --%test(Gives success when actual timestamp is greater than expected) + procedure actual_timestamp_greater; + + --%test(Gives success when actual timestamp with time zone is greater than expected) + procedure actual_timestamp_tz_greater; + + --%test(Gives success when actual timestamp with local time zone is greater than expected) + procedure actual_timestamp_ltz_greater; + + --%test(Gives success when actual date is equal expected) + procedure actual_date_equal; + + --%test(Gives success when actual number is equal expected) + procedure actual_number_equal; + + --%test(Gives success when actual interval year to month is equal expected) + procedure actual_interval_ym_equal; + + --%test(Gives success when actual interval day to second is equal expected) + procedure actual_interval_ds_equal; + + --%test(Gives success when actual timestamp is equal expected) + procedure actual_timestamp_equal; + + --%test(Gives success when actual timestamp with time zone is equal expected) + procedure actual_timestamp_tz_equal; + + --%test(Gives success when actual timestamp with local time zone is equal expected) + procedure actual_timestamp_ltz_equal; + + --%test(Gives failure when actual date is less than expected) + procedure actual_date_less; + + --%test(Gives failure when actual number is less than expected) + procedure actual_number_less; + + --%test(Gives failure when actual interval year to month is less than expected) + procedure actual_interval_ym_less; + + --%test(Gives failure when actual interval day to second is less than expected) + procedure actual_interval_ds_less; + + --%test(Gives failure when actual timestamp is less than expected) + procedure actual_timestamp_less; + + --%test(Gives failure when actual timestamp with time zone is less than expected) + procedure actual_timestamp_tz_less; + + --%test(Gives failure when actual timestamp with local time zone is less than expected) + procedure actual_timestamp_ltz_less; + + --%test(Negated - Gives failure when actual date is greater than expected) + procedure not_actual_date_greater; + + --%test(Negated - Gives failure when actual number is greater than expected) + procedure not_actual_number_greater; + + --%test(Negated - Gives failure when actual interval year to month is greater than expected) + procedure not_actual_interval_ym_greater; + + --%test(Negated - Gives failure when actual interval day to second is greater than expected) + procedure not_actual_interval_ds_greater; + + --%test(Negated - Gives failure when actual timestamp is greater than expected) + procedure not_actual_timestamp_greater; + + --%test(Negated - Gives failure when actual timestamp with time zone is greater than expected) + procedure not_actual_timestamp_tz_gretr; + + --%test(Negated - Gives failure when actual timestamp with local time zone is greater than expected) + procedure not_actual_timestamp_ltz_gretr; + + --%test(Gives failure when running against CLOB) + procedure actual_clob; + +end; +/ diff --git a/test/ut3_user/expectations/binary/test_be_greater_than.pkb b/test/ut3_user/expectations/binary/test_be_greater_than.pkb new file mode 100644 index 000000000..37e15f633 --- /dev/null +++ b/test/ut3_user/expectations/binary/test_be_greater_than.pkb @@ -0,0 +1,263 @@ +create or replace package body test_be_greater_than is + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + function to_greater_than_block( + a_data_type varchar2, + a_actual varchar2, + a_expected varchar2 + ) return varchar2 is + begin + return ut3_tester_helper.expectations_helper.binary_expectation_block( + 'to_be_greater_than', a_data_type, a_actual, a_data_type, a_expected + ); + end; + + function not_to_greater_than_block( + a_data_type varchar2, + a_actual varchar2, + a_expected varchar2 + ) return varchar2 is + begin + return ut3_tester_helper.expectations_helper.binary_expectation_block( + 'not_to_be_greater_than', a_data_type, a_actual, a_data_type, a_expected + ); + end; + + procedure actual_date_greater is + begin + --Act + execute immediate to_greater_than_block('date', 'sysdate', 'sysdate-1'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_number_greater is + begin + --Act + execute immediate to_greater_than_block('number', '2.0', '1.99'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_interval_ym_greater is + begin + --Act + execute immediate to_greater_than_block('interval year to month', '''2-1''', '''2-0'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_interval_ds_greater is + begin + --Act + execute immediate to_greater_than_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_greater is + begin + --Act + execute immediate to_greater_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_tz_greater is + begin + --Act + execute immediate to_greater_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_timestamp_ltz_greater is + begin + --Act + execute immediate to_greater_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure actual_date_equal is + begin + --Act + execute immediate to_greater_than_block('date', 'sysdate', 'sysdate'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_number_equal is + begin + --Act + execute immediate to_greater_than_block('number', '2.0', '2.00'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_interval_ym_equal is + begin + --Act + execute immediate to_greater_than_block('interval year to month', '''2-1''', '''2-1'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_interval_ds_equal is + begin + --Act + execute immediate to_greater_than_block('interval day to second', '''2 01:00:00''', '''2 01:00:00'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_equal is + begin + --Act + execute immediate to_greater_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_tz_equal is + begin + --Act + execute immediate to_greater_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_ltz_equal is + begin + --Act + execute immediate to_greater_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_date_less is + begin + --Act + execute immediate to_greater_than_block('date', 'sysdate-1', 'sysdate'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_number_less is + begin + --Act + execute immediate to_greater_than_block('number', '1.0', '1.01'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_interval_ym_less is + begin + --Act + execute immediate to_greater_than_block('interval year to month', '''2-1''', '''2-2'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_interval_ds_less is + begin + --Act + execute immediate to_greater_than_block('interval day to second', '''2 00:59:58''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_less is + begin + --Act + execute immediate to_greater_than_block('timestamp', 'to_timestamp(''1997 12'',''YYYY FF'')', 'to_timestamp(''1997 13'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_tz_less is + begin + --Act + execute immediate to_greater_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_timestamp_ltz_less is + begin + --Act + execute immediate to_greater_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +03:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_date_greater is + begin + --Act + execute immediate not_to_greater_than_block('date', 'sysdate', 'sysdate-1'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_number_greater is + begin + --Act + execute immediate not_to_greater_than_block('number', '2.0', '1.99'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_interval_ym_greater is + begin + --Act + execute immediate not_to_greater_than_block('interval year to month', '''2-1''', '''2-0'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_interval_ds_greater is + begin + --Act + execute immediate not_to_greater_than_block('interval day to second', '''2 01:00:00''', '''2 00:59:59'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_timestamp_greater is + begin + --Act + execute immediate not_to_greater_than_block('timestamp', 'to_timestamp(''1997 13'',''YYYY FF'')', 'to_timestamp(''1997 12'',''YYYY FF'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_timestamp_tz_gretr is + begin + --Act + execute immediate not_to_greater_than_block('timestamp with time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_actual_timestamp_ltz_gretr is + begin + --Act + execute immediate not_to_greater_than_block('timestamp with local time zone', 'to_timestamp_tz(''1997 12 +01:00'',''YYYY FF TZR'')', 'to_timestamp_tz(''1997 12 +02:00'',''YYYY FF TZR'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure actual_clob is + begin + --Act + ut3.ut.expect(to_clob('3')).to_( ut3.be_greater_than(2) ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + +end; +/ diff --git a/test/ut3_user/expectations/binary/test_be_greater_than.pks b/test/ut3_user/expectations/binary/test_be_greater_than.pks new file mode 100644 index 000000000..fb158dddb --- /dev/null +++ b/test/ut3_user/expectations/binary/test_be_greater_than.pks @@ -0,0 +1,97 @@ +create or replace package test_be_greater_than is + + --%suite((not)to_be_greater_than) + --%suitepath(utplsql.test_user.expectations.binary) + + --%aftereach + procedure cleanup_expectations; + + --%test(Gives success when actual date is greater than expected) + procedure actual_date_greater; + + --%test(Gives success when actual number is greater than expected) + procedure actual_number_greater; + + --%test(Gives success when actual interval year to month is greater than expected) + procedure actual_interval_ym_greater; + + --%test(Gives success when actual interval day to second is greater than expected) + procedure actual_interval_ds_greater; + + --%test(Gives success when actual timestamp is greater than expected) + procedure actual_timestamp_greater; + + --%test(Gives success when actual timestamp with time zone is greater than expected) + procedure actual_timestamp_tz_greater; + + --%test(Gives success when actual timestamp with local time zone is greater than expected) + procedure actual_timestamp_ltz_greater; + + --%test(Gives failure when actual date is equal expected) + procedure actual_date_equal; + + --%test(Gives failure when actual number is equal expected) + procedure actual_number_equal; + + --%test(Gives failure when actual interval year to month is equal expected) + procedure actual_interval_ym_equal; + + --%test(Gives failure when actual interval day to second is equal expected) + procedure actual_interval_ds_equal; + + --%test(Gives failure when actual timestamp is equal expected) + procedure actual_timestamp_equal; + + --%test(Gives failure when actual timestamp with time zone is equal expected) + procedure actual_timestamp_tz_equal; + + --%test(Gives failure when actual timestamp with local time zone is equal expected) + procedure actual_timestamp_ltz_equal; + + --%test(Gives failure when actual date is less than expected) + procedure actual_date_less; + + --%test(Gives failure when actual number is less than expected) + procedure actual_number_less; + + --%test(Gives failure when actual interval year to month is less than expected) + procedure actual_interval_ym_less; + + --%test(Gives failure when actual interval day to second is less than expected) + procedure actual_interval_ds_less; + + --%test(Gives failure when actual timestamp is less than expected) + procedure actual_timestamp_less; + + --%test(Gives failure when actual timestamp with time zone is less than expected) + procedure actual_timestamp_tz_less; + + --%test(Gives failure when actual timestamp with local time zone is less than expected) + procedure actual_timestamp_ltz_less; + + --%test(Negated - Gives failure when actual date is greater than expected) + procedure not_actual_date_greater; + + --%test(Negated - Gives failure when actual number is greater than expected) + procedure not_actual_number_greater; + + --%test(Negated - Gives failure when actual interval year to month is greater than expected) + procedure not_actual_interval_ym_greater; + + --%test(Negated - Gives failure when actual interval day to second is greater than expected) + procedure not_actual_interval_ds_greater; + + --%test(Negated - Gives failure when actual timestamp is greater than expected) + procedure not_actual_timestamp_greater; + + --%test(Negated - Gives failure when actual timestamp with time zone is greater than expected) + procedure not_actual_timestamp_tz_gretr; + + --%test(Negated - Gives failure when actual timestamp with local time zone is greater than expected) + procedure not_actual_timestamp_ltz_gretr; + + --%test(Gives failure when running against CLOB) + procedure actual_clob; + +end; +/ diff --git a/test/ut3_user/expectations/unary/test_expect_not_to_be_null.pkb b/test/ut3_user/expectations/unary/test_expect_not_to_be_null.pkb new file mode 100644 index 000000000..448addb8c --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_not_to_be_null.pkb @@ -0,0 +1,265 @@ +create or replace package body test_expect_not_to_be_null +is + gc_object_name constant varchar2(30) := 't_not_to_be_null_test'; + gc_nested_table_name constant varchar2(30) := 'tt_not_to_be_null_test'; + gc_varray_name constant varchar2(30) := 'tv_not_to_be_null_test'; + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + procedure create_types is + pragma autonomous_transaction; + begin + execute immediate 'create type ' || gc_object_name || ' is object (dummy number)'; + execute immediate 'create type ' || gc_nested_table_name || ' is table of number'; + execute immediate 'create type ' || gc_varray_name || ' is varray(1) of number'; + end; + + procedure drop_types is + pragma autonomous_transaction; + begin + execute immediate 'drop type ' || gc_object_name; + execute immediate 'drop type ' || gc_nested_table_name; + execute immediate 'drop type ' || gc_varray_name; + end; + + procedure blob_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'blob', 'to_blob(''abc'')' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure blob_0_length is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'blob', 'empty_blob()' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure boolean_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'boolean', 'true' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure clob_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'clob', 'to_clob(''abc'')' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + + procedure clob_0_length is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'clob', 'empty_clob()' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure date_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'date', 'sysdate' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure number_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'number', '1234' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure timestamp_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'timestamp', 'systimestamp' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure timestamp_with_ltz_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( + 'not_to_be_null', 'timestamp with local time zone', 'systimestamp' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure timestamp_with_tz_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'timestamp with time zone', + 'systimestamp' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure varchar2_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'varchar2(4000)', '''abc''' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure initialized_object is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'not_to_be_null', gc_object_name, gc_object_name || '(1)', 'object' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure initialized_nested_table is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'not_to_be_null', gc_nested_table_name, gc_nested_table_name || '()', 'collection' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure initialized_varray is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'not_to_be_null', gc_varray_name, gc_varray_name || '()', 'collection' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure null_blob is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'blob', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure null_boolean is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'boolean', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure null_clob is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'clob', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure null_date is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'date', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure null_number is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'number', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure null_timestamp is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'timestamp', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure null_timestamp_with_ltz is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( + 'not_to_be_null', 'timestamp with local time zone', 'null' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure null_timestamp_with_tz is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( + 'not_to_be_null', 'timestamp with time zone', 'null' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure null_varchar2 is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'varchar2(4000)', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure null_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'not_to_be_null', 'anydata', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure uninit_object_in_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'not_to_be_null', gc_object_name, 'null', 'object' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure uninit_nested_table_in_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'not_to_be_null', gc_nested_table_name, 'null', 'collection' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure uninit_varray_in_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'not_to_be_null', gc_varray_name, 'null', 'collection' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + +end test_expect_not_to_be_null; +/ diff --git a/test/ut3_user/expectations/unary/test_expect_not_to_be_null.pks b/test/ut3_user/expectations/unary/test_expect_not_to_be_null.pks new file mode 100644 index 000000000..11648d5d2 --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_not_to_be_null.pks @@ -0,0 +1,97 @@ +create or replace package test_expect_not_to_be_null +is + --%suite(not_to_be_null) + --%suitepath(utplsql.test_user.expectations.unary) + + --%aftereach + procedure cleanup_expectations; + + --%beforeall + procedure create_types; + + --%afterall + procedure drop_types; + + --%test(Gives success for not null blob) + procedure blob_not_null; + + --%test(Gives success for blob with length 0) + procedure blob_0_length; + + --%test(Gives success for not null boolean) + procedure boolean_not_null; + + --%test(Gives success for not null clob) + procedure clob_not_null; + + --%test(Gives success for clob with length 0) + procedure clob_0_length; + + --%test(Gives success for not null date) + procedure date_not_null; + + --%test(Gives success for not null number) + procedure number_not_null; + + --%test(Gives success for not null timestamp) + procedure timestamp_not_null; + + --%test(Gives success for not null timestamp with local time zone) + procedure timestamp_with_ltz_not_null; + + --%test(Gives success for not null timestamp with time zone) + procedure timestamp_with_tz_not_null; + + --%test(Gives success for not null varchar2) + procedure varchar2_not_null; + + --%test(Gives success for initialized object within anydata) + procedure initialized_object; + + --%test(Gives success for initialized nested table within anydata) + procedure initialized_nested_table; + + --%test(Gives success for initialized varray within anydata) + procedure initialized_varray; + + --%test(Gives failure with null blob) + procedure null_blob; + + --%test(Gives failure with null boolean) + procedure null_boolean; + + --%test(Gives failure with null clob) + procedure null_clob; + + --%test(Gives failure with null date) + procedure null_date; + + --%test(Gives failure with null number) + procedure null_number; + + --%test(Gives failure null timestamp) + procedure null_timestamp; + + --%test(Gives failure with null timestamp with local time zone) + procedure null_timestamp_with_ltz; + + --%test(Gives failure with null timestamp with time zone) + procedure null_timestamp_with_tz; + + --%test(Gives failure with null varchar2) + procedure null_varchar2; + + --%test(Gives failure with null anydata) + procedure null_anydata; + + --%test(Gives failure with uninitialized object within anydata) + procedure uninit_object_in_anydata; + + --%test(Gives failure with uninitialized nested table within anydata) + procedure uninit_nested_table_in_anydata; + + --%test(Gives failure with uninitialized varray within anydata) + procedure uninit_varray_in_anydata; + +end test_expect_not_to_be_null; +/ From d7eb1250798317f1d4fe06315eca7d5cddb183b4 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 25 Mar 2019 12:50:26 +0000 Subject: [PATCH 017/181] Adding set of tests : expectations/unary/test_expect_to_be_empty expectations/unary/test_expect_to_be_null expectations/unary/test_expect_to_be_true_false expectations/unary/test_expect_to_have_count Adding dummy type for testing. --- test/install_ut3_tester_helper.sql | 1 + test/install_ut3_user_tests.sql | 8 + test/ut3_tester_helper/test_dummy_number.tps | 14 + .../unary/test_expect_to_be_empty.pkb | 270 ++++++++++++++++++ .../unary/test_expect_to_be_empty.pks | 93 ++++++ .../unary/test_expect_to_be_null.pkb | 260 +++++++++++++++++ .../unary/test_expect_to_be_null.pks | 97 +++++++ .../unary/test_expect_to_be_true_false.pkb | 139 +++++++++ .../unary/test_expect_to_be_true_false.pks | 58 ++++ .../unary/test_expect_to_have_count.pkb | 210 ++++++++++++++ .../unary/test_expect_to_have_count.pks | 61 ++++ 11 files changed, 1211 insertions(+) create mode 100644 test/ut3_tester_helper/test_dummy_number.tps create mode 100644 test/ut3_user/expectations/unary/test_expect_to_be_empty.pkb create mode 100644 test/ut3_user/expectations/unary/test_expect_to_be_empty.pks create mode 100644 test/ut3_user/expectations/unary/test_expect_to_be_null.pkb create mode 100644 test/ut3_user/expectations/unary/test_expect_to_be_null.pks create mode 100644 test/ut3_user/expectations/unary/test_expect_to_be_true_false.pkb create mode 100644 test/ut3_user/expectations/unary/test_expect_to_be_true_false.pks create mode 100644 test/ut3_user/expectations/unary/test_expect_to_have_count.pkb create mode 100644 test/ut3_user/expectations/unary/test_expect_to_have_count.pks diff --git a/test/install_ut3_tester_helper.sql b/test/install_ut3_tester_helper.sql index acfb55aff..f221adad6 100644 --- a/test/install_ut3_tester_helper.sql +++ b/test/install_ut3_tester_helper.sql @@ -9,6 +9,7 @@ alter session set plsql_optimize_level=0; @@ut3_tester_helper/test_dummy_object_list.tps @@ut3_tester_helper/test_tab_varchar2.tps @@ut3_tester_helper/test_tab_varray.tps +@@ut3_tester_helper/test_dummy_number.tps @@ut3_tester_helper/main_helper.pks @@ut3_tester_helper/run_helper.pks diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index 09bc29c24..d30814439 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -6,6 +6,10 @@ alter session set plsql_optimize_level=0; prompt Install user tests @@ut3_user/expectations/unary/test_expect_not_to_be_null.pks +@@ut3_user/expectations/unary/test_expect_to_be_null.pks +@@ut3_user/expectations/unary/test_expect_to_be_empty.pks +@@ut3_user/expectations/unary/test_expect_to_have_count.pks +@@ut3_user/expectations/unary/test_expect_to_be_true_false.pks @@ut3_user/expectations/binary/test_equal.pks @@ut3_user/expectations/binary/test_expect_to_be_less_than.pks @@ut3_user/expectations/binary/test_be_less_or_equal.pks @@ -17,6 +21,10 @@ prompt Install user tests @@ut3_user/api/test_ut_runner.pks @@ut3_user/expectations/unary/test_expect_not_to_be_null.pkb +@@ut3_user/expectations/unary/test_expect_to_be_null.pkb +@@ut3_user/expectations/unary/test_expect_to_be_empty.pkb +@@ut3_user/expectations/unary/test_expect_to_have_count.pkb +@@ut3_user/expectations/unary/test_expect_to_be_true_false.pkb @@ut3_user/expectations/binary/test_equal.pkb @@ut3_user/expectations/binary/test_expect_to_be_less_than.pkb @@ut3_user/expectations/binary/test_be_less_or_equal.pkb diff --git a/test/ut3_tester_helper/test_dummy_number.tps b/test/ut3_tester_helper/test_dummy_number.tps new file mode 100644 index 000000000..b6283c93b --- /dev/null +++ b/test/ut3_tester_helper/test_dummy_number.tps @@ -0,0 +1,14 @@ +declare + l_exists integer; +begin + select count(1) into l_exists from user_types where type_name = 'TEST_DUMMY_NUMBER'; + if l_exists > 0 then + execute immediate 'drop type test_dummy_number force'; + end if; +end; +/ + +create or replace type test_dummy_number as object ( + id number +) +/ diff --git a/test/ut3_user/expectations/unary/test_expect_to_be_empty.pkb b/test/ut3_user/expectations/unary/test_expect_to_be_empty.pkb new file mode 100644 index 000000000..3694850fe --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_to_be_empty.pkb @@ -0,0 +1,270 @@ +create or replace package body test_expect_to_be_empty is + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + procedure success_be_empty_cursor is + l_cursor sys_refcursor; + begin + --Arrange + open l_cursor for select * from dual where 1 = 2; + --Act + ut3.ut.expect(l_cursor).to_be_empty; + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_be_empty_cursor is + l_cursor sys_refcursor; + begin + --Arrange + open l_cursor for select * from dual; + --Act + ut3.ut.expect(l_cursor).to_be_empty; + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_be_empty_cursor_report is + l_cursor sys_refcursor; + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + open l_cursor for select * from dual; + --Act + ut3.ut.expect(l_cursor).to_be_empty; + + l_expected_message := q'[Actual: (refcursor [ count = 1 ])% + X% +was expected to be empty%%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure success_not_be_empty_cursor is + l_cursor sys_refcursor; + begin + --Arrange + open l_cursor for select * from dual; + --Act + ut3.ut.expect(l_cursor).not_to_be_empty; + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_not_be_empty_cursor is + l_cursor sys_refcursor; + begin + --Arrange + open l_cursor for select * from dual where 1 = 2; + --Act + ut3.ut.expect(l_cursor).not_to_be_empty; + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure success_be_empty_collection is + l_actual anydata; + begin + --Arrange + l_actual := anydata.convertcollection(ora_mining_varchar2_nt()); + -- Act + ut3.ut.expect(l_actual).to_be_empty(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_be_empty_collection is + l_actual anydata; + begin + --Arrange + l_actual := anydata.convertcollection(ora_mining_varchar2_nt('a')); + -- Act + ut3.ut.expect(l_actual).to_be_empty(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure success_not_be_empty_coll is + l_actual anydata; + begin + --Arrange + l_actual := anydata.convertcollection(ora_mining_varchar2_nt('a')); + -- Act + ut3.ut.expect(l_actual).not_to_be_empty(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_not_be_empty_collection is + l_actual anydata; + begin + --Arrange + l_actual := anydata.convertcollection(ora_mining_varchar2_nt()); + -- Act + ut3.ut.expect(l_actual).not_to_be_empty(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_be_empty_null_collection is + l_actual anydata; + l_data ora_mining_varchar2_nt; + begin + --Arrange + l_actual := anydata.convertcollection(l_data); + -- Act + ut3.ut.expect(l_actual).to_be_empty(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_not_be_empty_null_coll is + l_actual anydata; + l_data ora_mining_varchar2_nt; + begin + --Arrange + l_actual := anydata.convertcollection(l_data); + -- Act + ut3.ut.expect(l_actual).not_to_be_empty(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_be_empty_object is + l_actual anydata; + begin + --Arrange + l_actual := anydata.convertObject(ut3_tester_helper.test_dummy_number(1)); + -- Act + ut3.ut.expect(l_actual).to_be_empty(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_be_empty_null_object is + l_actual anydata; + l_data ut3_tester_helper.test_dummy_number; + begin + --Arrange + l_actual := anydata.convertObject(l_data); + -- Act + ut3.ut.expect(l_actual).to_be_empty(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_be_empty_number is + begin + -- Act + ut3.ut.expect( 1 ).to_( ut3.be_empty() ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + /** + * https://docs.oracle.com/en/database/oracle/oracle-database/18/adobj/declaring-initializing-objects-in-plsql.html#GUID-23135172-82E2-4C3E-800D-E584B43B578E + * User-defined types, just like collections, are atomically null, until you initialize the object by calling the constructor for its object type. That is, the object itself is null, not just its attributes. + */ + procedure fail_not_be_empty_object is + l_actual anydata; + begin + --Arrange + l_actual := anydata.convertObject(ut3_tester_helper.test_dummy_number(1)); + -- Act + ut3.ut.expect(l_actual).not_to_be_empty(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_not_be_empty_null_object is + l_actual anydata; + l_data ut3_tester_helper.test_dummy_number; + begin + --Arrange + l_actual := anydata.convertObject(l_data); + -- Act + ut3.ut.expect(l_actual).not_to_be_empty(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_not_be_empty_number is + begin + -- Act + ut3.ut.expect( 1 ).not_to( ut3.be_empty() ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure success_be_empty_clob is + begin + -- Act + ut3.ut.expect( empty_clob() ).to_( ut3.be_empty() ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_be_empty_clob is + begin + -- Act + ut3.ut.expect( to_clob(' ') ).to_( ut3.be_empty() ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure success_be_empty_blob is + begin + -- Act + ut3.ut.expect( empty_blob() ).to_( ut3.be_empty() ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_be_empty_blob is + begin + -- Act + ut3.ut.expect( to_blob('AA') ).to_( ut3.be_empty() ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + + procedure fail_not_be_empty_clob is + begin + -- Act + ut3.ut.expect( empty_clob() ).not_to( ut3.be_empty() ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure success_not_be_empty_clob is + begin + -- Act + ut3.ut.expect( to_clob(' ') ).not_to( ut3.be_empty() ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_not_be_empty_blob is + begin + -- Act + ut3.ut.expect( empty_blob() ).not_to( ut3.be_empty() ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure success_not_be_empty_blob is + begin + -- Act + ut3.ut.expect( to_blob('AA') ).not_to( ut3.be_empty() ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + +end; +/ \ No newline at end of file diff --git a/test/ut3_user/expectations/unary/test_expect_to_be_empty.pks b/test/ut3_user/expectations/unary/test_expect_to_be_empty.pks new file mode 100644 index 000000000..a76787ac5 --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_to_be_empty.pks @@ -0,0 +1,93 @@ +create or replace package test_expect_to_be_empty is + + --%suite + --%suitepath(utplsql.test_user.expectations.unary) + + --%aftereach + procedure cleanup_expectations; + + --%context(to_be_empty) + + --%test(Gives success for an empty cursor) + procedure success_be_empty_cursor; + + --%test(Gives failure for a non empty cursor) + procedure fail_be_empty_cursor; + + --%test(Reports the content of cursor when cursor is not empty) + procedure fail_be_empty_cursor_report; + + --%test(Gives success for an empty collection) + procedure success_be_empty_collection; + + --%test(Gives failure for a non empty collection) + procedure fail_be_empty_collection; + + --%test(Gives failure for a NULL collection) + procedure fail_be_empty_null_collection; + + --%test(Gives failure for an object) + procedure fail_be_empty_object; + + --%test(Gives failure for a null object) + procedure fail_be_empty_null_object; + + --%test(Gives failure for number) + procedure fail_be_empty_number; + + --%test(Gives success for an empty CLOB) + procedure success_be_empty_clob; + + --%test(Gives failure for a non empty CLOB) + procedure fail_be_empty_clob; + + --%test(Gives success for an empty BLOB) + procedure success_be_empty_blob; + + --%test(Gives failure for a non empty BLOB) + procedure fail_be_empty_blob; + + --%endcontext + + --%context(not_to_be_empty) + + --%test(Gives failure for an empty cursor) + procedure fail_not_be_empty_cursor; + + --%test(Gives success for a non empty cursor) + procedure success_not_be_empty_cursor; + + --%test(Gives success for a non empty collection) + procedure success_not_be_empty_coll; + + --%test(Gives failure for an empty collection) + procedure fail_not_be_empty_collection; + + --%test(Gives failure for an empty collection) + procedure fail_not_be_empty_null_coll; + + --%test(Gives failure for an empty object) + procedure fail_not_be_empty_object; + + --%test(Gives failure for a null object) + procedure fail_not_be_empty_null_object; + + --%test(Gives failure for number) + procedure fail_not_be_empty_number; + + --%test(Gives failure for an empty CLOB) + procedure fail_not_be_empty_clob; + + --%test(Gives success for a non empty CLOB) + procedure success_not_be_empty_clob; + + --%test(Gives failure for an empty BLOB) + procedure fail_not_be_empty_blob; + + --%test(Gives success for a non empty BLOB) + procedure success_not_be_empty_blob; + + --%endcontext + +end; +/ diff --git a/test/ut3_user/expectations/unary/test_expect_to_be_null.pkb b/test/ut3_user/expectations/unary/test_expect_to_be_null.pkb new file mode 100644 index 000000000..c0899c08d --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_to_be_null.pkb @@ -0,0 +1,260 @@ +create or replace package body test_expect_to_be_null +is + gc_object_name constant varchar2(30) := 't_to_be_null_test'; + gc_nested_table_name constant varchar2(30) := 'tt_to_be_null_test'; + gc_varray_name constant varchar2(30) := 'tv_to_be_null_test'; + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + procedure create_types is + pragma autonomous_transaction; + begin + execute immediate 'create type ' || gc_object_name || ' is object (dummy number)'; + execute immediate 'create type ' || gc_nested_table_name || ' is table of number'; + execute immediate 'create type ' || gc_varray_name || ' is varray(1) of number'; + end; + + procedure drop_types is + pragma autonomous_transaction; + begin + execute immediate 'drop type ' || gc_object_name; + execute immediate 'drop type ' || gc_nested_table_name; + execute immediate 'drop type ' || gc_varray_name; + end; + + procedure null_blob is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'blob', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure null_boolean is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'boolean', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure null_clob is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'clob', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure null_date is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'date', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure null_number is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'number', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure null_timestamp is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'timestamp', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure null_timestamp_with_ltz is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'timestamp with local time zone', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure null_timestamp_with_tz is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'timestamp with time zone', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure null_varchar2 is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'varchar2(4000)', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure null_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'anydata', 'null' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure uninit_object_in_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'to_be_null', gc_object_name, 'null', 'object' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure uninit_nested_table_in_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'to_be_null', gc_nested_table_name, 'null', 'collection' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure uninit_varray_in_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( 'to_be_null', gc_varray_name, + 'null', 'collection' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure blob_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'blob', 'to_blob(''abc'')' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure empty_blob is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'blob', 'empty_blob()' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure boolean_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'boolean', 'true' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure clob_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'clob', 'to_clob(''abc'')' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure empty_clob is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'clob', 'empty_clob()' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure date_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'date', 'sysdate' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure number_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'number', '1234' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure timestamp_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'timestamp', 'systimestamp' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure timestamp_with_ltz_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( + 'to_be_null', 'timestamp with local time zone', 'systimestamp' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure timestamp_with_tz_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( + 'to_be_null', 'timestamp with time zone', 'systimestamp' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure varchar2_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block( 'to_be_null', 'varchar2(4000)', '''abc''' ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure initialized_object is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'to_be_null', gc_object_name, gc_object_name || '(1)', 'object' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure initialized_nested_table is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'to_be_null', gc_nested_table_name, gc_nested_table_name || '()', 'collection' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure initialized_varray is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'to_be_null', gc_varray_name, gc_varray_name || '()', 'collection' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + +end test_expect_to_be_null; +/ diff --git a/test/ut3_user/expectations/unary/test_expect_to_be_null.pks b/test/ut3_user/expectations/unary/test_expect_to_be_null.pks new file mode 100644 index 000000000..f1758316e --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_to_be_null.pks @@ -0,0 +1,97 @@ +create or replace package test_expect_to_be_null +is + --%suite(to_be_null) + --%suitepath(utplsql.test_user.expectations.unary) + + --%aftereach + procedure cleanup_expectations; + + --%beforeall + procedure create_types; + + --%afterall + procedure drop_types; + + --%test(Gives success with null blob) + procedure null_blob; + + --%test(Gives success with null boolean) + procedure null_boolean; + + --%test(Gives success with null clob) + procedure null_clob; + + --%test(Gives success with null date) + procedure null_date; + + --%test(Gives success with null number) + procedure null_number; + + --%test(Gives success null timestamp) + procedure null_timestamp; + + --%test(Gives success with null timestamp with local time zone) + procedure null_timestamp_with_ltz; + + --%test(Gives success with null timestamp with time zone) + procedure null_timestamp_with_tz; + + --%test(Gives success with null varchar2) + procedure null_varchar2; + + --%test(Gives success with null anydata) + procedure null_anydata; + + --%test(Gives success with uninitialized object within anydata) + procedure uninit_object_in_anydata; + + --%test(Gives success with uninitialized nested table within anydata) + procedure uninit_nested_table_in_anydata; + + --%test(Gives success with uninitialized varray within anydata) + procedure uninit_varray_in_anydata; + + --%test(Gives failure for not null blob) + procedure blob_not_null; + + --%test(Gives failure with empty blob) + procedure empty_blob; + + --%test(Gives failure for not null boolean) + procedure boolean_not_null; + + --%test(Gives failure for not null clob) + procedure clob_not_null; + + --%test(Gives failure with empty clob) + procedure empty_clob; + + --%test(Gives failure for not null date) + procedure date_not_null; + + --%test(Gives failure for not null number) + procedure number_not_null; + + --%test(Gives failure for not null timestamp) + procedure timestamp_not_null; + + --%test(Gives failure for not null timestamp with local time zone) + procedure timestamp_with_ltz_not_null; + + --%test(Gives failure for not null timestamp with time zone) + procedure timestamp_with_tz_not_null; + + --%test(Gives failure for not null varchar2) + procedure varchar2_not_null; + + --%test(Gives failure for initialized object within anydata) + procedure initialized_object; + + --%test(Gives failure for initialized nested table within anydata) + procedure initialized_nested_table; + + --%test(Gives failure for initialized varray within anydata) + procedure initialized_varray; + +end test_expect_to_be_null; +/ diff --git a/test/ut3_user/expectations/unary/test_expect_to_be_true_false.pkb b/test/ut3_user/expectations/unary/test_expect_to_be_true_false.pkb new file mode 100644 index 000000000..6a621c6b3 --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_to_be_true_false.pkb @@ -0,0 +1,139 @@ +create or replace package body test_expect_to_be_true_false +is + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + procedure to_be_true_null_boolean is + begin + --Act + ut3.ut.expect( 1=null ).to_be_true(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure to_be_true_success is + begin + --Act + ut3.ut.expect( 1=1 ).to_be_true(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure to_be_true_failure is + begin + --Act + ut3.ut.expect( 1=2 ).to_be_true(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure to_be_true_bad_type is + begin + --Act + ut3.ut.expect( 1 ).to_be_true(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_to_be_true_null_boolean is + begin + --Act + ut3.ut.expect( 1=null ).not_to_be_true(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_to_be_true_success is + begin + --Act + ut3.ut.expect( 1=2 ).not_to_be_true(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure not_to_be_true_failure is + begin + --Act + ut3.ut.expect( 1=1 ).not_to_be_true(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + + procedure not_to_be_true_bad_type is + begin + --Act + ut3.ut.expect( 1 ).not_to_be_true(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure to_be_false_null_boolean is + begin + --Act + ut3.ut.expect( 1=null ).to_be_false(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure to_be_false_success is + begin + --Act + ut3.ut.expect( 1=2 ).to_be_false(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure to_be_false_failure is + begin + --Act + ut3.ut.expect( 1=1 ).to_be_false(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure to_be_false_bad_type is + begin + --Act + ut3.ut.expect( 1 ).to_be_false(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_to_be_false_null_boolean is + begin + --Act + ut3.ut.expect( 1=null ).not_to_be_false(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_to_be_false_success is + begin + --Act + ut3.ut.expect( 1=1 ).not_to_be_false(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure not_to_be_false_failure is + begin + --Act + ut3.ut.expect( 1=2 ).not_to_be_false(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure not_to_be_false_bad_type is + begin + --Act + ut3.ut.expect( 1 ).not_to_be_false(); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + +end; +/ diff --git a/test/ut3_user/expectations/unary/test_expect_to_be_true_false.pks b/test/ut3_user/expectations/unary/test_expect_to_be_true_false.pks new file mode 100644 index 000000000..28bbae6f7 --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_to_be_true_false.pks @@ -0,0 +1,58 @@ +create or replace package test_expect_to_be_true_false +is + --%suite(to_be_true/false) + --%suitepath(utplsql.test_user.expectations.unary) + + --%aftereach + procedure cleanup_expectations; + + --%test(to_be_true - Gives failure with null boolean) + procedure to_be_true_null_boolean; + + --%test(to_be_true - Gives success with true expression) + procedure to_be_true_success; + + --%test(to_be_true - Gives failure with false expression) + procedure to_be_true_failure; + + --%test(to_be_true - Gives failure with non-boolean data type) + procedure to_be_true_bad_type; + + --%test(not_to_be_true - Gives failure with null boolean) + procedure not_to_be_true_null_boolean; + + --%test(not_to_be_true - Gives failure with true expression) + procedure not_to_be_true_success; + + --%test(not_to_be_true - Gives success with false expression) + procedure not_to_be_true_failure; + + --%test(not_to_be_true - Gives failure with non-boolean data type) + procedure not_to_be_true_bad_type; + + --%test(to_be_false - Gives failure with null boolean) + procedure to_be_false_null_boolean; + + --%test(to_be_false - Gives failure with true expression) + procedure to_be_false_success; + + --%test(to_be_false - Gives success with false expression) + procedure to_be_false_failure; + + --%test(to_be_false - Gives failure with non-boolean data type) + procedure to_be_false_bad_type; + + --%test(not_to_be_false - Gives failure with null boolean) + procedure not_to_be_false_null_boolean; + + --%test(not_to_be_false - Gives success with true expression) + procedure not_to_be_false_success; + + --%test(not_to_be_false - Gives failure with false expression) + procedure not_to_be_false_failure; + + --%test(not_to_be_false - Gives failure with non-boolean data type) + procedure not_to_be_false_bad_type; + +end; +/ diff --git a/test/ut3_user/expectations/unary/test_expect_to_have_count.pkb b/test/ut3_user/expectations/unary/test_expect_to_have_count.pkb new file mode 100644 index 000000000..327ced120 --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_to_have_count.pkb @@ -0,0 +1,210 @@ +create or replace package body test_expect_to_have_count is + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + procedure success_have_count_cursor is + l_cursor sys_refcursor; + begin + --Arrange + open l_cursor for select * from dual connect by level <= 11; + --Act + ut3.ut.expect(l_cursor).to_have_count(11); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_have_count_cursor is + l_cursor sys_refcursor; + begin + --Arrange + open l_cursor for select * from dual where 0=1; + --Act + ut3.ut.expect(l_cursor).to_have_count(1); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_have_count_cursor_report is + l_cursor sys_refcursor; + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + --Arrange + open l_cursor for select * from dual; + --Act + ut3.ut.expect(l_cursor).to_have_count(2); + + l_expected_message := q'[Actual: (refcursor [ count = 1 ]) was expected to have [ count = 2 ]%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure success_not_have_count_cursor is + l_cursor sys_refcursor; + begin + --Arrange + open l_cursor for select * from dual; + --Act + ut3.ut.expect(l_cursor).not_to_have_count(2); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_not_have_count_cursor is + l_cursor sys_refcursor; + begin + --Arrange + open l_cursor for select * from dual where 1 = 2; + --Act + ut3.ut.expect(l_cursor).not_to_have_count(0); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure success_have_count_collection is + l_actual anydata; + begin + --Arrange + l_actual := anydata.convertcollection(ora_mining_varchar2_nt()); + -- Act + ut3.ut.expect(l_actual).to_have_count(0); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_have_count_collection is + l_actual anydata; + begin + --Arrange + l_actual := anydata.convertcollection(ora_mining_varchar2_nt('a')); + -- Act + ut3.ut.expect(l_actual).to_have_count(0); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure success_not_have_count_coll is + l_actual anydata; + begin + --Arrange + l_actual := anydata.convertcollection(ora_mining_varchar2_nt('a')); + -- Act + ut3.ut.expect(l_actual).not_to_have_count(2); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_not_have_count_coll is + l_actual anydata; + begin + --Arrange + l_actual := anydata.convertcollection(ora_mining_varchar2_nt()); + -- Act + ut3.ut.expect(l_actual).not_to_have_count(0); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_have_count_null_coll is + l_actual anydata; + l_data ora_mining_varchar2_nt; + begin + --Arrange + l_actual := anydata.convertcollection(l_data); + -- Act + ut3.ut.expect(l_actual).to_have_count(0); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_not_have_count_null_coll is + l_actual anydata; + l_data ora_mining_varchar2_nt; + begin + --Arrange + l_actual := anydata.convertcollection(l_data); + -- Act + ut3.ut.expect(l_actual).not_to_have_count(0); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_have_count_object is + l_actual anydata; + begin + --Arrange + l_actual := anydata.convertObject(ut3_tester_helper.test_dummy_number(1)); + -- Act + ut3.ut.expect(l_actual).to_have_count(0); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_have_count_null_object is + l_actual anydata; + l_data ut3_tester_helper.test_dummy_number; + begin + --Arrange + l_actual := anydata.convertObject(l_data); + -- Act + ut3.ut.expect(l_actual).to_have_count(0); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_have_count_number is + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Act + ut3.ut.expect( 1 ).to_( ut3.have_count(0) ); + --Assert + l_expected_message := q'[%The matcher 'have count' cannot be used with data type (number).%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure fail_not_have_count_object is + l_actual anydata; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + --Arrange + l_actual := anydata.convertObject(ut3_tester_helper.test_dummy_number(1)); + -- Act + ut3.ut.expect(l_actual).not_to_have_count(0); + --Assert + l_expected_message := q'[%The matcher 'have count' cannot be used with data type (ut3_tester_helper.test_dummy_number).%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure fail_not_have_count_null_obj is + l_actual anydata; + l_data ut3_tester_helper.test_dummy_number; + begin + --Arrange + l_actual := anydata.convertObject(l_data); + -- Act + ut3.ut.expect(l_actual).not_to_have_count(0); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure fail_not_have_count_number is + begin + -- Act + ut3.ut.expect( 1 ).not_to( ut3.have_count(0) ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + +end; +/ \ No newline at end of file diff --git a/test/ut3_user/expectations/unary/test_expect_to_have_count.pks b/test/ut3_user/expectations/unary/test_expect_to_have_count.pks new file mode 100644 index 000000000..b944d8800 --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_to_have_count.pks @@ -0,0 +1,61 @@ +create or replace package test_expect_to_have_count is + + --%suite((not)to_have_count) + --%suitepath(utplsql.test_user.expectations.unary) + + --%aftereach + procedure cleanup_expectations; + + --%test(Gives success for an empty cursor) + procedure success_have_count_cursor; + + --%test(Gives failure for a non empty cursor) + procedure fail_have_count_cursor; + + --%test(Reports the content of cursor when cursor is not empty) + procedure fail_have_count_cursor_report; + + --%test(Negated - Gives success for a non empty cursor) + procedure success_not_have_count_cursor; + + --%test(Negated - Gives failure for an empty cursor) + procedure fail_not_have_count_cursor; + + --%test(Gives success for an empty collection) + procedure success_have_count_collection; + + --%test(Gives failure for a non empty collection) + procedure fail_have_count_collection; + + --%test(Negated - Gives success for a non empty collection) + procedure success_not_have_count_coll; + + --%test(Negated - Gives failure for an empty collection) + procedure fail_not_have_count_coll; + + --%test(Gives failure for a NULL collection) + procedure fail_have_count_null_coll; + + --%test(Negated - Gives failure for an empty collection) + procedure fail_not_have_count_null_coll; + + --%test(Gives failure for an object) + procedure fail_have_count_object; + + --%test(Gives failure for a null object) + procedure fail_have_count_null_object; + + --%test(Gives failure for number) + procedure fail_have_count_number; + + --%test(Negated - Gives failure for an object) + procedure fail_not_have_count_object; + + --%test(Negated - Gives failure for a null object) + procedure fail_not_have_count_null_obj; + + --%test(Negated - Gives failure for number) + procedure fail_not_have_count_number; + +end; +/ From 99e1099682dbdedfbac37a62598404aeda2f89ef Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 25 Mar 2019 17:08:45 +0000 Subject: [PATCH 018/181] Adding schema prefix to failing tests from 12.1 --- .../core/annotations/test_before_after_annotations.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ut3_tester/core/annotations/test_before_after_annotations.pkb b/test/ut3_tester/core/annotations/test_before_after_annotations.pkb index 804508c61..9ee917d84 100644 --- a/test/ut3_tester/core/annotations/test_before_after_annotations.pkb +++ b/test/ut3_tester/core/annotations/test_before_after_annotations.pkb @@ -200,7 +200,7 @@ create or replace package body test_before_after_annotations is execute immediate l_test_package_body; --Execute the tests and collect the results - select * bulk collect into l_test_results from table(ut3.ut.run(('dummy_before_after_test'))); + select * bulk collect into l_test_results from table(ut3.ut.run(('ut3_tester.dummy_before_after_test'))); execute immediate 'drop package dummy_before_after_test'; execute immediate 'drop package shared_test_package'; From 04cd36c46a9841ef60d7af6e3134e7cd68c2f481 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 25 Mar 2019 17:19:40 +0000 Subject: [PATCH 019/181] Fixing development scripts --- development/cleanup.sh | 2 +- development/install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/development/cleanup.sh b/development/cleanup.sh index 086db6786..fb0415ed1 100755 --- a/development/cleanup.sh +++ b/development/cleanup.sh @@ -3,7 +3,7 @@ #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" -#. development/env.sh +. development/env.sh "${SQLCLI}" sys/${ORACLE_PWD}@//${CONNECTION_STR} AS SYSDBA <<-SQL set echo on diff --git a/development/install.sh b/development/install.sh index 86d7e4da2..4104e2672 100755 --- a/development/install.sh +++ b/development/install.sh @@ -3,7 +3,7 @@ #goto git root directory git rev-parse && cd "$(git rev-parse --show-cdup)" -#. development/env.sh +. development/env.sh header="******************************************************************************************" if ! development/cleanup.sh; then From 3e98723bc0065127b4dfd9263536f4f3daaff534 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Mon, 25 Mar 2019 22:34:34 +0000 Subject: [PATCH 020/181] Fixed bug for deployments with uninstall included. Added new user to `template.env.sh` --- .travis/install.sh | 1 + development/template.env.sh | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.travis/install.sh b/.travis/install.sh index a6ab0cc16..3284d5aa6 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -47,6 +47,7 @@ SQL alter session set plsql_optimize_level=0; @install.sql $UT3_OWNER + @@@create_synonyms_and_grants_for_public.sql $UT3_OWNER SQL fi diff --git a/development/template.env.sh b/development/template.env.sh index b19f63ec7..285b60577 100755 --- a/development/template.env.sh +++ b/development/template.env.sh @@ -13,6 +13,8 @@ export UT3_OWNER_PASSWORD=ut3 export UT3_RELEASE_VERSION_SCHEMA=ut3_latest_release export UT3_TESTER=ut3_tester export UT3_TESTER_PASSWORD=ut3 +export UT3_TESTER_HELPER=ut3_tester_helper +export UT3_TESTER_HELPER_PASSWORD=ut3 export UT3_TABLESPACE=users export UT3_USER="UT3\$USER#" export UT3_USER_PASSWORD=ut3 From 76b0d562cdc39f15b006f5f06e37f5517e57af64 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Tue, 26 Mar 2019 01:09:41 +0000 Subject: [PATCH 021/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index a2893d370..ce0e56c57 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 5d89726af..36a8ef952 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index bddb264dd..617a4db1d 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index e9b56bee3..35d465fc1 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 305afe3d4..2ccaae623 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 64a242840..0bf324e36 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index de5d76f16..91da18b31 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 8b68d667b..f574b8e81 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index e154a77b1..8424a8d14 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index af60ac266..8da42b6b8 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 3b6e7ce45..492804991 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 2621221e5..3314ed467 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 4091584b4..2d6d7cb6c 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 2b25f2ae5..92cfd1e85 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index b7d114bcf..dd3aff030 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 4abe304b5..349bb0a05 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 70dd4c551..de9c3a64e 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2737--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index da8f0c2dd..c51d18d48 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2737-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2748-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 0bf1d9e33372c40163dd0998bba7ab6211b66c11 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Tue, 26 Mar 2019 07:25:30 +0000 Subject: [PATCH 022/181] FIX : removal of non existing types from uninstall script --- source/uninstall_objects.sql | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index 62d14cb58..4c7a86156 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -137,10 +137,6 @@ drop type ut_data_value_boolean force; drop type ut_data_value_blob force; -drop type ut_data_value_object force; - -drop type ut_data_value_collection force; - drop type ut_data_value_anydata force; drop type ut_data_value_xmltype force; From e914d960d03c1042af7fd1743f91bb0e03008ba4 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Tue, 26 Mar 2019 07:36:35 +0000 Subject: [PATCH 023/181] INSTALL:Is it too many monkeys ?:) --- .travis/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/install.sh b/.travis/install.sh index 3284d5aa6..a6a8a60b0 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -47,7 +47,7 @@ SQL alter session set plsql_optimize_level=0; @install.sql $UT3_OWNER - @@@create_synonyms_and_grants_for_public.sql $UT3_OWNER + @create_synonyms_and_grants_for_public.sql $UT3_OWNER SQL fi From 23da3d7e1e08a89915947dff20cc55ca0ad05bf1 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Tue, 19 Mar 2019 19:56:20 +0000 Subject: [PATCH 024/181] Added support for random order of test execution. Resolves #422 --- development/cleanup.sh | 5 +- source/api/ut.pkb | 122 +++++++++++++----- source/api/ut.pks | 48 +++++-- source/api/ut_runner.pkb | 27 ++-- source/api/ut_runner.pks | 4 +- .../annotations/ut_annotation_manager.pkb | 33 +++++ .../annotations/ut_annotation_manager.pks | 3 + source/core/types/ut_run.tpb | 23 ++-- source/core/types/ut_run.tps | 18 +-- source/core/ut_suite_manager.pkb | 58 ++++++--- source/core/ut_suite_manager.pks | 8 +- .../reporters/ut_documentation_reporter.tpb | 3 + test/api/test_ut_run.pkb | 51 ++++++++ test/api/test_ut_run.pks | 16 +++ 14 files changed, 322 insertions(+), 97 deletions(-) diff --git a/development/cleanup.sh b/development/cleanup.sh index 3b6e22e53..989be30b9 100755 --- a/development/cleanup.sh +++ b/development/cleanup.sh @@ -7,6 +7,7 @@ git rev-parse && cd "$(git rev-parse --show-cdup)" "${SQLCLI}" sys/${ORACLE_PWD}@//${CONNECTION_STR} AS SYSDBA <<-SQL set echo on +set serveroutput on begin for x in ( select * from dba_objects @@ -25,12 +26,12 @@ drop user ${UT3_USER} cascade; begin for i in ( - select decode(owner,'PUBLIC','drop public synonym "','drop synonym "'||owner||'"."')|| synonym_name ||'"' drop_orphaned_synonym from dba_synonyms a + select decode(owner,'PUBLIC','drop public synonym "','drop synonym "'||owner||'"."')|| synonym_name ||'"' drop_orphaned_synonym, owner||'.'||synonym_name syn from dba_synonyms a where not exists (select 1 from dba_objects b where (a.table_name=b.object_name and a.table_owner=b.owner or b.owner='SYS' and a.table_owner=b.object_name) ) and a.table_owner not in ('SYS','SYSTEM') ) loop - dbms_output.put_line(i.drop_orphaned_synonym); execute immediate i.drop_orphaned_synonym; + dbms_output.put_line('synonym '||i.syn||' dropped'); end loop; end; / diff --git a/source/api/ut.pkb b/source/api/ut.pkb index eb4a06bc3..5e13dcc62 100644 --- a/source/api/ut.pkb +++ b/source/api/ut.pkb @@ -113,12 +113,14 @@ create or replace package body ut is a_paths ut_varchar2_list, a_reporter in out nocopy ut_reporter_base, a_color_console integer, - a_coverage_schemes ut_varchar2_list := null, + 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 := null + a_client_character_set varchar2, + a_random_test_order integer, + a_random_test_order_seed positive ) is pragma autonomous_transaction; begin @@ -133,7 +135,10 @@ create or replace package body ut is a_include_objects, a_exclude_objects, gc_fail_on_errors, - a_client_character_set + a_client_character_set, + false, + ut_utils.int_to_boolean(a_random_test_order), + a_random_test_order_seed ); rollback; end; @@ -142,12 +147,14 @@ create or replace package body ut is a_paths ut_varchar2_list, a_reporter in out nocopy ut_reporter_base, a_color_console integer, - a_coverage_schemes ut_varchar2_list := null, + 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 := null + a_client_character_set varchar2, + a_random_test_order integer, + a_random_test_order_seed positive ) is pragma autonomous_transaction; begin @@ -162,7 +169,10 @@ create or replace package body ut is a_include_objects, a_exclude_objects, gc_fail_on_errors, - a_client_character_set + a_client_character_set, + false, + ut_utils.int_to_boolean(a_random_test_order), + a_random_test_order_seed ); rollback; end; @@ -200,7 +210,9 @@ create or replace package body ut is 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -214,7 +226,9 @@ create or replace package body ut is a_test_file_mappings, a_include_objects, a_exclude_objects, - a_client_character_set + a_client_character_set, + a_random_test_order, + a_random_test_order_seed ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -233,7 +247,9 @@ create or replace package body ut is 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -247,7 +263,9 @@ create or replace package body ut is a_test_files, a_include_objects, a_exclude_objects, - a_client_character_set + a_client_character_set, + a_random_test_order, + a_random_test_order_seed ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -267,7 +285,9 @@ create or replace package body ut is 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -281,7 +301,9 @@ create or replace package body ut is a_test_file_mappings, a_include_objects, a_exclude_objects, - a_client_character_set + a_client_character_set, + a_random_test_order, + a_random_test_order_seed ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -301,7 +323,9 @@ create or replace package body ut is 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -315,7 +339,9 @@ create or replace package body ut is a_test_files, a_include_objects, a_exclude_objects, - a_client_character_set + a_client_character_set, + a_random_test_order, + a_random_test_order_seed ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -335,7 +361,9 @@ create or replace package body ut is 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -349,7 +377,9 @@ create or replace package body ut is a_test_file_mappings, a_include_objects, a_exclude_objects, - a_client_character_set + a_client_character_set, + a_random_test_order, + a_random_test_order_seed ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -369,7 +399,9 @@ create or replace package body ut is 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -383,7 +415,9 @@ create or replace package body ut is a_test_files, a_include_objects, a_exclude_objects, - a_client_character_set + a_client_character_set, + a_random_test_order, + a_random_test_order_seed ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -404,7 +438,9 @@ create or replace package body ut is 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ) is l_reporter ut_reporter_base := a_reporter; begin @@ -421,7 +457,9 @@ create or replace package body ut is a_exclude_objects, gc_fail_on_errors, a_client_character_set, - a_force_manual_rollback + a_force_manual_rollback, + a_random_test_order, + a_random_test_order_seed ); else run_autonomous( @@ -433,7 +471,9 @@ create or replace package body ut is a_test_file_mappings, a_include_objects, a_exclude_objects, - a_client_character_set + a_client_character_set, + ut_utils.boolean_to_int(a_random_test_order), + a_random_test_order_seed ); end if; if l_reporter is of (ut_output_reporter_base) then @@ -452,7 +492,9 @@ create or replace package body ut is 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ) is l_reporter ut_reporter_base := a_reporter; begin @@ -466,7 +508,9 @@ create or replace package body ut is a_include_objects, a_exclude_objects, a_client_character_set, - a_force_manual_rollback + a_force_manual_rollback, + a_random_test_order, + a_random_test_order_seed ); end; @@ -479,7 +523,9 @@ create or replace package body ut is 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ) is begin ut.run( @@ -492,7 +538,9 @@ create or replace package body ut is a_include_objects, a_exclude_objects, a_client_character_set, - a_force_manual_rollback + a_force_manual_rollback, + a_random_test_order, + a_random_test_order_seed ); end; @@ -505,7 +553,9 @@ create or replace package body ut is 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ) is begin ut.run( @@ -518,7 +568,9 @@ create or replace package body ut is a_include_objects, a_exclude_objects, a_client_character_set, - a_force_manual_rollback + a_force_manual_rollback, + a_random_test_order, + a_random_test_order_seed ); end; @@ -532,7 +584,9 @@ create or replace package body ut is 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ) is begin ut.run( @@ -545,7 +599,9 @@ create or replace package body ut is a_include_objects, a_exclude_objects, a_client_character_set, - a_force_manual_rollback + a_force_manual_rollback, + a_random_test_order, + a_random_test_order_seed ); end; @@ -559,7 +615,9 @@ create or replace package body ut is 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ) is begin ut.run( @@ -572,7 +630,9 @@ create or replace package body ut is a_include_objects, a_exclude_objects, a_client_character_set, - a_force_manual_rollback + a_force_manual_rollback, + a_random_test_order, + a_random_test_order_seed ); end; diff --git a/source/api/ut.pks b/source/api/ut.pks index 25c9e6493..7d3b191b3 100644 --- a/source/api/ut.pks +++ b/source/api/ut.pks @@ -55,7 +55,9 @@ create or replace package ut authid current_user as 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined; function run( @@ -66,7 +68,9 @@ create or replace package ut authid current_user as 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined; function run( @@ -78,7 +82,9 @@ create or replace package ut authid current_user as 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined; function run( @@ -90,7 +96,9 @@ create or replace package ut authid current_user as 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined; function run( @@ -102,7 +110,9 @@ create or replace package ut authid current_user as 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined; function run( @@ -114,7 +124,9 @@ create or replace package ut authid current_user as 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_client_character_set varchar2 := null, + a_random_test_order integer := 0, + a_random_test_order_seed positive := null ) return ut_varchar2_rows pipelined; procedure run( @@ -126,7 +138,9 @@ create or replace package ut authid current_user as 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ); procedure run( @@ -138,7 +152,9 @@ create or replace package ut authid current_user as 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ); procedure run( @@ -151,7 +167,9 @@ create or replace package ut authid current_user as 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ); procedure run( @@ -164,7 +182,9 @@ create or replace package ut authid current_user as 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ); procedure run( @@ -177,7 +197,9 @@ create or replace package ut authid current_user as 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ); procedure run( @@ -190,7 +212,9 @@ create or replace package ut authid current_user as 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ); /** diff --git a/source/api/ut_runner.pkb b/source/api/ut_runner.pkb index 10485c346..28ec1a610 100644 --- a/source/api/ut_runner.pkb +++ b/source/api/ut_runner.pkb @@ -88,13 +88,16 @@ create or replace package body ut_runner is 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ) is - l_run ut_run; - l_coverage_schema_names ut_varchar2_rows; - l_exclude_object_names ut_object_names := ut_object_names(); - l_include_object_names ut_object_names; - l_paths ut_varchar2_list := ut_varchar2_list(); + l_run ut_run; + l_coverage_schema_names ut_varchar2_rows; + l_exclude_object_names ut_object_names := ut_object_names(); + l_include_object_names ut_object_names; + l_paths ut_varchar2_list := ut_varchar2_list(); + l_random_test_order_seed positive; begin ut_event_manager.initialize(); if a_reporters is not empty then @@ -107,7 +110,12 @@ create or replace package body ut_runner is ut_event_manager.trigger_event(ut_event_manager.gc_initialize); ut_event_manager.trigger_event(ut_event_manager.gc_debug, ut_run_info()); - + if a_random_test_order_seed is not null then + l_random_test_order_seed := a_random_test_order_seed; + 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; if a_paths is null or a_paths is empty or a_paths.count = 1 and a_paths(1) is null then l_paths := ut_varchar2_list(sys_context('userenv', 'current_schema')); else @@ -144,10 +152,11 @@ create or replace package body ut_runner is l_include_object_names, set(a_source_file_mappings), set(a_test_file_mappings), - a_client_character_set + a_client_character_set, + l_random_test_order_seed ); - ut_suite_manager.configure_execution_by_path(l_paths, l_run.items); + ut_suite_manager.configure_execution_by_path(l_paths, l_run.items, l_random_test_order_seed); if a_force_manual_rollback then l_run.set_rollback_type( a_rollback_type => ut_utils.gc_rollback_manual, a_force => true ); end if; diff --git a/source/api/ut_runner.pks b/source/api/ut_runner.pks index e111933b5..ab2e1f6bb 100644 --- a/source/api/ut_runner.pks +++ b/source/api/ut_runner.pks @@ -68,7 +68,9 @@ create or replace package ut_runner authid current_user is 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_force_manual_rollback boolean := false, + a_random_test_order boolean := false, + a_random_test_order_seed positive := null ); /** diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 6dbe1d3ec..87ad51475 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -249,5 +249,38 @@ create or replace package body ut_annotation_manager as ut_annotation_cache_manager.purge_cache(a_object_owner, a_object_type); end; + function hash_suite_path(a_path varchar2, a_random_seed positiven) return varchar2 is + l_start_pos pls_integer := 1; + l_end_pos pls_integer := 1; + l_result varchar2(4000); + l_item varchar2(4000); + l_at_end boolean := false; + begin + if a_random_seed is null then + l_result := a_path; + end if; + if a_path is not null then + loop + l_end_pos := instr(a_path,'.',l_start_pos); + if l_end_pos = 0 then + l_end_pos := length(a_path)+1; + l_at_end := true; + end if; + l_item := substr(a_path,l_start_pos,l_end_pos-l_start_pos); + if l_item is not null then + l_result := + l_result || + dbms_crypto.hash( + to_char( dbms_utility.get_hash_value( l_item, 1, a_random_seed ) ), + dbms_crypto.hash_sh1 + ); + end if; + exit when l_at_end; + l_result := l_result || chr(0); + l_start_pos := l_end_pos + 1; + end loop; + end if; + return l_result; + end; end ut_annotation_manager; / diff --git a/source/core/annotations/ut_annotation_manager.pks b/source/core/annotations/ut_annotation_manager.pks index 829142bd5..25de25d58 100644 --- a/source/core/annotations/ut_annotation_manager.pks +++ b/source/core/annotations/ut_annotation_manager.pks @@ -51,5 +51,8 @@ create or replace package ut_annotation_manager authid current_user as */ procedure purge_cache(a_object_owner varchar2, a_object_type varchar2); + + function hash_suite_path(a_path varchar2, a_random_seed positiven) return varchar2; + end ut_annotation_manager; / diff --git a/source/core/types/ut_run.tpb b/source/core/types/ut_run.tpb index 21a5ef36e..d5ace34a7 100644 --- a/source/core/types/ut_run.tpb +++ b/source/core/types/ut_run.tpb @@ -18,23 +18,22 @@ create or replace type body ut_run as 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_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 ) return self as result is - l_coverage_schema_names ut_varchar2_rows; - l_coverage_options ut_coverage_options; - l_exclude_objects ut_object_names; - begin + begin self.run_paths := a_run_paths; self.self_type := $$plsql_unit; self.items := a_items; self.client_character_set := lower(a_client_character_set); + self.random_test_order_seed := a_random_test_order_seed; self.results_count := ut_results_counter(); self.test_file_mappings := coalesce(a_test_file_mappings, ut_file_mappings()); self.coverage_options := ut_coverage_options( diff --git a/source/core/types/ut_run.tps b/source/core/types/ut_run.tps index e4309e126..5d5e65367 100644 --- a/source/core/types/ut_run.tps +++ b/source/core/types/ut_run.tps @@ -24,16 +24,18 @@ create or replace type ut_run under ut_suite_item ( coverage_options ut_coverage_options, test_file_mappings ut_file_mappings, client_character_set varchar2(100), + random_test_order_seed number(38,0), 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_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 ) return self as result, overriding member procedure mark_as_skipped(self in out nocopy ut_run), overriding member function do_execute(self in out nocopy ut_run) return boolean, diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index e2098caf9..51d3fa1e4 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -355,11 +355,12 @@ create or replace package body ut_suite_manager is end; 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_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 ) return t_cached_suites_cursor is l_path varchar2( 4000 ); l_result sys_refcursor; @@ -452,16 +453,25 @@ create or replace package body ut_suite_manager is ) select c.* from items c - order by c.object_owner, - replace(case - when c.self_type in ( 'UT_TEST' ) - then substr(c.path, 1, instr(c.path, '.', -1) ) - else c.path - end, '.', chr(0)) desc nulls last, + order by c.object_owner,]'|| + case + when a_random_seed is null then q'[ + replace( + case + when c.self_type in ( 'UT_TEST' ) + then substr(c.path, 1, instr(c.path, '.', -1) ) + else c.path + end, '.', chr(0) + ) desc nulls last, c.object_name desc, - c.line_no]' - using l_path, l_path, upper(a_object_name), upper(a_procedure_name); - + c.line_no, + :a_random_seed]' + else + l_ut_owner||'.ut_annotation_manager.hash_suite_path( + c.path, :a_random_seed + ) desc nulls last' + end + using l_path, l_path, upper(a_object_name), upper(a_procedure_name), a_random_seed; return l_result; end; @@ -547,7 +557,8 @@ create or replace package body ut_suite_manager is a_path varchar2 := null, a_object_name varchar2 := null, a_procedure_name varchar2 := null, - a_suites in out nocopy ut_suite_items + a_suites in out nocopy ut_suite_items, + a_random_seed positive ) is begin refresh_cache(a_owner_name); @@ -559,7 +570,8 @@ create or replace package body ut_suite_manager is a_path, a_object_name, a_procedure_name, - can_skip_all_objects_scan(a_owner_name) + can_skip_all_objects_scan(a_owner_name), + a_random_seed ) ); @@ -588,7 +600,8 @@ create or replace package body ut_suite_manager is a_path, a_object_name, a_procedure_name, - a_skip_all_objects + a_skip_all_objects, + null ) ); return l_suites; @@ -639,14 +652,18 @@ create or replace package body ut_suite_manager is return resolve_schema_names(l_paths); end; - function configure_execution_by_path(a_paths in ut_varchar2_list) return ut_suite_items is + function configure_execution_by_path(a_paths ut_varchar2_list, a_random_seed positive := null) return ut_suite_items is l_suites ut_suite_items := ut_suite_items(); begin configure_execution_by_path(a_paths, l_suites ); return l_suites; end; - procedure configure_execution_by_path(a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items) is + procedure configure_execution_by_path( + a_paths in ut_varchar2_list, + a_suites out nocopy ut_suite_items, + a_random_seed in positive := null + ) is l_paths ut_varchar2_list := a_paths; l_path_items t_path_items; l_path_item t_path_item; @@ -671,7 +688,8 @@ create or replace package body ut_suite_manager is l_path_item.suite_path, l_path_item.object_name, l_path_item.procedure_name, - a_suites + a_suites, + a_random_seed ); if a_suites.count = l_suites_count then if l_path_item.suite_path is not null then diff --git a/source/core/ut_suite_manager.pks b/source/core/ut_suite_manager.pks index 5fd82f9be..debfd4ac1 100644 --- a/source/core/ut_suite_manager.pks +++ b/source/core/ut_suite_manager.pks @@ -37,7 +37,7 @@ create or replace package ut_suite_manager authid current_user is * @return array containing root suites-ready to be executed * */ - function configure_execution_by_path(a_paths in ut_varchar2_list) return ut_suite_items; + function configure_execution_by_path(a_paths ut_varchar2_list, a_random_seed positive := null) return ut_suite_items; /** * Builds a hierarchical suites based on given suite-paths @@ -46,7 +46,11 @@ create or replace package ut_suite_manager authid current_user is * @param a_suites returned array containing root suites-ready to be executed * */ - procedure configure_execution_by_path(a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items); + procedure configure_execution_by_path( + a_paths in ut_varchar2_list, + a_suites out nocopy ut_suite_items, + a_random_seed in positive := null + ); /** * Cleanup paths by removing leading/trailing whitespace and making paths lowercase diff --git a/source/reporters/ut_documentation_reporter.tpb b/source/reporters/ut_documentation_reporter.tpb index df6c25ab0..7cf9a02cc 100644 --- a/source/reporters/ut_documentation_reporter.tpb +++ b/source/reporters/ut_documentation_reporter.tpb @@ -209,6 +209,9 @@ create or replace type body ut_documentation_reporter is else self.print_green_text(l_summary_text); end if; + if a_run.random_test_order_seed is not null then + self.print_text('Tests were executed with random order seed '''||a_run.random_test_order_seed||'''.'); + end if; self.print_text(' '); (self as ut_reporter_base).after_calling_run(a_run); end; diff --git a/test/api/test_ut_run.pkb b/test/api/test_ut_run.pkb index 9e9fce0f7..48c45e712 100644 --- a/test/api/test_ut_run.pkb +++ b/test/api/test_ut_run.pkb @@ -1012,5 +1012,56 @@ Failures:% execute immediate 'drop package test_distributed_savepoint'; end; + procedure remove_time_from_results(a_results in out nocopy ut3.ut_varchar2_list) is + begin + for i in 1 .. a_results.count loop + a_results(i) := regexp_replace(a_results(i),'\[[0-9]*\.[0-9]+ sec\]',''); + a_results(i) := regexp_replace(a_results(i),'Finished in [0-9]*\.[0-9]+ seconds',''); + end loop; + end; + procedure run_with_random_order is + l_random_results ut3.ut_varchar2_list; + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_random_results + from table ( ut3.ut.run( 'ut3$user#.test_package_1', a_random_test_order_seed => 3 ) ); + select * bulk collect into l_results + from table ( ut3.ut.run( 'ut3$user#.test_package_1' ) ); + + remove_time_from_results(l_results); + remove_time_from_results(l_random_results); + l_random_results.delete(l_random_results.count-1); + + ut.expect(anydata.convertCollection(l_random_results)).to_equal(anydata.convertCollection(l_results)).unordered(); + ut.expect(anydata.convertCollection(l_random_results)).not_to_equal(anydata.convertCollection(l_results)); + end; + + procedure run_and_report_random_ord_seed is + l_actual ut3.ut_varchar2_list; + begin + select * bulk collect into l_actual + from table ( ut3.ut.run( 'ut3$user#.test_package_1', a_random_test_order_seed => 123456789 ) ); + + ut.expect( ut3.ut_utils.table_to_clob(l_actual) ).to_be_like( q'[%Tests were executed with random order seed '123456789'.%]' ); + end; + + procedure run_with_random_order_seed is + l_expected ut3.ut_varchar2_list; + l_actual ut3.ut_varchar2_list; + begin + + select * bulk collect into l_expected + from table ( ut3.ut.run( 'ut3$user#.test_package_1', a_random_test_order_seed => 3 ) ); + select * bulk collect into l_actual + from table ( ut3.ut.run( 'ut3$user#.test_package_1', a_random_test_order_seed => 3 ) ); + + remove_time_from_results(l_actual); + remove_time_from_results(l_expected); + l_actual.delete(l_actual.count); + l_expected.delete(l_expected.count); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).unordered(); + end; + end; / diff --git a/test/api/test_ut_run.pks b/test/api/test_ut_run.pks index 55d19e866..a2fae4b1f 100644 --- a/test/api/test_ut_run.pks +++ b/test/api/test_ut_run.pks @@ -144,5 +144,21 @@ create or replace package test_ut_run is procedure drop_bad_annot; --%endcontext + --%context(random_order) + --%displayname(Random test execution order) + --%beforeall(create_ut3$user#_tests) + --%afterall(drop_ut3$user#_tests) + + --%test(Runs tests in random order) + procedure run_with_random_order; + + --%test(Reports test random_test_order_seed) + procedure run_and_report_random_ord_seed; + + --%test(Runs tests in the same random order with provided seed) + procedure run_with_random_order_seed; + + --%endcontext + end; / From 174dcbc9a90ffa56a827dba5d61882ca7fb38330 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Tue, 26 Mar 2019 23:46:14 +0000 Subject: [PATCH 025/181] Adding set of tests: api/test_ut_run --- test/install_ut3_user_tests.sql | 2 + test/ut3_tester_helper/main_helper.pks | 2 +- test/ut3_tester_helper/run_helper.pkb | 309 ++++++++++++++++++++++++- test/ut3_tester_helper/run_helper.pks | 26 +++ 4 files changed, 327 insertions(+), 12 deletions(-) diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index d30814439..583c844be 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -19,6 +19,7 @@ prompt Install user tests @@ut3_user/expectations/test_expectation_anydata.pks @@ut3_user/expectations/test_expectations_cursor.pks @@ut3_user/api/test_ut_runner.pks +@@ut3_user/api/test_ut_run.pks @@ut3_user/expectations/unary/test_expect_not_to_be_null.pkb @@ut3_user/expectations/unary/test_expect_to_be_null.pkb @@ -34,6 +35,7 @@ prompt Install user tests @@ut3_user/expectations/test_expectation_anydata.pkb @@ut3_user/expectations/test_expectations_cursor.pkb @@ut3_user/api/test_ut_runner.pkb +@@ut3_user/api/test_ut_run.pkb set linesize 200 set define on diff --git a/test/ut3_tester_helper/main_helper.pks b/test/ut3_tester_helper/main_helper.pks index 8f904501f..dab973dfc 100644 --- a/test/ut3_tester_helper/main_helper.pks +++ b/test/ut3_tester_helper/main_helper.pks @@ -26,6 +26,6 @@ create or replace package main_helper is procedure reset_nulls_equal; procedure nulls_are_equal(a_nulls_equal boolean := true); - + end; / diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index 0ab574e9d..8b9353f38 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -48,18 +48,33 @@ create or replace package body run_helper is execute immediate q'[drop procedure ut3_tester_helper.dummy_test_procedure]'; end; - procedure db_link_setup is + procedure create_db_link is l_service_name varchar2(100); - begin - select global_name into l_service_name from global_name; - execute immediate - 'create public database link db_loopback connect to ut3$user# identified by ut3 + pragma autonomous_transaction; + begin + select global_name into l_service_name from global_name; + execute immediate + 'create public database link db_loopback connect to ut3_tester_helper identified by ut3 using ''(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP) (HOST='||sys_context('userenv','SERVER_HOST')||') - (PORT=1521) - ) - (CONNECT_DATA=(SERVICE_NAME='||l_service_name||')))'''; + (PORT=1521) + ) + (CONNECT_DATA=(SERVICE_NAME='||l_service_name||')))'''; + end; + + procedure drop_db_link is + begin + execute immediate 'drop public database link db_loopback'; + exception + when others then + null; + end; + + procedure db_link_setup is + l_service_name varchar2(100); + begin + create_db_link; execute immediate q'[ create or replace package ut3$user#.test_db_link is --%suite @@ -79,13 +94,285 @@ create or replace package body run_helper is end; end;]'; - end; + end; procedure db_link_cleanup is begin - begin execute immediate 'drop public database link db_loopback'; exception when others then null; end; + drop_db_link; begin execute immediate 'drop package ut3$user#.test_db_link'; exception when others then null; end; end; - + + procedure create_suite_with_link is + pragma autonomous_transaction; + begin + create_db_link; + execute immediate 'create table tst(id number(18,0))'; + execute immediate q'[ + create or replace package test_distributed_savepoint is + --%suite + --%suitepath(alltests) + + --%beforeall + procedure setup; + + --%test + procedure test; + end;]'; + + execute immediate q'[ + create or replace package body test_distributed_savepoint is + + g_expected constant integer := 1; + + procedure setup is + begin + insert into tst@db_loopback values(g_expected); + end; + + procedure test is + l_actual integer := 0; + begin + select id into l_actual from tst@db_loopback; + + ut.expect(l_actual).to_equal(g_expected); + end; + + end;]'; + execute immediate 'grant execute on test_distributed_savepoint to public'; + end; + + procedure drop_suite_with_link is + pragma autonomous_transaction; + begin + drop_db_link; + execute immediate 'drop table tst'; + execute immediate 'drop package test_distributed_savepoint'; + end; + + procedure create_ut3$user#_tests is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package test_package_1 is + --%suite + --%suitepath(tests) + --%rollback(manual) + + --%test(Test1 from test package 1) + procedure test1; + + --%test(Test2 from test package 1) + procedure test2; + + end test_package_1; + ]'; + execute immediate q'[create or replace package body test_package_1 is + procedure test1 is + begin + dbms_output.put_line('test_package_1.test1 executed'); + raise_application_error(-20111,'test'); + end; + procedure test2 is + begin + dbms_output.put_line('test_package_1.test2 executed'); + end; + end test_package_1; + ]'; + + execute immediate q'[create or replace package test_package_2 is + --%suite + --%suitepath(tests.test_package_1) + + --%test + procedure test1; + + --%test + procedure test2; + + end test_package_2; + ]'; + execute immediate q'[create or replace package body test_package_2 is + procedure test1 is + begin + dbms_output.put_line('test_package_2.test1 executed'); + end; + procedure test2 is + begin + dbms_output.put_line('test_package_2.test2 executed'); + end; + end test_package_2; + ]'; + + execute immediate q'[create or replace package test_package_3 is + --%suite + --%suitepath(tests2) + + --%test + procedure test1; + + --%test + procedure test2; + + end test_package_3; + ]'; + execute immediate q'[create or replace package body test_package_3 is + procedure test1 is + begin + dbms_output.put_line('test_package_3.test1 executed'); + end; + procedure test2 is + begin + dbms_output.put_line('test_package_3.test2 executed'); + end; + end test_package_3; + ]'; + execute immediate q'[grant execute on test_package_1 to public]'; + execute immediate q'[grant execute on test_package_2 to public]'; + execute immediate q'[grant execute on test_package_3 to public]'; + end; + + procedure drop_ut3$user#_tests is + pragma autonomous_transaction; + begin + execute immediate q'[drop package test_package_1]'; + execute immediate q'[drop package test_package_2]'; + execute immediate q'[drop package test_package_3]'; + end; + + procedure create_test_suite is + pragma autonomous_transaction; + begin + ut3_tester_helper.run_helper.create_db_link; + execute immediate q'[ + create or replace package stateful_package as + function get_state return varchar2; + end; + ]'; + execute immediate q'[ + create or replace package body stateful_package as + g_state varchar2(1) := 'A'; + function get_state return varchar2 is begin return g_state; end; + end; + ]'; + execute immediate q'[ + create or replace package test_stateful as + --%suite + --%suitepath(test_state) + + --%test + --%beforetest(acquire_state_via_db_link,rebuild_stateful_package) + procedure failing_stateful_test; + + procedure rebuild_stateful_package; + procedure acquire_state_via_db_link; + + end; + ]'; + execute immediate q'{ + create or replace package body test_stateful as + + procedure failing_stateful_test is + begin + ut3.ut.expect(stateful_package.get_state@db_loopback).to_equal('abc'); + end; + + procedure rebuild_stateful_package is + pragma autonomous_transaction; + begin + execute immediate q'[ + create or replace package body stateful_package as + g_state varchar2(3) := 'abc'; + function get_state return varchar2 is begin return g_state; end; + end; + ]'; + end; + + procedure acquire_state_via_db_link is + begin + dbms_output.put_line('stateful_package.get_state@db_loopback='||stateful_package.get_state@db_loopback); + end; + end; + }'; + execute immediate 'grant execute on test_stateful to public'; + end; + + procedure drop_test_suite is + pragma autonomous_transaction; + begin + drop_db_link; + execute immediate 'drop package stateful_package'; + execute immediate 'drop package test_stateful'; + end; + + procedure run(a_reporter ut3.ut_reporter_base := null) is + begin + ut3.ut.run(a_reporter); + end; + + procedure run(a_path varchar2, a_reporter ut3.ut_reporter_base := null) is + begin + ut3.ut.run(a_path, a_reporter); + end; + + procedure run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null) is + begin + ut3.ut.run(a_paths, a_reporter); + end; + + procedure run(a_paths ut3.ut_varchar2_list, a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) is + begin + ut3.ut.run( + a_paths, + a_reporter, + a_source_files => ut3.ut_varchar2_list(), + a_test_files => a_test_files + ); + end; + + function run(a_reporter ut3.ut_reporter_base := null) return ut3.ut_varchar2_list is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table (ut3.ut.run(a_reporter)); + return l_results; + end; + + function run(a_paths ut3.ut_varchar2_list, a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) return ut3.ut_varchar2_list is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table ( + ut3.ut.run( + a_paths, + a_reporter, a_source_files => ut3.ut_varchar2_list(), + a_test_files => a_test_files + )); + return l_results; + end; + + function run(a_path varchar2, a_reporter ut3.ut_reporter_base := null) + return ut3.ut_varchar2_list is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table (ut3.ut.run(a_path, a_reporter)); + return l_results; + end; + + function run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null) + return ut3.ut_varchar2_list is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table (ut3.ut.run(a_paths, a_reporter)); + return l_results; + end; + + function run(a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) + return ut3.ut_varchar2_list is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table ( + ut3.ut.run( + a_reporter, a_source_files => ut3.ut_varchar2_list(), + a_test_files => a_test_files + )); + return l_results; + end; end; / diff --git a/test/ut3_tester_helper/run_helper.pks b/test/ut3_tester_helper/run_helper.pks index fefd3b546..5611663c2 100644 --- a/test/ut3_tester_helper/run_helper.pks +++ b/test/ut3_tester_helper/run_helper.pks @@ -3,7 +3,33 @@ create or replace package run_helper is procedure setup_cache_objects; procedure setup_cache; procedure cleanup_cache; + procedure create_db_link; + procedure drop_db_link; procedure db_link_setup; procedure db_link_cleanup; + + procedure create_suite_with_link; + procedure drop_suite_with_link; + + procedure create_ut3$user#_tests; + procedure drop_ut3$user#_tests; + + procedure create_test_suite; + procedure drop_test_suite; + + procedure run(a_reporter ut3.ut_reporter_base := null); + procedure run(a_path varchar2, a_reporter ut3.ut_reporter_base := null); + procedure run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null); + procedure run(a_paths ut3.ut_varchar2_list, a_test_files ut3.ut_varchar2_list, + a_reporter ut3.ut_reporter_base); + function run(a_reporter ut3.ut_reporter_base := null) return ut3.ut_varchar2_list; + function run(a_paths ut3.ut_varchar2_list, a_test_files ut3.ut_varchar2_list, + a_reporter ut3.ut_reporter_base) return ut3.ut_varchar2_list; + function run(a_path varchar2, a_reporter ut3.ut_reporter_base := null) + return ut3.ut_varchar2_list; + function run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null) + return ut3.ut_varchar2_list; + function run(a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) + return ut3.ut_varchar2_list; end; / From 0c05daf8f947cb0ab414ddb62a71e5438cb8b5c8 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Tue, 26 Mar 2019 23:55:09 +0000 Subject: [PATCH 026/181] Adding set of tests: api/test_ut_run --- test/ut3_user/api/test_ut_run.pkb | 735 ++++++++++++++++++++++++++++++ test/ut3_user/api/test_ut_run.pks | 152 ++++++ 2 files changed, 887 insertions(+) create mode 100644 test/ut3_user/api/test_ut_run.pkb create mode 100644 test/ut3_user/api/test_ut_run.pks diff --git a/test/ut3_user/api/test_ut_run.pkb b/test/ut3_user/api/test_ut_run.pkb new file mode 100644 index 000000000..7b308884f --- /dev/null +++ b/test/ut3_user/api/test_ut_run.pkb @@ -0,0 +1,735 @@ +create or replace package body test_ut_run is + + procedure clear_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations(); + end; + + procedure create_ut3$user#_tests is + begin + ut3_tester_helper.run_helper.create_ut3$user#_tests(); + end; + + procedure drop_ut3$user#_tests is + begin + ut3_tester_helper.run_helper.drop_ut3$user#_tests(); + end; + + procedure ut_version is + begin + ut.expect(ut3.ut.version()).to_match('^v\d+\.\d+\.\d+\.\d+(-\w+)?$'); + end; + + procedure ut_fail is + begin + --Act + ut3.ut.fail('Testing failure message'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations(1)) + .to_be_like('%Testing failure message%'); + end; + + procedure run_proc_no_params is + l_results clob; + begin + ut3_tester_helper.run_helper.run(); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure run_proc_specific_reporter is + l_results clob; + begin + --Act + ut3.ut.run('ut3_tester_helper',a_reporter => ut3.ut_documentation_reporter() ); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure run_proc_cov_file_list is + l_results clob; + begin + --Act + ut3.ut.run( + 'ut3_tester_helper', + a_reporter => ut3.ut_sonar_test_reporter(), + a_source_files => ut3.ut_varchar2_list(), + a_test_files => ut3.ut_varchar2_list('tests/ut3_tester_helper.test_package_1.pkb', + 'tests/ut3_tester_helper.test_package_2.pkb', + 'tests/ut3_tester_helper.test_package_3.pkb') + ); + + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%tests/ut3_tester_helper.test_package_2.pkb'|| + '%tests/ut3_tester_helper.test_package_1.pkb'|| + '%tests/ut3_tester_helper.test_package_3.pkb%' ); + end; + + procedure run_proc_pkg_name is + l_results clob; + begin + ut3.ut.run('ut3_tester_helper.test_package_1'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); + end; + + procedure run_proc_pkg_name_file_list is + l_results clob; + begin + ut3.ut.run( + 'ut3_tester_helper.test_package_3', + ut3.ut_sonar_test_reporter(), a_source_files => ut3.ut_varchar2_list(), + a_test_files => ut3.ut_varchar2_list('tests/ut3_tester_helper.test_package_1.pkb', + 'tests/ut3_tester_helper.test_package_2.pkb', + 'tests/ut3_tester_helper.test_package_3.pkb') + ); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%tests/ut3_tester_helper.test_package_3.pkb%' ); + ut.expect( l_results ).not_to_be_like( '%tests/ut3_tester_helper.test_package_1.pkb%' ); + ut.expect( l_results ).not_to_be_like( '%tests/ut3_tester_helper.test_package_2.pkb%' ); + end; + + procedure run_proc_path_list is + l_results clob; + begin + ut3.ut.run(ut3.ut_varchar2_list(':tests.test_package_1',':tests')); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).to_be_like( '%test_package_2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); + end; + + procedure run_proc_path_list_file_list is + l_results clob; + begin + ut3_tester_helper.run_helper.run( + a_paths => ut3.ut_varchar2_list(':tests.test_package_1',':tests'), + a_reporter => ut3.ut_sonar_test_reporter(), + a_test_files => ut3.ut_varchar2_list('tests/ut3_tester_helper.test_package_1.pkb', + 'tests/ut3_tester_helper.test_package_2.pkb', + 'tests/ut3_tester_helper.test_package_3.pkb') + ); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%tests/ut3_tester_helper.test_package_1.pkb%' ); + ut.expect( l_results ).to_be_like( '%tests/ut3_tester_helper.test_package_2.pkb%' ); + ut.expect( l_results ).not_to_be_like( '%tests/ut3_tester_helper.test_package_3.pkb%' ); + end; + + procedure run_proc_null_reporter is + l_results clob; + begin + --Act + ut3.ut.run('ut3_tester_helper', cast(null as ut3.ut_reporter_base)); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%tests%test_package_1%test_package_2%tests2%test_package_3%' ); + end; + + procedure run_proc_null_path is + l_results clob; + begin + --Act + ut3_tester_helper.run_helper.run(cast(null as varchar2)); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure run_proc_null_path_list is + l_results clob; + l_paths ut3.ut_varchar2_list; + begin + --Act + ut3_tester_helper.run_helper.run(l_paths); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure run_proc_empty_path_list is + l_results clob; + begin + --Act + ut3_tester_helper.run_helper.run(ut3.ut_varchar2_list()); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure create_suite_with_commit is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package test_commit_warning is + --%suite + --%suitepath(ut.run.transaction) + + --%test + procedure does_commit; + end;'; + execute immediate 'create or replace package body test_commit_warning is + procedure does_commit is + begin + ut3.ut.expect(1).to_equal(1); + commit; + end; + end;'; + end; + + procedure drop_suite_with_commit is + pragma autonomous_transaction; + begin + execute immediate 'drop package test_commit_warning'; + end; + + procedure run_proc_warn_on_commit is + l_results clob; + begin + ut3.ut.run('test_commit_warning'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + ut.expect(l_results).to_be_like( + '%Unable to perform automatic rollback after test%'|| + 'An implicit or explicit commit/rollback occurred in procedures:%' || + 'does_commit%' || + 'Use the "--%rollback(manual)" annotation or remove commit/rollback/ddl statements that are causing the issue.%' + ); + end; + + procedure create_failing_beforeall_suite is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package parent_suite is + --%suite + --%suitepath(ut.run.failing_setup) + + --%beforeall + procedure failing_setup; + end;'; + execute immediate 'create or replace package body parent_suite is + procedure failing_setup is + begin + raise no_data_found; + end; + end;'; + execute immediate 'create or replace package child_suite is + --%suite + --%suitepath(ut.run.failing_setup.parent_suite.some_sub_suite) + + --%test + procedure does_stuff; + end;'; + execute immediate 'create or replace package body child_suite is + procedure does_stuff is + begin + ut3.ut.expect(1).to_equal(1); + end; + end;'; + end; + + procedure drop_failing_beforeall_suite is + pragma autonomous_transaction; + begin + execute immediate 'drop package parent_suite'; + execute immediate 'drop package child_suite'; + end; + + procedure run_proc_fail_child_suites is + l_results clob; + begin + ut3.ut.run('child_suite'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + ut.expect(l_results).to_be_like( + '%1) does_stuff%' || + 'ORA-01403: no data found%' || + 'ORA-06512: at "UT3$USER#.PARENT_SUITE%' + ); + end; + + procedure transaction_setup is + pragma autonomous_transaction; + begin + execute immediate 'create table transaction_test_table(message varchar2(100))'; + execute immediate 'create or replace package test_transaction is + --%suite + + --%test + procedure insert_row; + + --%test + procedure insert_and_raise; + end; + '; + execute immediate 'create or replace package body test_transaction is + procedure insert_row is + begin + insert into transaction_test_table values (''2 - inside the test_transaction.insert_row test''); + end; + procedure insert_and_raise is + begin + insert into transaction_test_table values (''2 - inside the test_transaction.insert_row test''); + raise no_data_found; + end; + end; + '; + + end; + + procedure transaction_cleanup is + pragma autonomous_transaction; + begin + begin + execute immediate 'drop table transaction_test_table'; + exception + when others then null; + end; + begin + execute immediate 'drop package test_transaction'; + exception + when others then null; + end; + end; + + procedure run_proc_keep_test_data is + l_expected sys_refcursor; + l_actual sys_refcursor; + l_results clob; + begin + --Arrange + execute immediate ' + insert into transaction_test_table values (''1 - inside the test_ut_run.run_proc_keep_test_changes test'')'; + + --Act + ut3.ut.run('test_transaction.insert_row', a_force_manual_rollback => true); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + + --Assert + open l_expected for + select '1 - inside the test_ut_run.run_proc_keep_test_changes test' as message from dual + union all + select '2 - inside the test_transaction.insert_row test' from dual + order by 1; + + open l_actual for 'select * from transaction_test_table order by 1'; + + ut.expect( l_actual ).to_equal(l_expected); + end; + + procedure run_proc_keep_test_data_raise is + l_expected sys_refcursor; + l_actual sys_refcursor; + l_results clob; + begin + --Arrange + execute immediate ' + insert into transaction_test_table values (''1 - inside the test_ut_run.run_proc_keep_test_changes test'')'; + + --Act + ut3.ut.run('test_transaction.insert_and_raise', a_force_manual_rollback => true); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + + --Assert + open l_expected for + select '1 - inside the test_ut_run.run_proc_keep_test_changes test' as message from dual + union all + select '2 - inside the test_transaction.insert_row test' from dual + order by 1; + + open l_actual for 'select * from transaction_test_table order by 1'; + + ut.expect( l_actual ).to_equal(l_expected); + end; + + procedure run_proc_discard_test_data is + l_expected sys_refcursor; + l_actual sys_refcursor; + l_results clob; + begin + --Arrange + execute immediate ' + insert into transaction_test_table values (''1 - inside the test_ut_run.run_proc_keep_test_changes test'')'; + + --Act + ut3.ut.run('test_transaction.insert_row'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + + --Assert + open l_expected for + select '1 - inside the test_ut_run.run_proc_keep_test_changes test' as message from dual; + + open l_actual for 'select * from transaction_test_table order by 1'; + + ut.expect( l_actual ).to_equal(l_expected); + end; + + procedure run_func_no_params is + l_results ut3.ut_varchar2_list; + begin + l_results := ut3_tester_helper.run_helper.run(); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure run_func_specific_reporter is + l_results ut3.ut_varchar2_list; + begin + --Act + l_results := ut3_tester_helper.run_helper.run(ut3.ut_documentation_reporter()); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure run_func_cov_file_list is + l_results ut3.ut_varchar2_list; + begin + --Act + select * bulk collect into l_results from table ( + ut3.ut.run('ut3_tester_helper', + ut3.ut_sonar_test_reporter(), + a_source_files => ut3.ut_varchar2_list(), + a_test_files => ut3.ut_varchar2_list('tests/ut3_tester_helper.test_package_1.pkb', + 'tests/ut3_tester_helper.test_package_2.pkb', + 'tests/ut3_tester_helper.test_package_3.pkb') + )); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%tests/ut3_tester_helper.test_package_2.pkb%tests/ut3_tester_helper.test_package_1.pkb%tests/ut3_tester_helper.test_package_3.pkb%' ); + end; + + procedure run_func_pkg_name is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table (ut3.ut.run('test_package_1')); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%test_package_2%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%test_package_3%' ); + end; + + procedure run_func_pkg_name_file_list is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table ( + ut3.ut.run('ut3_tester_helper.test_package_3', + ut3.ut_sonar_test_reporter(), + a_source_files => ut3.ut_varchar2_list(), + a_test_files => ut3.ut_varchar2_list('tests/ut3_tester_helper.test_package_1.pkb', + 'tests/ut3_tester_helper.test_package_2.pkb', + 'tests/ut3_tester_helper.test_package_3.pkb') + )); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%tests/ut3_tester_helper.test_package_3.pkb%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%tests/ut3_tester_helper.test_package_1.pkb%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%tests/ut3_tester_helper.test_package_2.pkb%' ); + end; + + procedure run_func_path_list is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table (ut3.ut.run(ut3.ut_varchar2_list(':tests.test_package_1',':tests'))); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_2%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%test_package_3%' ); + end; + + procedure run_func_path_list_file_list is + l_results ut3.ut_varchar2_list; + begin + l_results := ut3_tester_helper.run_helper.run( + a_paths => ut3.ut_varchar2_list(':tests.test_package_1',':tests'), + a_reporter => ut3.ut_sonar_test_reporter(), + a_test_files => ut3.ut_varchar2_list('tests/ut3_tester_helper.test_package_1.pkb', + 'tests/ut3_tester_helper.test_package_2.pkb', + 'tests/ut3_tester_helper.test_package_3.pkb') + ); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%tests/ut3_tester_helper.test_package_1.pkb%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%tests/ut3_tester_helper.test_package_2.pkb%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%tests/ut3_tester_helper.test_package_3.pkb%' ); + end; + + procedure run_func_null_reporter is + l_results ut3.ut_varchar2_list; + begin + --Act + select * bulk collect into l_results from table (ut3.ut.run('ut3_tester_helper',cast(null as ut3.ut_reporter_base))); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%tests%test_package_1%test_package_2%tests2%test_package_3%' ); + end; + + procedure run_func_null_path is + l_results ut3.ut_varchar2_list; + begin + --Act + l_results := ut3_tester_helper.run_helper.run(cast(null as varchar2)); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure run_func_null_path_list is + l_results ut3.ut_varchar2_list; + l_paths ut3.ut_varchar2_list; + begin + --Act + l_results := ut3_tester_helper.run_helper.run(l_paths); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure run_func_empty_path_list is + l_results ut3.ut_varchar2_list; + begin + --Act + l_results := ut3_tester_helper.run_helper.run(ut3.ut_varchar2_list()); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure run_func_cov_file_lst_null_rep is + l_results ut3.ut_varchar2_list; + begin + --Act + l_results := ut3_tester_helper.run_helper.run( + a_test_files => ut3.ut_varchar2_list('tests/ut3_tester_helper.test_package_1.pkb', + 'tests/ut3_tester_helper.test_package_2.pkb', + 'tests/ut3_tester_helper.test_package_3.pkb'), + a_reporter => cast(null as ut3.ut_reporter_base)); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure run_func_empty_suite is + l_results ut3.ut_varchar2_list; + l_expected varchar2(32767); + pragma autonomous_transaction; + begin + --Arrange + execute immediate q'[create or replace package empty_suite as + -- %suite + + procedure not_a_test; + end;]'; + execute immediate q'[create or replace package body empty_suite as + procedure not_a_test is begin null; end; + end;]'; + l_expected := '%empty_suite%0 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'; + --Act + select * bulk collect into l_results from table(ut3.ut.run('empty_suite')); + + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( l_expected ); + + --Cleanup + execute immediate q'[drop package empty_suite]'; + end; + + procedure raise_in_invalid_state is + l_results ut3.ut_varchar2_list; + l_expected varchar2(32767); + begin + --Arrange + l_expected := 'test_state + test_stateful + failing_stateful_test [% sec] (FAILED - 1)% +Failures:% + 1) failing_stateful_test + ORA-04068: existing state of packages (DB_LOOPBACK%) has been discarded + ORA-04061: existing state of package body "%.STATEFUL_PACKAGE" has been invalidated + ORA-04065: not executed, altered or dropped package body "%.STATEFUL_PACKAGE"% + ORA-06512: at line 6% +1 tests, 0 failed, 1 errored, 0 disabled, 0 warning(s)%'; + + --Act + select * bulk collect into l_results from table(ut3.ut.run('ut3_tester_helper.test_stateful')); + + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( l_expected ); + ut.fail('Expected exception but nothing was raised'); + exception + when others then + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( l_expected ); + ut.expect(sqlcode).to_equal(-4068); + end; + + procedure create_test_suite is + begin + ut3_tester_helper.run_helper.create_test_suite; + end; + + procedure drop_test_suite is + begin + ut3_tester_helper.run_helper.drop_test_suite; + end; + + procedure run_in_invalid_state is + l_results ut3.ut_varchar2_list; + l_actual clob; + l_expected varchar2(32767); + begin + select * bulk collect into l_results from table(ut3.ut.run('failing_invalid_spec')); + + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like('%Call params for % are not valid: package does not exist or is invalid: %FAILING_INVALID_SPEC%'); + + end; + + procedure compile_invalid_package is + ex_compilation_error exception; + pragma exception_init(ex_compilation_error,-24344); + pragma autonomous_transaction; + begin + begin + execute immediate q'[ + create or replace package failing_invalid_spec as + --%suite + gv_glob_val non_existing_table.id%type := 0; + + --%test + procedure test1; + end;]'; + exception when ex_compilation_error then null; + end; + begin + execute immediate q'[ + create or replace package body failing_invalid_spec as + procedure test1 is begin ut.expect(1).to_equal(1); end; + end;]'; + exception when ex_compilation_error then null; + end; + end; + procedure drop_invalid_package is + pragma autonomous_transaction; + begin + execute immediate 'drop package failing_invalid_spec'; + end; + + procedure run_and_revalidate_specs is + l_results ut3.ut_varchar2_list; + l_actual clob; + l_is_invalid number; + begin + execute immediate q'[select count(1) from all_objects o where o.owner = :object_owner and o.object_type = 'PACKAGE' + and o.status = 'INVALID' and o.object_name= :object_name]' into l_is_invalid + using 'UT3$USER#','INVALID_PCKAG_THAT_REVALIDATES'; + + select * bulk collect into l_results from table(ut3.ut.run('invalid_pckag_that_revalidates')); + + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(1).to_equal(l_is_invalid); + ut.expect(l_actual).to_be_like('%invalid_pckag_that_revalidates%invalidspecs [% sec]% +%Finished in % seconds% +%1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'); + + end; + + procedure generate_invalid_spec is + ex_compilation_error exception; + pragma exception_init(ex_compilation_error,-24344); + pragma autonomous_transaction; + begin + + execute immediate q'[ + create or replace package parent_specs as + c_test constant varchar2(1) := 'Y'; + end;]'; + + execute immediate q'[ + create or replace package invalid_pckag_that_revalidates as + --%suite + g_var varchar2(1) := parent_specs.c_test; + + --%test(invalidspecs) + procedure test1; + end;]'; + + execute immediate q'[ + create or replace package body invalid_pckag_that_revalidates as + procedure test1 is begin ut.expect('Y').to_equal(g_var); end; + end;]'; + + -- That should invalidate test package and we can then revers + execute immediate q'[ + create or replace package parent_specs as + c_test_error constant varchar2(1) := 'Y'; + end;]'; + + execute immediate q'[ + create or replace package parent_specs as + c_test constant varchar2(1) := 'Y'; + end;]'; + + end; + procedure drop_invalid_spec is + pragma autonomous_transaction; + begin + execute immediate 'drop package invalid_pckag_that_revalidates'; + execute immediate 'drop package parent_specs'; + end; + + procedure run_and_report_warnings is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + + select * bulk collect into l_results from table(ut3.ut.run('bad_annotations')); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + + ut.expect(l_actual).to_be_like('%Invalid annotation "--%context". Cannot find following "--%endcontext". Annotation ignored.% +%1 tests, 0 failed, 0 errored, 0 disabled, 1 warning(s)%'); + + end; + + procedure create_bad_annot is + pragma autonomous_transaction; + begin + execute immediate q'[ + create or replace package bad_annotations as + --%suite + + --%context + + --%test(invalidspecs) + procedure test1; + + end;]'; + + execute immediate q'[ + create or replace package body bad_annotations as + procedure test1 is begin ut.expect(1).to_equal(1); end; + end;]'; + + end; + + procedure drop_bad_annot is + pragma autonomous_transaction; + begin + execute immediate 'drop package bad_annotations'; + end; + + procedure create_suite_with_link is + begin + ut3_tester_helper.run_helper.create_suite_with_link; + end; + + procedure drop_suite_with_link is + begin + ut3_tester_helper.run_helper.drop_suite_with_link; + end; + + procedure savepoints_on_db_links is + l_results clob; + begin + ut3.ut.run('ut3_tester_helper.test_distributed_savepoint'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + ut.expect(l_results).to_be_like('%1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'); + end; + +end; +/ diff --git a/test/ut3_user/api/test_ut_run.pks b/test/ut3_user/api/test_ut_run.pks new file mode 100644 index 000000000..48fbf351b --- /dev/null +++ b/test/ut3_user/api/test_ut_run.pks @@ -0,0 +1,152 @@ +create or replace package test_ut_run is + --%suite(ut.run) + --%suitepath(utplsql.test_user.api) + + procedure clear_expectations; + + procedure create_ut3$user#_tests; + procedure drop_ut3$user#_tests; + + --%test(ut.version() returns version of the framework) + procedure ut_version; + + --%test(ut.fail() marks test as failed) + --%aftertest(clear_expectations) + procedure ut_fail; + + --%context(ut_run_procedure) + --%displayname(ut.run() procedure options) + --%beforeall(create_ut3$user#_tests) + --%afterall(drop_ut3$user#_tests) + + --%test(Runs all tests in current schema with default reporter when no parameters given) + procedure run_proc_no_params; + --%test(Runs all tests in current schema with specified reporter) + procedure run_proc_specific_reporter; + --%test(Runs all tests in current schema with coverage file list) + procedure run_proc_cov_file_list; + + --%test(Runs given package only with package name given as path) + procedure run_proc_pkg_name; + --%test(Runs all from given package with package name given as path and coverage file list) + procedure run_proc_pkg_name_file_list; + --%test(Runs tests from given paths only with paths list) + procedure run_proc_path_list; + --%test(Runs tests from given paths only with paths list and coverage file list) + procedure run_proc_path_list_file_list; + --%test(Runs all tests in current schema using default reporter when null reporter given) + procedure run_proc_null_reporter; + --%test(Runs all tests in current schema with null path provided) + procedure run_proc_null_path; + --%test(Runs all tests in current schema with null path list given) + procedure run_proc_null_path_list; + --%test(Runs all tests in current schema with empty path list given) + procedure run_proc_empty_path_list; + + procedure create_suite_with_commit; + procedure drop_suite_with_commit; + --%test(Reports a warning if transaction was invalidated by test with automatic rollback) + --%beforetest(create_suite_with_commit) + --%aftertest(drop_suite_with_commit) + procedure run_proc_warn_on_commit; + + + procedure create_failing_beforeall_suite; + procedure drop_failing_beforeall_suite; + --%test(Marks child suite as failed when parent's suite beforeall fails) + --%beforetest(create_failing_beforeall_suite) + --%aftertest(drop_failing_beforeall_suite) + procedure run_proc_fail_child_suites; + + procedure create_suite_with_link; + procedure drop_suite_with_link; + + --%test(Savepoints are working properly on distributed transactions - Issue #839) + --%beforetest(create_suite_with_link) + --%aftertest(drop_suite_with_link) + procedure savepoints_on_db_links; + + --%endcontext + + --%context(run_proc_transaction_control) + + --%beforeall + procedure transaction_setup; + --%afterall + procedure transaction_cleanup; + --%test(Leaves transaction open and uncommitted with a_force_manual_rollback) + procedure run_proc_keep_test_data; + --%test(Leaves transaction open and uncommitted with a_force_manual_rollback with exceptions) + procedure run_proc_keep_test_data_raise; + --%test(Does not impact current transaction when ran without a_force_manual_rollback) + procedure run_proc_discard_test_data; + + --%endcontext + + + --%context(ut_run_function) + --%displayname(ut.run() function options) + --%beforeall(create_ut3$user#_tests) + --%afterall(drop_ut3$user#_tests) + + --%test(Runs all tests in current schema with default reporter when no parameters given) + procedure run_func_no_params; + --%test(Runs all tests in current schema with specified reporter) + procedure run_func_specific_reporter; + --%test(Runs all tests in current schema with coverage file list) + procedure run_func_cov_file_list; + + --%test(Runs given package only with package name given as path) + procedure run_func_pkg_name; + --%test(Runs all from given package with package name given as path and coverage file list) + procedure run_func_pkg_name_file_list; + --%test(Runs tests from given paths with paths list) + procedure run_func_path_list; + --%test(Runs tests from given paths with paths list and coverage file list) + procedure run_func_path_list_file_list; + --%test(Runs all tests in current schema using default reporter when null reporter given) + procedure run_func_null_reporter; + --%test(Runs all tests in current schema with null path provided) + procedure run_func_null_path; + --%test(Runs all tests in current schema with null path list given) + procedure run_func_null_path_list; + --%test(Runs all tests in current schema with empty path list given) + procedure run_func_empty_path_list; + --%test(Runs all tests in current schema with coverage file list and default reporter) + procedure run_func_cov_file_lst_null_rep; + --%test(Executes successfully an empty suite) + procedure run_func_empty_suite; + + --disabled(Makes session wait for lock on 18.1 due to library cache pin wait) + --%test(ut.run - raises after completing all tests if a test fails with ORA-04068 or ORA-04061) + --%beforetest(create_test_suite) + --%aftertest(drop_test_suite) + procedure raise_in_invalid_state; + procedure create_test_suite; + procedure drop_test_suite; + + --%test(ut.run - Does not execute suite when specified package is not valid) + --%beforetest(compile_invalid_package) + --%aftertest(drop_invalid_package) + procedure run_in_invalid_state; + procedure compile_invalid_package; + procedure drop_invalid_package; + + --%test(Invalidate package specs via rebuild but still execute package) + --%beforetest(generate_invalid_spec) + --%aftertest(drop_invalid_spec) + procedure run_and_revalidate_specs; + procedure generate_invalid_spec; + procedure drop_invalid_spec; + + --%test(Provides warnings on invalid annotations) + --%beforetest(create_bad_annot) + --%aftertest(drop_bad_annot) + procedure run_and_report_warnings; + procedure create_bad_annot; + procedure drop_bad_annot; + --%endcontext + +end; +/ + From 10e2f86ec256db18d75e1b2dd99d5bf9ef4e5461 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Wed, 27 Mar 2019 00:27:29 +0000 Subject: [PATCH 027/181] Fixing one bad test. Workaround for current issue with `unordered()` comparison of blank lines. --- test/api/test_ut_run.pkb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/test/api/test_ut_run.pkb b/test/api/test_ut_run.pkb index 48c45e712..fb18f18b8 100644 --- a/test/api/test_ut_run.pkb +++ b/test/api/test_ut_run.pkb @@ -1019,18 +1019,23 @@ Failures:% a_results(i) := regexp_replace(a_results(i),'Finished in [0-9]*\.[0-9]+ seconds',''); end loop; end; + procedure run_with_random_order is l_random_results ut3.ut_varchar2_list; l_results ut3.ut_varchar2_list; begin select * bulk collect into l_random_results - from table ( ut3.ut.run( 'ut3$user#.test_package_1', a_random_test_order_seed => 3 ) ); + from table ( ut3.ut.run( 'ut3$user#.test_package_1', a_random_test_order_seed => 3 ) ) + where trim(column_value) is not null and column_value not like 'Finished in %' + and column_value not like '%Tests were executed with random order %'; + select * bulk collect into l_results - from table ( ut3.ut.run( 'ut3$user#.test_package_1' ) ); + from table ( ut3.ut.run( 'ut3$user#.test_package_1' ) ) + --TODO this condition should be removed once issues with unordered compare and 'blank text rows' are resolved. + where trim(column_value) is not null and column_value not like 'Finished in %'; remove_time_from_results(l_results); remove_time_from_results(l_random_results); - l_random_results.delete(l_random_results.count-1); ut.expect(anydata.convertCollection(l_random_results)).to_equal(anydata.convertCollection(l_results)).unordered(); ut.expect(anydata.convertCollection(l_random_results)).not_to_equal(anydata.convertCollection(l_results)); @@ -1060,7 +1065,7 @@ Failures:% l_actual.delete(l_actual.count); l_expected.delete(l_expected.count); - ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).unordered(); + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); end; end; From 4b9133e38b6b00faf602588bbc74522f0ddadd2b Mon Sep 17 00:00:00 2001 From: lwasylow Date: Wed, 27 Mar 2019 08:26:51 +0000 Subject: [PATCH 028/181] Fixing issue with null vs null being returned as false. Fixing change in Oracle 12.2+ where XML is stored as binary XML and not preserving insignificant white space. This require store data as clob. --- .../data_values/ut_compound_data_helper.pkb | 6 ++--- .../data_values/ut_compound_data_tmp.sql | 2 +- .../data_values/ut_data_value_refcursor.tpb | 2 +- .../expectations/test_expectation_anydata.pkb | 24 +++++++++++++++++++ .../expectations/test_expectation_anydata.pks | 5 ++++ 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index abb07ee80..4492afeaa 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -34,7 +34,7 @@ create or replace package body ut_compound_data_helper is ,position + x.item_no item_no {:columns:} from {:ut3_owner:}.ut_compound_data_tmp x, - xmltable('/ROWSET/ROW' passing x.item_data columns + xmltable('/ROWSET/ROW' passing xmltype(x.item_data) columns item_data xmltype path '*' ,position for ordinality {:xml_to_columns:} ) ucd @@ -52,7 +52,7 @@ create or replace package body ut_compound_data_helper is ,position + x.item_no item_no {:columns:} from {:ut3_owner:}.ut_compound_data_tmp x, - xmltable('/ROWSET/ROW' passing x.item_data columns + xmltable('/ROWSET/ROW' passing xmltype(x.item_data) columns item_data xmltype path '*' ,position for ordinality {:xml_to_columns:} ) ucd @@ -174,7 +174,7 @@ create or replace package body ut_compound_data_helper is function generate_equal_sql(a_col_name in varchar2) return varchar2 is begin - return ' a.'||a_col_name||q'[ = ]'||' e.'||a_col_name; + return ' decode(a.'||a_col_name||','||' e.'||a_col_name||',1,0) = 1 '; end; function generate_partition_stmt( diff --git a/source/expectations/data_values/ut_compound_data_tmp.sql b/source/expectations/data_values/ut_compound_data_tmp.sql index 0fb5f9544..d433ccb13 100644 --- a/source/expectations/data_values/ut_compound_data_tmp.sql +++ b/source/expectations/data_values/ut_compound_data_tmp.sql @@ -14,7 +14,7 @@ create global temporary table ut_compound_data_tmp( */ data_id raw(32), item_no integer, - item_data xmltype, + item_data clob, item_hash raw(128), pk_hash raw(128), duplicate_no integer, diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index 83bd1502f..131612161 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -55,7 +55,7 @@ create or replace type body ut_data_value_refcursor as execute immediate 'insert into ' || l_ut_owner || '.ut_compound_data_tmp(data_id, item_no, item_data) ' || 'values (:self_guid, :self_row_count, :l_xml)' - using in self.data_id, l_set_id, l_xml; + using in self.data_id, l_set_id, l_xml.getclobval(); l_set_id := l_set_id + c_bulk_rows; end loop; ut_expectation_processor.reset_nls_params(); diff --git a/test/core/expectations/test_expectation_anydata.pkb b/test/core/expectations/test_expectation_anydata.pkb index 0b3a93261..1896e48d2 100644 --- a/test/core/expectations/test_expectation_anydata.pkb +++ b/test/core/expectations/test_expectation_anydata.pkb @@ -970,5 +970,29 @@ Rows: [ 60 differences, showing first 20 ] ut.expect(expectations.failed_expectations_data()).to_be_empty(); end; + procedure arr_empty_eq_arr_empty_unord is + begin + --Arrange + g_test_expected := anydata.convertCollection(t_tab_varchar(null)); + g_test_actual := anydata.convertCollection(t_tab_varchar(null)); + + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).unordered(); + ut.expect(expectations.failed_expectations_data()).to_be_empty(); + + end; + + procedure arr_empty_nqua_arr_e_unord is + begin + --Arrange + g_test_expected := anydata.convertCollection(t_tab_varchar('t')); + g_test_actual := anydata.convertCollection(t_tab_varchar(' ')); + + --Act + ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).unordered(); + ut.expect(expectations.failed_expectations_data()).to_be_empty(); + + end; + end; / \ No newline at end of file diff --git a/test/core/expectations/test_expectation_anydata.pks b/test/core/expectations/test_expectation_anydata.pks index b9fbda93b..bd0ac95db 100644 --- a/test/core/expectations/test_expectation_anydata.pks +++ b/test/core/expectations/test_expectation_anydata.pks @@ -198,5 +198,10 @@ create or replace package test_expectation_anydata is --%test( Success when anydata object contains data from another anydata) procedure object_to_contain; + --%test ( Empty Array equal empty array ) + procedure arr_empty_eq_arr_empty_unord; + + --%test ( Empty Array not equal array with space ) + procedure arr_empty_nqua_arr_e_unord; end; / From 0a606868abb15413b75d572b503782d5deaf1ddc Mon Sep 17 00:00:00 2001 From: lwasylow Date: Wed, 27 Mar 2019 17:04:24 +0000 Subject: [PATCH 029/181] Revert test --- source/expectations/data_values/ut_compound_data_helper.pkb | 4 ++-- source/expectations/data_values/ut_compound_data_tmp.sql | 2 +- source/expectations/data_values/ut_data_value_refcursor.tpb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 4492afeaa..5ac8a4546 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -34,7 +34,7 @@ create or replace package body ut_compound_data_helper is ,position + x.item_no item_no {:columns:} from {:ut3_owner:}.ut_compound_data_tmp x, - xmltable('/ROWSET/ROW' passing xmltype(x.item_data) columns + xmltable('/ROWSET/ROW' passing x.item_data columns item_data xmltype path '*' ,position for ordinality {:xml_to_columns:} ) ucd @@ -52,7 +52,7 @@ create or replace package body ut_compound_data_helper is ,position + x.item_no item_no {:columns:} from {:ut3_owner:}.ut_compound_data_tmp x, - xmltable('/ROWSET/ROW' passing xmltype(x.item_data) columns + xmltable('/ROWSET/ROW' passing x.item_data columns item_data xmltype path '*' ,position for ordinality {:xml_to_columns:} ) ucd diff --git a/source/expectations/data_values/ut_compound_data_tmp.sql b/source/expectations/data_values/ut_compound_data_tmp.sql index d433ccb13..0fb5f9544 100644 --- a/source/expectations/data_values/ut_compound_data_tmp.sql +++ b/source/expectations/data_values/ut_compound_data_tmp.sql @@ -14,7 +14,7 @@ create global temporary table ut_compound_data_tmp( */ data_id raw(32), item_no integer, - item_data clob, + item_data xmltype, item_hash raw(128), pk_hash raw(128), duplicate_no integer, diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index 131612161..83bd1502f 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -55,7 +55,7 @@ create or replace type body ut_data_value_refcursor as execute immediate 'insert into ' || l_ut_owner || '.ut_compound_data_tmp(data_id, item_no, item_data) ' || 'values (:self_guid, :self_row_count, :l_xml)' - using in self.data_id, l_set_id, l_xml.getclobval(); + using in self.data_id, l_set_id, l_xml; l_set_id := l_set_id + c_bulk_rows; end loop; ut_expectation_processor.reset_nls_params(); From b7a66da67196d0504526bb94d8cf2dc2fb422c0f Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Thu, 28 Mar 2019 00:09:26 +0000 Subject: [PATCH 030/181] Fixed bad test. Added `dbms_output.enable` in `core` test package --- test/core.pkb | 1 + test/core/expectations/test_expectation_anydata.pkb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/test/core.pkb b/test/core.pkb index 60baa0190..b2405da9f 100644 --- a/test/core.pkb +++ b/test/core.pkb @@ -21,6 +21,7 @@ create or replace package body core is procedure global_setup is begin + dbms_output.enable(null); ut3.ut_coverage.set_develop_mode(true); --improve performance of test execution by disabling all compiler optimizations execute_autonomous('ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=0'); diff --git a/test/core/expectations/test_expectation_anydata.pkb b/test/core/expectations/test_expectation_anydata.pkb index 1896e48d2..9aa968b09 100644 --- a/test/core/expectations/test_expectation_anydata.pkb +++ b/test/core/expectations/test_expectation_anydata.pkb @@ -989,7 +989,7 @@ Rows: [ 60 differences, showing first 20 ] g_test_actual := anydata.convertCollection(t_tab_varchar(' ')); --Act - ut3.ut.expect( g_test_actual ).to_equal( g_test_expected ).unordered(); + ut3.ut.expect( g_test_actual ).not_to_equal( g_test_expected ).unordered(); ut.expect(expectations.failed_expectations_data()).to_be_empty(); end; From 80783c3c7cb73e90fbff0ddffd36fbf494938f25 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Thu, 28 Mar 2019 12:24:13 +0000 Subject: [PATCH 031/181] Adding set of tests: api/test_ut_run --- test/ut3_user/api/test_ut_run.pkb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/ut3_user/api/test_ut_run.pkb b/test/ut3_user/api/test_ut_run.pkb index 7b308884f..28b538f20 100644 --- a/test/ut3_user/api/test_ut_run.pkb +++ b/test/ut3_user/api/test_ut_run.pkb @@ -99,7 +99,7 @@ create or replace package body test_ut_run is procedure run_proc_path_list is l_results clob; begin - ut3.ut.run(ut3.ut_varchar2_list(':tests.test_package_1',':tests')); + ut3_tester_helper.run_helper.run(ut3.ut_varchar2_list(':tests.test_package_1',':tests')); l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); --Assert ut.expect( l_results ).to_be_like( '%test_package_1%' ); @@ -405,7 +405,7 @@ create or replace package body test_ut_run is procedure run_func_pkg_name is l_results ut3.ut_varchar2_list; begin - select * bulk collect into l_results from table (ut3.ut.run('test_package_1')); + select * bulk collect into l_results from table (ut3.ut.run('ut3_tester_helper.test_package_1')); --Assert ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%' ); ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%test_package_2%' ); @@ -432,7 +432,7 @@ create or replace package body test_ut_run is procedure run_func_path_list is l_results ut3.ut_varchar2_list; begin - select * bulk collect into l_results from table (ut3.ut.run(ut3.ut_varchar2_list(':tests.test_package_1',':tests'))); + l_results := ut3_tester_helper.run_helper.run(ut3.ut_varchar2_list(':tests.test_package_1',':tests')); --Assert ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%' ); ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_2%' ); From c4b08afaf378ee7b8cfdbe3f1e9272b658b19c22 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Thu, 28 Mar 2019 12:28:16 +0000 Subject: [PATCH 032/181] Adding set of tests: core/annotations/test_annotation_parser core/annotations/test_annot_throws_exception core/annotations/test_annotation_manager --- test/install_ut3_tester_tests.sql | 8 + .../test_annot_throws_exception.pkb | 375 ++++++++++++++ .../test_annot_throws_exception.pks | 76 +++ .../annotations/test_annotation_manager.pkb | 296 +++++++++++ .../annotations/test_annotation_manager.pks | 55 +++ .../annotations/test_annotation_parser.pkb | 461 ++++++++++++++++++ .../annotations/test_annotation_parser.pks | 42 ++ test/ut3_tester_helper/main_helper.pkb | 30 ++ test/ut3_tester_helper/main_helper.pks | 8 + 9 files changed, 1351 insertions(+) create mode 100644 test/ut3_tester/core/annotations/test_annot_throws_exception.pkb create mode 100644 test/ut3_tester/core/annotations/test_annot_throws_exception.pks create mode 100644 test/ut3_tester/core/annotations/test_annotation_manager.pkb create mode 100644 test/ut3_tester/core/annotations/test_annotation_manager.pks create mode 100644 test/ut3_tester/core/annotations/test_annotation_parser.pkb create mode 100644 test/ut3_tester/core/annotations/test_annotation_parser.pks diff --git a/test/install_ut3_tester_tests.sql b/test/install_ut3_tester_tests.sql index 146a3a211..099064fe5 100644 --- a/test/install_ut3_tester_tests.sql +++ b/test/install_ut3_tester_tests.sql @@ -8,11 +8,19 @@ alter session set plsql_optimize_level=0; --Install tests @@ut3_tester/core.pks @@ut3_tester/core/annotations/test_before_after_annotations.pks +@@ut3_tester/core/annotations/test_annotation_parser.pks +@@ut3_tester/core/annotations/test_annot_throws_exception.pks +@@ut3_tester/core/annotations/test_annotation_manager.pks @@ut3_tester/core/expectations/test_expectation_processor.pks + @@ut3_tester/core.pkb @@ut3_tester/core/annotations/test_before_after_annotations.pkb +@@ut3_tester/core/annotations/test_annotation_parser.pkb @@ut3_tester/core/expectations/test_expectation_processor.pkb +@@ut3_tester/core/annotations/test_annotation_manager.pkb +@@ut3_tester/core/annotations/test_annot_throws_exception.pkb + set linesize 200 set define on diff --git a/test/ut3_tester/core/annotations/test_annot_throws_exception.pkb b/test/ut3_tester/core/annotations/test_annot_throws_exception.pkb new file mode 100644 index 000000000..1ad4f19a5 --- /dev/null +++ b/test/ut3_tester/core/annotations/test_annot_throws_exception.pkb @@ -0,0 +1,375 @@ +create or replace package body test_annot_throws_exception +is + g_tests_results clob; + + procedure recollect_tests_results is + pragma autonomous_transaction; + + l_package_spec varchar2(32737); + l_package_body varchar2(32737); + l_exception_spec varchar2(32737); + l_test_results ut3.ut_varchar2_list; + begin + l_exception_spec := q'[ + create or replace package exc_pkg is + c_e_single_exc constant number := -20200; + c_e_dummy constant varchar2(10) := 'dummy'; + c_e_varch_exc constant varchar2(10) := '-20201'; + c_e_list_1 number := -20202; + c_e_list_2 constant number := -20203; + c_e_diff_exc constant number := -20204; + c_e_mix_list constant number := -20205; + c_e_mix_missin constant number := -20206; + + e_some_exception exception; + pragma exception_init(e_some_exception, -20207); + + end;]'; + + l_package_spec := ' + create package annotated_package_with_throws is + --%suite(Dummy package to test annotation throws) + + --%test(Throws same annotated exception) + --%throws(-20145) + procedure raised_same_exception; + + --%test(Throws one of the listed exceptions) + --%throws(-20145,-20146, -20189 ,-20563) + procedure raised_one_listed_exception; + + --%test(Leading zero is ignored in exception list) + --%throws(-01476) + procedure leading_0_exception_no; + + --%test(Throws diff exception) + --%throws(-20144) + procedure raised_diff_exception; + + --%test(Throws empty) + --%throws() + procedure empty_throws; + + --%test(Ignores annotation and fails when exception was thrown) + --%throws(hello,784#,0-=234,,u1234) + procedure bad_paramters_with_except; + + --%test(Ignores annotation and succeeds when no exception thrown) + --%throws(hello,784#,0-=234,,u1234) + procedure bad_paramters_without_except; + + --%test(Detects a valid exception number within many invalid ones) + --%throws(7894562, operaqk, -=1, -1, pow74d, posdfk3) + procedure one_valid_exception_number; + + --%test(Gives failure when a exception is expected and nothing is thrown) + --%throws(-20459, -20136, -20145) + procedure nothing_thrown; + + --%test(Single exception defined as a constant number in package) + --%throws(exc_pkg.c_e_single_exc) + procedure single_exc_const_pkg; + + --%test(Gives success when one of annotated exception using constant is thrown) + --%throws(exc_pkg.c_e_list_1,exc_pkg.c_e_list_2) + procedure list_of_exc_constant; + + --%test(Gives failure when the raised exception is different that the annotated one using variable) + --%throws(exc_pkg.c_e_diff_exc) + procedure fail_not_match_exc; + + --%test(Success when one of exception from mixed list of number and constant is thrown) + --%throws(exc_pkg.c_e_mix_list,-20105) + procedure mixed_exc_list; + + --%test(Success when match exception even if other variable on list dont exists) + --%throws(exc_pkg.c_e_mix_missin,utter_rubbish) + procedure mixed_list_notexi; + + --%test(Success resolve and match named exception defined in pragma exception init) + --%throws(exc_pkg.e_some_exception) + procedure named_exc_pragma; + + --%test(Success resolve and match oracle named exception) + --%throws(NO_DATA_FOUND) + procedure named_exc_ora; + + --%test(Success resolve and match oracle named exception dup val index) + --%throws(DUP_VAL_ON_INDEX) + procedure named_exc_ora_dup_ind; + + --%test(Success map no data 100 to -1403) + --%throws(-1403) + procedure nodata_exc_ora; + + --%test(Success for exception defined as varchar) + --%throws(exc_pkg.c_e_varch_exc) + procedure defined_varchar_exc; + + --%test(Non existing constant exception) + --%throws(dummy.c_dummy); + procedure non_existing_const; + + --%test(Bad exception constant) + --%throws(exc_pkg.c_e_dummy); + procedure bad_exc_const; + + end; + '; + + l_package_body := ' + create package body annotated_package_with_throws is + procedure raised_same_exception is + begin + raise_application_error(-20145, ''Test error''); + end; + + procedure raised_one_listed_exception is + begin + raise_application_error(-20189, ''Test error''); + end; + + procedure leading_0_exception_no is + x integer; + begin + x := 1 / 0; + end; + + procedure raised_diff_exception is + begin + raise_application_error(-20143, ''Test error''); + end; + + procedure empty_throws is + begin + raise_application_error(-20143, ''Test error''); + end; + + procedure bad_paramters_with_except is + begin + raise_application_error(-20143, ''Test error''); + end; + + procedure bad_paramters_without_except is + begin + null; + end; + + procedure one_valid_exception_number is + begin + raise dup_val_on_index; + end; + + procedure nothing_thrown is + begin + null; + end; + + procedure single_exc_const_pkg is + begin + raise_application_error(exc_pkg.c_e_single_exc,''Test''); + end; + + procedure list_of_exc_constant is + begin + raise_application_error(exc_pkg.c_e_list_1,''Test''); + end; + + procedure fail_not_match_exc is + begin + raise NO_DATA_FOUND; + end; + + procedure mixed_exc_list is + begin + raise_application_error(exc_pkg.c_e_mix_list,''Test''); + end; + + procedure mixed_list_notexi is + begin + raise_application_error(exc_pkg.c_e_mix_missin,''Test''); + end; + + procedure named_exc_pragma is + begin + raise exc_pkg.e_some_exception; + end; + + procedure named_exc_ora is + begin + raise NO_DATA_FOUND; + end; + + procedure named_exc_ora_dup_ind is + begin + raise DUP_VAL_ON_INDEX; + end; + + procedure nodata_exc_ora is + begin + raise NO_DATA_FOUND; + end; + + procedure defined_varchar_exc is + begin + raise_application_error(exc_pkg.c_e_varch_exc,''Test''); + end; + + procedure non_existing_const is + begin + raise_application_error(-20143, ''Test error''); + end; + + procedure bad_exc_const is + begin + raise_application_error(-20143, ''Test error''); + end; + + end; + '; + + execute immediate l_exception_spec; + execute immediate l_package_spec; + execute immediate l_package_body; + + + select * bulk collect into l_test_results from table(ut3.ut.run(('annotated_package_with_throws'))); + + g_tests_results := ut3.ut_utils.table_to_clob(l_test_results); + end; + + procedure throws_same_annotated_except is + begin + ut.expect(g_tests_results).to_match('^\s*Throws same annotated exception \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('raised_same_exception'); + end; + + procedure throws_one_of_annotated_excpt is + begin + ut.expect(g_tests_results).to_match('^\s*Throws one of the listed exceptions \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('raised_one_listed_exception'); + end; + + procedure throws_with_leading_zero is + begin + ut.expect(g_tests_results).to_match('^\s*Leading zero is ignored in exception list \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('leading_0_exception_no'); + end; + + procedure throws_diff_annotated_except is + begin + ut.expect(g_tests_results).to_match('^\s*Throws diff exception \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); + ut.expect(g_tests_results).to_match('raised_diff_exception\s+Actual: -20143 was expected to equal: -20144\s+ORA-20143: Test error\s+ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); + end; + + procedure throws_empty is + begin + ut.expect(g_tests_results).to_match('^\s*Throws empty \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); + ut.expect(g_tests_results).to_match('empty_throws\s*ORA-20143: Test error\s*ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); + end; + + procedure bad_paramters_with_except is + begin + ut.expect(g_tests_results).to_match('^\s*Ignores annotation and fails when exception was thrown \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); + ut.expect(g_tests_results).to_match('bad_paramters_with_except\s*ORA-20143: Test error\s*ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); + end; + + procedure bad_paramters_without_except is + begin + ut.expect(g_tests_results).to_match('^\s*Ignores annotation and succeeds when no exception thrown \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('bad_paramters_without_except'); + end; + + procedure one_valid_exception_number is + begin + ut.expect(g_tests_results).to_match('^\s*Detects a valid exception number within many invalid ones \[[\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('one_valid_exception_number'); + end; + + procedure nothing_thrown is + begin + ut.expect(g_tests_results).to_match('^\s*Gives failure when a exception is expected and nothing is thrown \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); + ut.expect(g_tests_results).to_match('nothing_thrown\s*Expected one of exceptions \(-20459, -20136, -20145\) but nothing was raised.'); + end; + + procedure single_exc_const_pkg is + begin + ut.expect(g_tests_results).to_match('^\s*Single exception defined as a constant number in package \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('single_exc_const_pkg'); + end; + + procedure list_of_exc_constant is + begin + ut.expect(g_tests_results).to_match('^\s*Gives success when one of annotated exception using constant is thrown \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('list_of_exc_constant'); + end; + + procedure fail_not_match_exc is + begin + ut.expect(g_tests_results).to_match('^\s*Gives failure when the raised exception is different that the annotated one using variable \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); + ut.expect(g_tests_results).to_match('fail_not_match_exc\s+Actual: -1403 was expected to equal: -20204\s+ORA-01403: no data found\s+ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); + end; + + procedure mixed_exc_list is + begin + ut.expect(g_tests_results).to_match('^\s*Success when one of exception from mixed list of number and constant is thrown \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('mixed_exc_list'); + end; + + procedure mixed_list_notexi is + begin + ut.expect(g_tests_results).to_match('^\s*Success when match exception even if other variable on list dont exists \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('mixed_list_notexi'); + end; + + procedure named_exc_pragma is + begin + ut.expect(g_tests_results).to_match('^\s*Success resolve and match named exception defined in pragma exception init \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('mixed_list_notexi'); + end; + + procedure named_exc_ora is + begin + ut.expect(g_tests_results).to_match('^\s*Success resolve and match oracle named exception \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('named_exc_ora'); + end; + + procedure named_exc_ora_dup_ind is + begin + ut.expect(g_tests_results).to_match('^\s*Success resolve and match oracle named exception dup val index \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('named_exc_ora_dup_ind'); + end; + + procedure nodata_exc_ora is + begin + ut.expect(g_tests_results).to_match('^\s*Success map no data 100 to -1403 \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('nodata_exc_ora'); + end; + + procedure defined_varchar_exc is + begin + ut.expect(g_tests_results).to_match('^\s*Success for exception defined as varchar \[[,\.0-9]+ sec\]\s*$','m'); + ut.expect(g_tests_results).not_to_match('defined_varchar_exc'); + end; + + procedure non_existing_const is + begin + ut.expect(g_tests_results).to_match('^\s*Non existing constant exception \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); + ut.expect(g_tests_results).to_match('non_existing_const\s*ORA-20143: Test error\s*ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); + end; + + procedure bad_exc_const is + begin + ut.expect(g_tests_results).to_match('^\s*Bad exception constant \[[,\.0-9]+ sec\] \(FAILED - [0-9]+\)\s*$','m'); + ut.expect(g_tests_results).to_match('bad_exc_const\s*ORA-20143: Test error\s*ORA-06512: at "UT3_TESTER.ANNOTATED_PACKAGE_WITH_THROWS"'); + end; + + procedure drop_test_package is + pragma autonomous_transaction; + begin + execute immediate 'drop package annotated_package_with_throws'; + execute immediate 'drop package exc_pkg'; + end; + +end; +/ diff --git a/test/ut3_tester/core/annotations/test_annot_throws_exception.pks b/test/ut3_tester/core/annotations/test_annot_throws_exception.pks new file mode 100644 index 000000000..6c2df63b1 --- /dev/null +++ b/test/ut3_tester/core/annotations/test_annot_throws_exception.pks @@ -0,0 +1,76 @@ +create or replace package test_annot_throws_exception +is + --%suite(annotations - throws) + --%suitepath(utplsql.framework_tester.core.annotations) + + --%beforeall + procedure recollect_tests_results; + + --%test(Gives success when annotated number exception is thrown) + procedure throws_same_annotated_except; + + --%test(Gives success when one of the annotated number exceptions is thrown) + procedure throws_one_of_annotated_excpt; + + --%test(Gives success when annotated number exceptions has leading zero) + procedure throws_with_leading_zero; + + --%test(Gives failure when the raised exception is different that the annotated one) + procedure throws_diff_annotated_except; + + --%test(Ignores when the annotation throws is empty) + procedure throws_empty; + + --%test(Ignores when only bad parameters are passed, the test raise a exception and it shows errored test) + procedure bad_paramters_with_except; + + --%test(Ignores when only bad parameters are passed, the test does not raise a exception and it shows successful test) + procedure bad_paramters_without_except; + + --%test(Detects a valid exception number within many invalid ones) + procedure one_valid_exception_number; + + --%test(Gives failure when a exception is expected and nothing is thrown) + procedure nothing_thrown; + + --%test(Single exception defined as a constant number in package) + procedure single_exc_const_pkg; + + --%test(Gives success when one of annotated exception using constant is thrown) + procedure list_of_exc_constant; + + --%test(Gives failure when the raised exception is different that the annotated one using variable) + procedure fail_not_match_exc; + + --%test(Success when one of exception from mixed list of number and constant is thrown) + procedure mixed_exc_list; + + --%test(Success when match exception even if other variable on list dont exists) + procedure mixed_list_notexi; + + --%test(Success resolve and match named exception defined in pragma exception init) + procedure named_exc_pragma; + + --%test(Success resolve and match oracle named exception no data) + procedure named_exc_ora; + + --%test(Success resolve and match oracle named exception dup val index) + procedure named_exc_ora_dup_ind; + + --%test(Success map no data 100 to -1403) + procedure nodata_exc_ora; + + --%test(Success for exception defined as varchar) + procedure defined_varchar_exc; + + --%test(Non existing constant exception) + procedure non_existing_const; + + --%test(Bad exception constant) + procedure bad_exc_const; + + --%afterall + procedure drop_test_package; + +end; +/ diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pkb b/test/ut3_tester/core/annotations/test_annotation_manager.pkb new file mode 100644 index 000000000..46f0959e8 --- /dev/null +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pkb @@ -0,0 +1,296 @@ +create or replace package body test_annotation_manager is + + procedure create_dummy_package is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package dummy_package as + procedure some_dummy_procedure; + end;]'; + end; + + procedure drop_dummy_package is + pragma autonomous_transaction; + begin + execute immediate q'[drop package dummy_package]'; + end; + + procedure recompile_dummy_package is + pragma autonomous_transaction; + begin + execute immediate q'[alter package dummy_package compile]'; + end; + + procedure create_dummy_test_package is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package dummy_test_package as + --%suite(dummy_test_suite) + --%rollback(manual) + + --%test(dummy_test) + --%beforetest(some_procedure) + procedure some_dummy_test_procedure; + end;]'; + execute immediate q'[grant execute on dummy_test_package to public]'; + end; + + procedure modify_dummy_test_package is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package dummy_test_package as + --%suite(dummy_test_suite) + + --%test(dummy_test) + procedure some_dummy_test_procedure; + end;]'; + end; + + procedure drop_dummy_test_package is + pragma autonomous_transaction; + begin + execute immediate q'[drop package dummy_test_package]'; + end; + + procedure recompile_dummy_test_package is + pragma autonomous_transaction; + begin + execute immediate q'[alter package dummy_test_package compile]'; + end; + + procedure create_parse_proc_as_ut3$user# is + begin + ut3_tester_helper.main_helper.create_parse_proc_as_ut3$user#(); + end; + + procedure parse_dummy_test_as_ut3$user# is + begin + ut3_tester_helper.main_helper.parse_dummy_test_as_ut3$user#(); + end; + + procedure drop_parse_proc_as_ut3$user# is + begin + ut3_tester_helper.main_helper.drop_parse_proc_as_ut3$user#(); + end; + + procedure cleanup_annotation_cache is + begin + ut3_tester_helper.main_helper.cleanup_annotation_cache(); + end; + + + procedure add_new_package is + l_actual_cache_id integer; + l_actual integer; + l_start_date date; + begin + --Act + l_start_date := sysdate; + ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + --Assert + select max(cache_id) + into l_actual_cache_id + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_PACKAGE' + and parse_time >= l_start_date; + + ut.expect(l_actual_cache_id).to_be_not_null; + + select count(1) + into l_actual + from ut3.ut_annotation_cache + where cache_id = l_actual_cache_id; + + ut.expect(l_actual).to_equal(0); + + end; + + procedure update_modified_package is + l_actual_cache_id integer; + l_actual integer; + l_start_date date; + begin + --Arrange + l_start_date := sysdate; + ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + recompile_dummy_package(); + l_start_date := sysdate; + $if dbms_db_version.version >= 18 $then + dbms_session.sleep(1); + $else + dbms_lock.sleep(1); + $end + --Act + ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + --Assert + select max(cache_id) + into l_actual_cache_id + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_PACKAGE' + and parse_time >= l_start_date; + + ut.expect(l_actual_cache_id).to_be_not_null; + + select count(1) + into l_actual + from ut3.ut_annotation_cache + where cache_id = l_actual_cache_id; + + ut.expect(l_actual).to_equal(0); + end; + + + procedure add_new_test_package is + l_actual_cache_id integer; + l_actual sys_refcursor; + l_expected sys_refcursor; + l_start_date date; + begin + --Arrange + l_start_date := sysdate; + --Act + ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + --Assert + select max(cache_id) + into l_actual_cache_id + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE' + and parse_time >= l_start_date; + + ut.expect(l_actual_cache_id).to_be_not_null; + + open l_actual for + select annotation_position, annotation_name, annotation_text, subobject_name + from ut3.ut_annotation_cache where cache_id = l_actual_cache_id + order by annotation_position; + + open l_expected for + select 2 as annotation_position, 'suite' as annotation_name, + 'dummy_test_suite' as annotation_text, '' as subobject_name + from dual union all + select 3, 'rollback' , 'manual', '' as subobject_name + from dual union all + select 5, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name + from dual union all + select 6, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name + from dual; + + ut.expect(l_actual).to_equal(l_expected); + end; + + + procedure update_modified_test_package is + l_actual_cache_id integer; + l_actual sys_refcursor; + l_expected sys_refcursor; + l_start_date date; + begin + --Arrange + ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + l_start_date := sysdate; + modify_dummy_test_package(); + --Act + ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + --Assert + select max(cache_id) + into l_actual_cache_id + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE' + and parse_time >= l_start_date; + + ut.expect(l_actual_cache_id).to_be_not_null; + + open l_actual for + select annotation_position, annotation_name, annotation_text, subobject_name + from ut3.ut_annotation_cache where cache_id = l_actual_cache_id + order by annotation_position; + + open l_expected for + select 2 as annotation_position, 'suite' as annotation_name, + 'dummy_test_suite' as annotation_text, to_char(null) as subobject_name + from dual union all + select 4, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name + from dual; + + ut.expect(l_actual).to_equal(l_expected); + end; + + + procedure keep_dropped_data_in_cache is + l_actual_cache_id integer; + l_actual sys_refcursor; + l_expected sys_refcursor; + l_start_date date; + begin + parse_dummy_test_as_ut3$user#(); + l_start_date := sysdate; + drop_dummy_test_package(); + --Act + parse_dummy_test_as_ut3$user#(); + --Assert + select max(cache_id) + into l_actual_cache_id + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE' + and parse_time >= l_start_date; + + ut.expect(l_actual_cache_id).not_to_be_null(); + + open l_actual for + select annotation_position, annotation_name, annotation_text, subobject_name + from ut3.ut_annotation_cache where cache_id = l_actual_cache_id + order by annotation_position; + + open l_expected for + select 2 as annotation_position, 'suite' as annotation_name, + 'dummy_test_suite' as annotation_text, '' as subobject_name + from dual union all + select 3, 'rollback' , 'manual', '' as subobject_name + from dual union all + select 5, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name + from dual union all + select 6, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name + from dual; + + ut.expect(l_actual).to_equal(l_expected); + end; + + procedure no_data_for_dropped_object is + l_actual sys_refcursor; + begin + --Arrange + ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + drop_dummy_test_package(); + --Act + open l_actual for + select * from table(ut3.ut_annotation_manager.get_annotated_objects(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE')) + where object_name = 'DUMMY_TEST_PACKAGE'; + --Assert + ut.expect(l_actual).to_be_empty(); + end; + + procedure cleanup_dropped_data_in_cache is + l_cache_count integer; + l_actual sys_refcursor; + l_expected sys_refcursor; + l_start_date date; + begin + --Arrange + ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + l_start_date := sysdate; + drop_dummy_test_package(); + --Act + ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + --Assert + select count(1) + into l_cache_count + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') + and object_type = 'PACKAGE' + and object_name = 'DUMMY_TEST_PACKAGE'; + + ut.expect(l_cache_count).to_equal(0); + + end; + +end test_annotation_manager; +/ diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pks b/test/ut3_tester/core/annotations/test_annotation_manager.pks new file mode 100644 index 000000000..b40965c74 --- /dev/null +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pks @@ -0,0 +1,55 @@ +create or replace package test_annotation_manager is + + --%suite(ut_annotation_manager) + --%suitepath(utplsql.framework_tester.core.annotations) + + --%aftereach + procedure cleanup_annotation_cache; + + procedure create_dummy_package; + + procedure drop_dummy_package; + + procedure create_dummy_test_package; + + procedure create_parse_proc_as_ut3$user#; + + procedure drop_parse_proc_as_ut3$user#; + + procedure drop_dummy_test_package; + + --%test(Adds new package to annotation cache info) + --%beforetest(create_dummy_package) + --%aftertest(drop_dummy_package) + procedure add_new_package; + + --%test(Updates annotation cache info for modified package) + --%beforetest(create_dummy_package) + --%aftertest(drop_dummy_package) + procedure update_modified_package; + + --%test(Adds annotations to cache for unit test package) + --%beforetest(create_dummy_test_package) + --%aftertest(drop_dummy_test_package) + procedure add_new_test_package; + + --%test(Updates annotations in cache for modified test package) + --%beforetest(create_dummy_test_package) + --%aftertest(drop_dummy_test_package) + procedure update_modified_test_package; + + --%test(Keeps annotations in cache when object was removed but user can't see whole schema) + --%beforetest(create_dummy_test_package,create_parse_proc_as_ut3$user#) + --%aftertest(drop_parse_proc_as_ut3$user#) + procedure keep_dropped_data_in_cache; + + --%test(Does not return data for dropped object) + --%beforetest(create_dummy_test_package) + procedure no_data_for_dropped_object; + + --%test(Remove object from cache when object dropped and user can see whole schema) + --%beforetest(create_dummy_test_package) + procedure cleanup_dropped_data_in_cache; + +end test_annotation_manager; +/ diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pkb b/test/ut3_tester/core/annotations/test_annotation_parser.pkb new file mode 100644 index 000000000..5345e3a50 --- /dev/null +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pkb @@ -0,0 +1,461 @@ +create or replace package body test_annotation_parser is + + procedure test_proc_comments is + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + + begin + l_source := 'PACKAGE test_tt AS + -- %suite + -- %displayname(Name of suite) + -- %suitepath(all.globaltests) + + -- %ann1(Name of suite) + -- wrong line + -- %ann2(some_value) + procedure foo; + END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + + l_expected := ut3.ut_annotations( + ut3.ut_annotation(2,'suite',null, null), + ut3.ut_annotation(3,'displayname','Name of suite',null), + ut3.ut_annotation(4,'suitepath','all.globaltests',null), + ut3.ut_annotation(6,'ann1','Name of suite',null), + ut3.ut_annotation(8,'ann2','some_value','foo') + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure include_floating_annotations is + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + begin + l_source := 'PACKAGE test_tt AS + -- %suite + -- %displayname(Name of suite) + -- %suitepath(all.globaltests) + + -- %ann1(Name of suite) + -- %ann2(all.globaltests) + + --%test + procedure foo; + + -- %ann3(Name of suite) + -- %ann4(all.globaltests) + + --%test + procedure bar; + END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 2, 'suite', null, null ), + ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), + ut3.ut_annotation( 6, 'ann1', 'Name of suite', null ), + ut3.ut_annotation( 7, 'ann2', 'all.globaltests', null ), + ut3.ut_annotation( 9, 'test', null, 'foo'), + ut3.ut_annotation( 12, 'ann3', 'Name of suite', null ), + ut3.ut_annotation( 13, 'ann4', 'all.globaltests', null ), + ut3.ut_annotation( 15, 'test', null, 'bar') + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + end; + + procedure parse_complex_with_functions is + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + + begin + l_source := 'PACKAGE test_tt AS + -- %suite + -- %displayname(Name of suite) + -- %suitepath(all.globaltests) + + --%test + procedure foo; + + + --%beforeeach + procedure foo2; + + --test comment + -- wrong comment + + + /* + describtion of the procedure + */ + --%beforeeach(key=testval) + PROCEDURE foo3(a_value number default null); + + --%all + function foo4(a_val number default null + , a_par varchar2 default := ''asdf''); + END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 2, 'suite', null, null ), + ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), + ut3.ut_annotation( 6, 'test', null, 'foo' ), + ut3.ut_annotation( 10, 'beforeeach', null,'foo2' ), + ut3.ut_annotation( 20, 'beforeeach', 'key=testval','foo3' ), + ut3.ut_annotation( 23, 'all', null,'foo4' ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + end; + + procedure no_procedure_annotation is + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + + begin + l_source := 'PACKAGE test_tt AS + -- %suite + -- %displayname(Name of suite) + -- %suitepath(all.globaltests) + + procedure foo; + END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 2, 'suite', null, null ), + ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + end; + + procedure parse_accessible_by is + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + + begin + l_source := 'PACKAGE test_tt accessible by (foo) AS + -- %suite + -- %displayname(Name of suite) + -- %suitepath(all.globaltests) + + procedure foo; + END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 2, 'suite', null, null ), + ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + end; + + procedure complex_package_declaration is + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + + begin + l_source := 'PACKAGE test_tt + ACCESSIBLE BY (calling_proc) + authid current_user + AS + -- %suite + -- %displayname(Name of suite) + -- %suitepath(all.globaltests) + + procedure foo; + END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 5, 'suite', null, null ), + ut3.ut_annotation( 6, 'displayname', 'Name of suite', null ), + ut3.ut_annotation( 7, 'suitepath', 'all.globaltests', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + end; + + procedure complex_text is + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + + begin + l_source := 'PACKAGE test_tt AS + -- %suite + --%displayname(name = Name of suite) + -- %suitepath(key=all.globaltests,key2=foo,"--%some text") + + procedure foo; + END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 2, 'suite', null, null ), + ut3.ut_annotation( 3, 'displayname', 'name = Name of suite', null ), + ut3.ut_annotation( 4, 'suitepath', 'key=all.globaltests,key2=foo,"--%some text"', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + end; + + procedure ignore_annotations_in_comments is + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + + begin + l_source := 'PACKAGE test_tt AS + /* + Some comment + -- inlined + -- %ignored + */ + -- %suite + --%displayname(Name of suite) + -- %suitepath(all.globaltests) + + procedure foo; + END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 7, 'suite', null, null ), + ut3.ut_annotation( 8, 'displayname', 'Name of suite', null ), + ut3.ut_annotation( 9, 'suitepath', 'all.globaltests', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + end; + + procedure ignore_wrapped_package is + l_source dbms_preprocessor.source_lines_t; + l_actual ut3.ut_annotations; + begin + --Arrange + l_source(1) := 'create or replace PACKAGE tst_wrapped_pck wrapped +a000000 +369 +abcd +abcd +abcd +abcd +abcd +abcd +abcd +abcd +abcd +abcd +abcd +abcd +abcd +abcd +abcd +9 +34 6d +bg9Jaf2KguofrwaqloE8yvbggKcwg5m49TOf9b9cFj7R9JaW8lYWWi70llr/K6V0iwlp5+eb +v58yvbLAXLi9gYHwoIvAgccti+Cmpg0DKLY= +-- %some_annotation_like_text +'; + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + --Assert + ut.expect(anydata.convertCollection(l_actual)).to_be_empty(); + end; + + procedure brackets_in_desc is + + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + begin + l_source := 'PACKAGE test_tt AS + -- %suite(Name of suite (including some brackets) and some more text) +END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 2, 'suite', 'Name of suite (including some brackets) and some more text', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure test_space_before_annot_params is + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + + begin + l_source := 'PACKAGE test_tt AS + /* + Some comment + -- inlined + */ + -- %suite + -- %suitepath (all.globaltests) + + procedure foo; +END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 6, 'suite', null, null ), + ut3.ut_annotation( 7, 'suitepath', 'all.globaltests', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure test_windows_newline + as + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + begin + l_source := 'PACKAGE test_tt AS + -- %suite + -- %displayname(Name of suite)' || chr(13) || chr(10) + || ' -- %suitepath(all.globaltests) + END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 2, 'suite', null, null ), + ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure test_annot_very_long_name + as + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + begin + l_source := 'PACKAGE very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_did_it AS + -- %suite + -- %displayname(Name of suite) + -- %suitepath(all.globaltests) + + --%test + procedure very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it; + END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 2, 'suite', null, null ), + ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), + ut3.ut_annotation( 6, 'test', null, 'very_long_procedure_name_valid_for_oracle_12_so_utPLSQL_should_allow_it_definitely_well_still_not_reached_128_but_wait_we_dit_it' ) + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure test_upper_annot is + l_source clob; + l_actual ut3.ut_annotations; + l_expected ut3.ut_annotations; + begin + l_source := 'PACKAGE test_tt AS + -- %SUITE + -- %DISPLAYNAME(Name of suite) + -- %SUITEPATH(all.globaltests) + + -- %ANN1(Name of suite) + -- %ANN2(all.globaltests) + + --%TEST + procedure foo; + + -- %ANN3(Name of suite) + -- %ANN4(all.globaltests) + + --%TEST + procedure bar; + END;'; + + --Act + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + + --Assert + l_expected := ut3.ut_annotations( + ut3.ut_annotation( 2, 'suite', null, null ), + ut3.ut_annotation( 3, 'displayname', 'Name of suite', null ), + ut3.ut_annotation( 4, 'suitepath', 'all.globaltests', null ), + ut3.ut_annotation( 6, 'ann1', 'Name of suite', null ), + ut3.ut_annotation( 7, 'ann2', 'all.globaltests', null ), + ut3.ut_annotation( 9, 'test', null, 'foo'), + ut3.ut_annotation( 12, 'ann3', 'Name of suite', null ), + ut3.ut_annotation( 13, 'ann4', 'all.globaltests', null ), + ut3.ut_annotation( 15, 'test', null, 'bar') + ); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + + end; + +end test_annotation_parser; +/ diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pks b/test/ut3_tester/core/annotations/test_annotation_parser.pks new file mode 100644 index 000000000..bfd06c7b9 --- /dev/null +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pks @@ -0,0 +1,42 @@ +create or replace package test_annotation_parser is + + --%suite(ut_annotation_parser) + --%suitepath(utplsql.framework_tester.core.annotations) + + --%test(Treats procedure level annotations as package level, if mixed with comments) + procedure test_proc_comments; + --%test(Includes floating annotations between procedures and package) + procedure include_floating_annotations; + --%test(Parses complex annotations on procedures and functions) + procedure parse_complex_with_functions; + --%test(Parses package annotations without any procedure annotations) + procedure no_procedure_annotation; + --%test(Parses package level annotations with Accessible by) + procedure parse_accessible_by; + --%test(Parses package level annotations with multiline declaration) + procedure complex_package_declaration; + --%test(Parses complex text in annotation) + procedure complex_text; + --%test(Ignores content of multi-line comments) + procedure ignore_annotations_in_comments; + + --%test(Ignores wrapped package and does not raise exception) + procedure ignore_wrapped_package; + + --%test(Parses package level annotations with annotation params containing brackets) + procedure brackets_in_desc; + + --%test(Parses annotation text even with spaces before brackets) + procedure test_space_before_annot_params; + + -- %test(Parses source-code with Windows-style newline) + procedure test_windows_newline; + + -- %test(Parses annotations with very long object names) + procedure test_annot_very_long_name; + + -- %test(Parses upper case annotations) + procedure test_upper_annot; + +end test_annotation_parser; +/ diff --git a/test/ut3_tester_helper/main_helper.pkb b/test/ut3_tester_helper/main_helper.pkb index 1085e5c47..148b526a6 100644 --- a/test/ut3_tester_helper/main_helper.pkb +++ b/test/ut3_tester_helper/main_helper.pkb @@ -95,6 +95,36 @@ create or replace package body main_helper is begin ut3.ut_expectation_processor.nulls_Are_equal(a_nulls_equal); end; + + procedure cleanup_annotation_cache is + pragma autonomous_transaction; + begin + delete from ut3.ut_annotation_cache_info + where object_owner = user and object_type = 'PACKAGE' and object_name in ('DUMMY_PACKAGE','DUMMY_TEST_PACKAGE'); + commit; + end; + + procedure create_parse_proc_as_ut3$user# is + pragma autonomous_transaction; + begin + execute immediate q'[ + create or replace procedure ut3$user#.parse_annotations is + begin + ut3.ut_annotation_manager.rebuild_annotation_cache('UT3_TESTER','PACKAGE'); + end;]'; + end; + + procedure drop_parse_proc_as_ut3$user# is + pragma autonomous_transaction; + begin + execute immediate 'drop procedure ut3$user#.parse_annotations'; + end; + + procedure parse_dummy_test_as_ut3$user# is + pragma autonomous_transaction; + begin + execute immediate 'begin ut3$user#.parse_annotations; end;'; + end; end; / diff --git a/test/ut3_tester_helper/main_helper.pks b/test/ut3_tester_helper/main_helper.pks index dab973dfc..2082105d5 100644 --- a/test/ut3_tester_helper/main_helper.pks +++ b/test/ut3_tester_helper/main_helper.pks @@ -26,6 +26,14 @@ create or replace package main_helper is procedure reset_nulls_equal; procedure nulls_are_equal(a_nulls_equal boolean := true); + + procedure cleanup_annotation_cache; + + procedure create_parse_proc_as_ut3$user#; + + procedure drop_parse_proc_as_ut3$user#; + + procedure parse_dummy_test_as_ut3$user#; end; / From 0618616259c28333fe7cbe0411af63c2b92580d5 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Thu, 28 Mar 2019 20:27:30 +0000 Subject: [PATCH 033/181] Adding set of tests: core/test_ut_test core/test_ut_utils --- test/install_ut3_tester_helper.sql | 2 + test/install_ut3_tester_tests.sql | 4 + test/ut3_tester/core/test_ut_test.pkb | 717 ++++++++++++++++++++ test/ut3_tester/core/test_ut_test.pks | 97 +++ test/ut3_tester/core/test_ut_utils.pkb | 436 ++++++++++++ test/ut3_tester/core/test_ut_utils.pks | 132 ++++ test/ut3_tester_helper/run_helper.pkb | 2 +- test/ut3_tester_helper/run_helper.pks | 2 +- test/ut3_tester_helper/ut_example_tests.pkb | 25 + test/ut3_tester_helper/ut_example_tests.pks | 8 + 10 files changed, 1423 insertions(+), 2 deletions(-) create mode 100644 test/ut3_tester/core/test_ut_test.pkb create mode 100644 test/ut3_tester/core/test_ut_test.pks create mode 100644 test/ut3_tester/core/test_ut_utils.pkb create mode 100644 test/ut3_tester/core/test_ut_utils.pks create mode 100644 test/ut3_tester_helper/ut_example_tests.pkb create mode 100644 test/ut3_tester_helper/ut_example_tests.pks diff --git a/test/install_ut3_tester_helper.sql b/test/install_ut3_tester_helper.sql index f221adad6..016756675 100644 --- a/test/install_ut3_tester_helper.sql +++ b/test/install_ut3_tester_helper.sql @@ -14,10 +14,12 @@ alter session set plsql_optimize_level=0; @@ut3_tester_helper/main_helper.pks @@ut3_tester_helper/run_helper.pks @@ut3_tester_helper/expectations_helper.pks +@@ut3_tester_helper/ut_example_tests.pks @@ut3_tester_helper/main_helper.pkb @@ut3_tester_helper/run_helper.pkb @@ut3_tester_helper/expectations_helper.pkb +@@ut3_tester_helper/ut_example_tests.pkb set linesize 200 set define on diff --git a/test/install_ut3_tester_tests.sql b/test/install_ut3_tester_tests.sql index 099064fe5..069eca42a 100644 --- a/test/install_ut3_tester_tests.sql +++ b/test/install_ut3_tester_tests.sql @@ -12,6 +12,8 @@ alter session set plsql_optimize_level=0; @@ut3_tester/core/annotations/test_annot_throws_exception.pks @@ut3_tester/core/annotations/test_annotation_manager.pks @@ut3_tester/core/expectations/test_expectation_processor.pks +@@ut3_tester/core/test_ut_utils.pks +@@ut3_tester/core/test_ut_test.pks @@ut3_tester/core.pkb @@ -20,6 +22,8 @@ alter session set plsql_optimize_level=0; @@ut3_tester/core/expectations/test_expectation_processor.pkb @@ut3_tester/core/annotations/test_annotation_manager.pkb @@ut3_tester/core/annotations/test_annot_throws_exception.pkb +@@ut3_tester/core/test_ut_utils.pkb +@@ut3_tester/core/test_ut_test.pkb set linesize 200 diff --git a/test/ut3_tester/core/test_ut_test.pkb b/test/ut3_tester/core/test_ut_test.pkb new file mode 100644 index 000000000..183f9f9c9 --- /dev/null +++ b/test/ut3_tester/core/test_ut_test.pkb @@ -0,0 +1,717 @@ +create or replace package body test_ut_test is + + procedure cleanup_package_state is + begin + ut3_tester_helper.ut_example_tests.g_number := null; + end; + + procedure disabled_test is + l_suite ut3.ut_suite; + l_test ut3.ut_test; + begin + --Arrange + l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'ut_example_tests', a_line_no=> 1); + l_suite.path := 'ut3_tester_helper.ut_example_tests'; + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 2); + l_suite.items(l_suite.items.last).disabled_flag := ut3.ut_utils.boolean_to_int(true); + --Act + l_suite.do_execute(); + --Assert + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(1); + ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_success); + ut.expect(l_suite.results_count.disabled_count).to_equal(1); + ut.expect(l_suite.results_count.warnings_count).to_equal(0); + ut.expect(l_suite.results_count.success_count).to_equal(1); + ut.expect(l_suite.results_count.failure_count).to_equal(0); + ut.expect(l_suite.results_count.errored_count).to_equal(0); + end; + + procedure aftertest_errors is + l_suite ut3.ut_suite; + l_test ut3.ut_test; + begin + --Arrange + l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'ut_example_tests', a_line_no=> 1); + l_suite.path := 'ut3_tester_helper.ut_example_tests'; + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + + l_test := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); + l_test.before_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_before_test)); + l_test.after_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_after_test)); + l_suite.items.extend; + l_suite.items(l_suite.items.last) := l_test; + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); + --Act + l_suite.do_execute(); + --Assert + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(3); + ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(l_suite.results_count.disabled_count).to_equal(0); + ut.expect(l_suite.results_count.warnings_count).to_equal(0); + ut.expect(l_suite.results_count.success_count).to_equal(1); + ut.expect(l_suite.results_count.failure_count).to_equal(0); + ut.expect(l_suite.results_count.errored_count).to_equal(1); + end; + + procedure aftereach_errors is + l_suite ut3.ut_suite; + l_test ut3.ut_test; + begin + --Arrange + l_suite := ut3.ut_suite(a_object_owner => 'ut3_tester_helper', a_object_name => 'ut_example_tests', a_line_no=> 1); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + l_test := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); + l_test.before_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_before_each)); + l_test.after_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_after_each)); + l_suite.items.extend; + l_suite.items(l_suite.items.last) := l_test; + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); + --Act + l_suite.do_execute(); + --Assert + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(3); + ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(l_suite.results_count.disabled_count).to_equal(0); + ut.expect(l_suite.results_count.warnings_count).to_equal(0); + ut.expect(l_suite.results_count.success_count).to_equal(1); + ut.expect(l_suite.results_count.failure_count).to_equal(0); + ut.expect(l_suite.results_count.errored_count).to_equal(1); + end; + + procedure beforetest_errors is + l_suite ut3.ut_suite; + l_test ut3.ut_test; + begin + --Arrange + l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'ut_example_tests', a_line_no=> 1); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + l_test := ut3.ut_test(a_object_owner =>'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); + l_test.before_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_before_test)); + l_test.after_test_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_test)); + l_suite.items.extend; + l_suite.items(l_suite.items.last) := l_test; + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner =>'ut3_tester_helper',a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); + --Act + l_suite.do_execute(); + --Assert + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(2); + ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(l_suite.results_count.disabled_count).to_equal(0); + ut.expect(l_suite.results_count.warnings_count).to_equal(0); + ut.expect(l_suite.results_count.success_count).to_equal(1); + ut.expect(l_suite.results_count.failure_count).to_equal(0); + ut.expect(l_suite.results_count.errored_count).to_equal(1); + end; + + procedure beforeeach_errors is + l_suite ut3.ut_suite; + l_test ut3.ut_test; + begin + --Arrange + l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'ut_example_tests', a_line_no=> 1); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + l_test := ut3.ut_test(a_object_owner => USER,a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); + l_test.before_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'failing_procedure', ut3.ut_utils.gc_before_each)); + l_test.after_each_list := ut3.ut_executables(ut3.ut_executable(USER, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_each)); + l_suite.items.extend; + l_suite.items(l_suite.items.last) := l_test; + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => USER,a_object_name => 'ut_example_tests',a_name => 'add_1_to_g_number', a_line_no=> 1); + --Act + l_suite.do_execute(); + --Assert + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(2); + ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(l_suite.results_count.disabled_count).to_equal(0); + ut.expect(l_suite.results_count.warnings_count).to_equal(0); + ut.expect(l_suite.results_count.success_count).to_equal(1); + ut.expect(l_suite.results_count.failure_count).to_equal(0); + ut.expect(l_suite.results_count.errored_count).to_equal(1); + end; + + procedure after_each_executed is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + l_test.after_each_list := ut3.ut_executables( + ut3.ut_executable( + user, + 'UT_EXAMPLE_TESTS', + 'add_1_to_g_number', + ut3.ut_utils.gc_after_each + ) + ); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(1); + end; + + procedure after_each_proc_name_invalid is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + l_test.after_each_list := ut3.ut_executables( + ut3.ut_executable(user, 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_after_each) + ); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(0); + end; + + procedure after_each_procedure_name_null is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + l_test.after_each_list := ut3.ut_executables( + ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_after_each) + ); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(0); + end; + + procedure create_app_info_package is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package ut_output_tests + as + --%suite + + gv_before_all_client_info varchar2(200); + gv_before_each_client_info varchar2(200); + gv_before_test_client_info varchar2(200); + gv_after_test_client_info varchar2(200); + gv_after_each_client_info varchar2(200); + gv_after_all_client_info varchar2(200); + + --%test + --%beforetest(before_test) + --%aftertest(after_test) + procedure the_test; + + --%beforeall + procedure beforeall; + + --%beforeeach + procedure beforeeach; + + procedure before_test; + procedure after_test; + + --%aftereach + procedure aftereach; + + --%afterall + procedure afterall; + + end;]'; + execute immediate q'[create or replace package body ut_output_tests + as + + procedure the_test + as + l_module_name varchar2(4000); + l_action_name varchar2(4000); + l_client_info varchar2(4000); + begin + --Generate empty output + dbms_output.put_line(''); + ut.expect(1,'Test 1 Should Pass').to_equal(1); + dbms_application_info.read_module(module_name => l_module_name, action_name => l_action_name); + dbms_application_info.read_client_info(l_client_info); + ut.expect(l_module_name).to_equal('utPLSQL'); + ut.expect(l_action_name).to_be_like('ut_output_tests'); + ut.expect(l_client_info).to_be_like('the_test'); + end; + + procedure beforeall is + begin + dbms_application_info.read_client_info(gv_before_all_client_info); + end; + + procedure beforeeach is + begin + dbms_application_info.read_client_info(gv_before_each_client_info); + end; + + procedure before_test is + begin + dbms_application_info.read_client_info(gv_before_test_client_info); + end; + procedure after_test is + begin + dbms_application_info.read_client_info(gv_after_test_client_info); + end; + + procedure aftereach is + begin + dbms_application_info.read_client_info(gv_after_each_client_info); + end; + + procedure afterall is + begin + dbms_application_info.read_client_info(gv_after_all_client_info); + end; + + end;]'; + end; + + procedure drop_app_info_package is + pragma autonomous_transaction; + begin + execute immediate q'[drop package ut_output_tests]'; + end; + + procedure application_info_on_execution is + l_output_data ut3.ut_varchar2_list; + l_output clob; + function get_test_value(a_variable_name varchar2) return varchar2 is + l_result varchar2(4000); + begin + execute immediate 'begin :i := ut_output_tests.'||a_variable_name||'; end;' using out l_result; + return l_result; + end; + begin + --act + select * bulk collect into l_output_data + from table(ut3.ut.run('ut_output_tests')); + l_output := ut3.ut_utils.table_to_clob(l_output_data); + --assert + + ut.expect(get_test_value('gv_before_all_client_info')).to_equal('beforeall'); + ut.expect(get_test_value('gv_before_each_client_info')).to_equal('beforeeach'); + ut.expect(get_test_value('gv_before_test_client_info')).to_equal('before_test'); + ut.expect(get_test_value('gv_after_test_client_info')).to_equal('after_test'); + ut.expect(get_test_value('gv_after_each_client_info')).to_equal('aftereach'); + ut.expect(get_test_value('gv_after_all_client_info')).to_equal('afterall'); + ut.expect(l_output).to_be_like('%0 failed, 0 errored, 0 disabled, 0 warning(s)%'); + end; + + procedure before_each_executed is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'add_1_to_g_number', + a_line_no => null + ); + begin + l_test.before_each_list := ut3.ut_executables(ut3.ut_executable(user, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_each)); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(1); + end; + + + procedure before_each_proc_name_invalid is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + l_test.before_each_list := ut3.ut_executables( + ut3.ut_executable(user, 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_before_each) + ); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_be_null; + end; + + procedure before_each_proc_name_null is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + l_test.before_each_list := ut3.ut_executables( + ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_before_each) + ); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_be_null; + end; + + procedure ignore_savepoint_exception is + pragma autonomous_transaction; + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'ut_commit_test', + a_line_no => null + ); + begin + l_test.rollback_type := ut3.ut_utils.gc_rollback_auto; + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); + end; + + procedure owner_name_invalid is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'invalid owner name', + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + end; + + procedure owner_name_null is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(0); + end; + + procedure create_invalid_package is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package invalid_package is + v_variable non_existing_type; + procedure ut_exampletest; + end;'; + exception when others then + null; + end; + + procedure drop_invalid_package is + pragma autonomous_transaction; + begin + execute immediate 'drop package invalid_package'; + exception when others then + null; + end; + + procedure package_in_invalid_state is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_name => 'invalid_package', + a_name => 'ut_exampletest', + a_line_no => null + ); + begin + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + end; + + procedure package_name_invalid is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_name => 'invalid package name', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + end; + + procedure package_name_null is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_name => null, + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + end; + + procedure procedure_name_invalid is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'invalid procedure name', + a_line_no => null + ); + begin + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + end; + + procedure procedure_name_null is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => null, + a_line_no => null + ); + begin + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + end; + + procedure before_test_executed is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'add_1_to_g_number', + a_line_no => null + ); + begin + l_test.before_test_list := ut3.ut_executables(ut3.ut_executable(user, 'ut_example_tests', 'set_g_number_0', ut3.ut_utils.gc_before_test)); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(1); + end; + + procedure before_test_proc_name_invalid is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + l_test.before_test_list := ut3.ut_executables( + ut3.ut_executable(user, 'ut_example_tests', 'invalid setup name', ut3.ut_utils.gc_before_test) + ); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_be_null; + end; + + procedure before_test_proc_name_null is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + l_test.before_test_list := ut3.ut_executables( + ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_before_test) + ); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_be_null; + end; + + procedure after_test_executed is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + l_test.after_test_list := ut3.ut_executables(ut3.ut_executable(user, 'ut_example_tests', 'add_1_to_g_number', ut3.ut_utils.gc_after_test)); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_success); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(1); + end; + + procedure after_test_proce_name_invalid is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + l_test.after_test_list := ut3.ut_executables( + ut3.ut_executable(user, 'ut_example_tests', 'invalid procedure name', ut3.ut_utils.gc_after_test) + ); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(0); + end; + + procedure after_test_proc_name_null is + --Arrange + l_test ut3.ut_test := ut3.ut_test( + a_object_owner => 'ut3_tester_helper', + a_object_name => 'ut_example_tests', + a_name => 'set_g_number_0', + a_line_no => null + ); + begin + l_test.after_test_list := ut3.ut_executables( + ut3.ut_executable(user, 'ut_example_tests', null, ut3.ut_utils.gc_after_test) + ); + --Act + l_test.do_execute(); + --Assert + ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(0); + end; + + procedure create_output_package is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package ut_output_tests + as + --%suite + + --%beforeeach + procedure beforeeach; + + --%aftereach + procedure aftereach; + + --%test + --%beforetest(beforetest) + --%aftertest(aftertest) + procedure ut_passing_test; + + procedure beforetest; + + procedure aftertest; + + --%beforeall + procedure beforeall; + --%afterall + procedure afterall; + + end;]'; + execute immediate q'[create or replace package body ut_output_tests + as + + procedure beforetest is + begin + dbms_output.put_line(''); + end; + + procedure aftertest is + begin + dbms_output.put_line(''); + end; + + procedure beforeeach is + begin + dbms_output.put_line(''); + end; + + procedure aftereach is + begin + dbms_output.put_line(''); + end; + + procedure ut_passing_test is + begin + dbms_output.put_line(''); + ut.expect(1,'Test 1 Should Pass').to_equal(1); + end; + + procedure beforeall is + begin + dbms_output.put_line(''); + end; + + procedure afterall is + begin + dbms_output.put_line(''); + end; + + end;]'; + exception when others then + null; + end; + + procedure drop_output_package is + pragma autonomous_transaction; + begin + execute immediate 'drop package ut_output_tests'; + exception when others then + null; + end; + + procedure test_output_gathering is + l_output_data ut3.ut_varchar2_list; + l_output clob; + begin + select * bulk collect into l_output_data + from table(ut3.ut.run('ut_output_tests')); + l_output := ut3.ut_utils.table_to_clob(l_output_data); + ut.expect(l_output).to_be_like( + '%%%%%%%%1 tests, 0 failed, 0 errored%' + ); + end; + + +end; +/ diff --git a/test/ut3_tester/core/test_ut_test.pks b/test/ut3_tester/core/test_ut_test.pks new file mode 100644 index 000000000..3f10d5a6f --- /dev/null +++ b/test/ut3_tester/core/test_ut_test.pks @@ -0,0 +1,97 @@ +create or replace package test_ut_test is + + --%suite(ut_test) + --%suitepath(utplsql.framework_tester.core) + + --%beforeeach + procedure cleanup_package_state; + + --%test(Disabled flag for a test skips the tests execution in suite) + procedure disabled_test; + + --%test(Marks test as errored if aftertest raises exception) + procedure aftertest_errors; + + --%test(Marks each test as errored if aftereach raises exception) + procedure aftereach_errors; + + --%test(Marks test as errored if beforetest raises exception) + procedure beforetest_errors; + + --%test(Marks each test as errored if beforeeach raises exception) + procedure beforeeach_errors; + + + --%context(executables in test) + + --%test(Executes aftereach procedure) + procedure after_each_executed; + + --%test(Fails test when aftereach procedure name invalid) + procedure after_each_proc_name_invalid; + --%test(Tails test when aftereach procedure name null) + procedure after_each_procedure_name_null; + + procedure create_app_info_package; + procedure drop_app_info_package; + --%beforetest(create_app_info_package) + --%aftertest(drop_app_info_package) + --%test(Sets application_info on execution of individual items) + procedure application_info_on_execution; + + --%test(Executes beforeeach procedure) + procedure before_each_executed; + --%test(Fails test when beforeeach procedure name invalid) + procedure before_each_proc_name_invalid; + --%test(Fails test when beforeeach procedure name null) + procedure before_each_proc_name_null; + --%test(Does not raise exception when rollback to savepoint fails) + procedure ignore_savepoint_exception; + --%test(Fails when owner name invalid) + procedure owner_name_invalid; + + --TODO: FIX that + --%test(Runs test as current schema when owner name null) + --%disabled + procedure owner_name_null; + + procedure create_invalid_package; + procedure drop_invalid_package; + --%beforetest(create_app_info_package) + --%aftertest(drop_app_info_package) + --%test(Fails the test that references package with compilation errors) + procedure package_in_invalid_state; + --%test(Fails the test when package name is invalid) + procedure package_name_invalid; + --%test(Fails the test when package name is null) + procedure package_name_null; + --%test(Fails the test when procedure name invalid) + procedure procedure_name_invalid; + --%test(Fails the test when procedure name null) + procedure procedure_name_null; + + + --%test(Executes befroretest procedure) + procedure before_test_executed; + --%test(Fails test when befroretest procedure name invalid) + procedure before_test_proc_name_invalid; + --%test(Fails test when befroretest procedure name is null) + procedure before_test_proc_name_null; + --%test(Executes aftertest procedure) + procedure after_test_executed; + --%test(Fails test when aftertest procedure name invalid) + procedure after_test_proce_name_invalid; + --%test(Fails test when aftertest procedure name is null) + procedure after_test_proc_name_null; + + procedure create_output_package; + procedure drop_output_package; + --%beforetest(create_output_package) + --%aftertest(drop_output_package) + --%test(Test output gathering) + procedure test_output_gathering; + + --%endcontext + +end; +/ diff --git a/test/ut3_tester/core/test_ut_utils.pkb b/test/ut3_tester/core/test_ut_utils.pkb new file mode 100644 index 000000000..31e1520d2 --- /dev/null +++ b/test/ut3_tester/core/test_ut_utils.pkb @@ -0,0 +1,436 @@ +create or replace package body test_ut_utils is + + gv_nls_value nls_session_parameters.value%type; + + gc_delimiter varchar2(1) := get_numeric_delimiter(); + + function get_numeric_delimiter return varchar2 is + l_result varchar2(1); + begin + select substr(value, 1, 1) into l_result from nls_session_parameters t where t.parameter = 'NLS_NUMERIC_CHARACTERS'; + return l_result; + end; + + function clob_to_blob(p_clob clob) return blob is + l_blob blob; + l_dest_offset integer := 1; + l_source_offset integer := 1; + l_lang_context integer := dbms_lob.default_lang_ctx; + l_warning integer := dbms_lob.warn_inconvertible_char; + begin + dbms_lob.createtemporary(l_blob, true); + dbms_lob.converttoblob( + dest_lob =>l_blob, + src_clob =>p_clob, + amount =>DBMS_LOB.LOBMAXSIZE, + dest_offset =>l_dest_offset, + src_offset =>l_source_offset, + blob_csid =>DBMS_LOB.DEFAULT_CSID, + lang_context=>l_lang_context, + warning =>l_warning + ); + return l_blob; + end; + + + procedure common_clob_to_table_exec(p_clob varchar2, p_delimiter varchar2, p_expected_list ut3.ut_varchar2_list, p_limit number) is + begin + execute immediate 'declare + l_clob clob := '''||p_clob||'''; + l_delimiter varchar2(1) := '''||p_delimiter||'''; + l_expected ut3.ut_varchar2_list := :p_expected_list; + l_result ut3.ut_varchar2_list; + l_limit integer := '||p_limit||q'[; + l_result_str varchar2(32767); + l_errors integer := 0; + function compare_element(a_element_id integer, a_expected ut3.ut_varchar2_list, a_actual ut3.ut_varchar2_list) return integer is + begin + if a_expected.exists(a_element_id) and a_actual.exists(a_element_id) then + if a_expected(a_element_id) = a_actual(a_element_id) or a_expected(a_element_id) is null and a_actual(a_element_id) is null then + return 0; + else + dbms_output.put('a_expected('||a_element_id||')='||a_expected(a_element_id)||' | a_actual('||a_element_id||')='||a_actual(a_element_id)); + end if; + end if; + if not a_expected.exists(a_element_id) then + dbms_output.put('a_expected('||a_element_id||') does not exist '); + end if; + if not a_actual.exists(a_element_id) then + dbms_output.put('a_actual('||a_element_id||') does not exist '); + end if; + dbms_output.put_line(null); + return 1; + end; +begin +--Act + select column_value bulk collect into l_result from table( ut3.ut_utils.clob_to_table(l_clob, l_limit, l_delimiter) ); + for i in 1 .. l_result.count loop + l_result_str := l_result_str||''''||l_result(i)||''''||l_delimiter; + end loop; + l_result_str := rtrim(l_result_str,l_delimiter); +--Assert + for i in 1 .. greatest(l_expected.count, l_result.count) loop + l_errors := l_errors + compare_element(i, l_expected, l_result); + end loop; + ut.expect(l_errors).to_equal(0); +end;]' using p_expected_list; + end; + + procedure test_clob_to_table is + begin + common_clob_to_table_exec('a,b,c,d', ',', ut3.ut_varchar2_list('a','b','c','d'), 1000); + common_clob_to_table_exec( '', ',', ut3.ut_varchar2_list(), 1000); + common_clob_to_table_exec( '1,b,c,d', '', ut3.ut_varchar2_list('1,b,','c,d'), 4); + common_clob_to_table_exec( 'abcdefg,hijk,axa,a', ',', ut3.ut_varchar2_list('abc','def','g','hij','k','axa','a'), 3); + common_clob_to_table_exec( ',a,,c,d,', ',', ut3.ut_varchar2_list('','a','','c','d',''), 1000); + end; + + procedure test_test_result_to_char is + begin + ut.expect(ut3.ut_utils.test_result_to_char(-1),'test unknown').to_equal('Unknown(-1)'); + ut.expect(ut3.ut_utils.test_result_to_char(null),'test unknown').to_equal('Unknown(NULL)'); + ut.expect(ut3.ut_utils.test_result_to_char(ut3.ut_utils.gc_success),'test unknown').to_equal(ut3.ut_utils.gc_success_char); + end; + + procedure to_string_emptyblob is + begin + ut.expect(ut3.ut_data_value_blob(empty_blob()).to_string()).to_equal('EMPTY'); + end; + + procedure to_string_emptyclob is + begin + ut.expect(ut3.ut_data_value_clob(empty_clob()).to_string()).to_equal('EMPTY'); + end; + + procedure to_string_nullblob is + begin + ut.expect(ut3.ut_data_value_blob(null).to_string()).to_equal('NULL'); + end; + + procedure to_string_nullclob is + begin + ut.expect(ut3.ut_data_value_clob(null).to_string()).to_equal('NULL'); + end; + + procedure to_string_nulldate is + begin + ut.expect(ut3.ut_data_value_date(null).to_string()).to_equal('NULL'); + end; + + procedure to_string_nullnumber is + begin + ut.expect(ut3.ut_data_value_number(null).to_string()).to_equal('NULL'); + end; + + procedure to_string_nulltimestamp is + begin + ut.expect(ut3.ut_data_value_timestamp(null).to_string()).to_equal('NULL'); + end; + + procedure to_string_nulltimestamp_ltz is + begin + ut.expect(ut3.ut_data_value_timestamp_ltz(null).to_string()).to_equal('NULL'); + end; + + procedure to_string_nulltimestamp_tz is + begin + ut.expect(ut3.ut_data_value_timestamp_tz(null).to_string()).to_equal('NULL'); + end; + + procedure to_string_nullvarchar2 is + begin + ut.expect(ut3.ut_data_value_varchar2(null).to_string()).to_equal('NULL'); + end; + + procedure to_string_blob is + l_text varchar2(32767) := 'A test char'; + l_value blob := utl_raw.cast_to_raw(l_text); + l_expected varchar2(32767) := ''''||rawtohex(l_value)||''''; + begin + ut.expect(ut3.ut_data_value_blob(l_value).to_string()).to_equal(l_expected); + end; + + procedure to_string_clob is + l_value clob := 'A test char'; + l_expected varchar2(32767) := ''''||l_value||''''; + begin + ut.expect(ut3.ut_data_value_clob(l_value).to_string()).to_equal(l_expected); + end; + + procedure to_string_date is + l_value date := to_date('2016-12-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss'); + l_expected varchar2(100) := '2016-12-31T23:59:59'; + begin + ut.expect(ut3.ut_data_value_date(l_value).to_string()).to_equal(l_expected); + end; + + procedure to_string_timestamp is + l_value timestamp(9) := to_timestamp('2016-12-31 23:59:59.123456789', 'yyyy-mm-dd hh24:mi:ss.ff'); + l_expected varchar2(100) := '2016-12-31T23:59:59'||gc_delimiter||'123456789'; + begin + ut.expect(ut3.ut_data_value_timestamp(l_value).to_string()).to_equal(l_expected); + end; + + procedure to_string_timestamp_ltz is + l_value timestamp(9) with local time zone := to_timestamp('2016-12-31 23:59:59.123456789', 'yyyy-mm-dd hh24:mi:ss.ff'); + l_expected varchar2(100) := '2016-12-31T23:59:59'||gc_delimiter||'123456789'; + begin + ut.expect(ut3.ut_data_value_timestamp_ltz(l_value).to_string()).to_equal(l_expected); + end; + + procedure to_string_timestamp_tz is + l_value timestamp(9) with time zone := to_timestamp_tz('2016-12-31 23:59:59.123456789 -8:00', 'yyyy-mm-dd hh24:mi:ss.ff tzh:tzm'); + l_expected varchar2(100) := '2016-12-31T23:59:59'||gc_delimiter||'123456789 -08:00'; + begin + ut.expect(ut3.ut_data_value_timestamp_tz(l_value).to_string()).to_equal(l_expected); + end; + + procedure to_string_varchar2 is + l_value varchar2(20) := 'A test char'; + l_expected varchar2(100) := ''''||l_value||''''; + begin + ut.expect(ut3.ut_data_value_varchar2(l_value).to_string()).to_equal(l_expected); + end; + + procedure to_string_verybigblob is + l_text clob := lpad('A test char',32767,'1')||lpad('1',32767,'1'); + l_value blob; + begin + l_value := clob_to_blob(l_text); + ut.expect(length(ut3.ut_data_value_blob(l_value).to_string())).to_equal(ut3.ut_utils.gc_max_output_string_length); + ut.expect(ut3.ut_data_value_blob(l_value).to_string()).to_be_like('%'||ut3.ut_utils.gc_more_data_string); + end; + + procedure to_string_verybigclob is + l_value clob := lpad('A test char',32767,'1')||lpad('1',32767,'1'); + begin + ut.expect(length(ut3.ut_data_value_clob(l_value).to_string())).to_equal(ut3.ut_utils.gc_max_output_string_length); + ut.expect(ut3.ut_data_value_clob(l_value).to_string()).to_be_like('%'||ut3.ut_utils.gc_more_data_string); + end; + + procedure to_string_verybignumber is + l_value number := 1234567890123456789012345678901234567890; + l_expected varchar2(100) := '1234567890123456789012345678901234567890'; + begin + ut.expect(ut3.ut_data_value_number(l_value).to_string()).to_equal(l_expected); + end; + + procedure to_string_verybigvarchar2 is + l_value varchar2(32767) := lpad('A test char',32767,'1'); + l_result varchar2(32767); + begin + ut.expect(length(ut3.ut_data_value_varchar2(l_value).to_string())).to_equal(ut3.ut_utils.gc_max_output_string_length); + ut.expect(ut3.ut_data_value_varchar2(l_value).to_string()).to_be_like('%'||ut3.ut_utils.gc_more_data_string); + end; + + procedure to_string_verysmallnumber is + l_value number := 0.123456789012345678901234567890123456789; + l_expected varchar2(100) := gc_delimiter||'123456789012345678901234567890123456789'; + begin + ut.expect(ut3.ut_data_value_number(l_value).to_string()).to_equal(l_expected); + end; + + procedure test_table_to_clob is + procedure exec_table_to_clob(a_list ut3.ut_varchar2_list, a_delimiter varchar2, a_expected clob) is + l_result clob; + begin + l_result := ut3.ut_utils.table_to_clob(a_list, a_delimiter); + + ut.expect(l_result).to_equal(a_expected, a_nulls_are_equal => true); + end; + begin + exec_table_to_clob(null, ',', ''); + exec_table_to_clob(ut3.ut_varchar2_list(), ',', ''); + exec_table_to_clob(ut3.ut_varchar2_list('a', 'b', 'c', 'd'), ',', 'a,b,c,d'); + exec_table_to_clob(ut3.ut_varchar2_list('1,b,', 'c,d'), ',', '1,b,,c,d'); + exec_table_to_clob(ut3.ut_varchar2_list('', 'a', '', 'c', 'd', ''), ',', ',a,,c,d,'); + end; + + procedure test_append_with_multibyte is + l_lines sys.dbms_preprocessor.source_lines_t; + l_result clob; + begin + l_lines := sys.dbms_preprocessor.get_post_processed_source( + object_type => 'PACKAGE', + schema_name => sys_context('USERENV', 'CURRENT_USER'), + object_name => 'TST_CHARS' + ); + + for i in 1..l_lines.count loop + l_result := null; + ut3.ut_utils.append_to_clob(l_result, l_lines(i)); + + --Assert + ut.expect(dbms_lob.getlength(l_result),'Error for index '||i).to_equal(dbms_lob.getlength(l_lines(i))); + end loop; + end; + + procedure setup_append_with_multibyte is + pragma autonomous_transaction; + begin + select value into gv_nls_value from nls_session_parameters where parameter = 'NLS_DATE_LANGUAGE'; + execute immediate 'alter session set nls_date_language=ENGLISH'; + execute immediate 'create or replace package tst_chars as +-- 2) Status of the process = 😡PE😡 with no linked data +end;'; + execute immediate 'alter session set nls_date_language=RUSSIAN'; + + end; + procedure clean_append_with_multibyte is + pragma autonomous_transaction; + begin + execute immediate 'alter session set nls_date_language='||gv_nls_value; + execute immediate 'drop package tst_chars'; + end; + + procedure test_clob_to_table_multibyte is + l_varchar2_byte_limit integer := 32767; + l_workaround_byte_limit integer := 8191; + l_singlebyte_string_max_size varchar2(32767 char) := rpad('x',l_varchar2_byte_limit,'x'); + l_twobyte_character char(1 char) := '�?'; + l_clob_multibyte clob := l_twobyte_character||l_singlebyte_string_max_size; --here we have 32769(2+32767) bytes and 32768 chars + l_expected ut3.ut_varchar2_list := ut3.ut_varchar2_list(); + l_result ut3.ut_varchar2_list; + begin + l_expected.extend(1); + l_expected(1) := l_twobyte_character||substr(l_singlebyte_string_max_size,1,l_workaround_byte_limit-1); + --Act + l_result := ut3.ut_utils.clob_to_table(l_clob_multibyte); + --Assert + ut.expect(l_result(1)).to_equal(l_expected(1)); + end; + + procedure test_to_version_split is + l_version ut3.ut_utils.t_version; + begin + l_version := ut3.ut_utils.to_version('v034.0.0456.0333'); + ut.expect(l_version.major).to_equal(34); + ut.expect(l_version.minor).to_equal(0); + ut.expect(l_version.bugfix).to_equal(456); + ut.expect(l_version.build).to_equal(333); + end; + + procedure test_trim_list_elements + is + l_list_to_be_equal ut3.ut_varchar2_list := ut3.ut_varchar2_list('hello', 'world', 'okay'); + l_list ut3.ut_varchar2_list := ut3.ut_varchar2_list(' hello ', chr(9)||'world ', 'okay'); + begin + --Act + l_list := ut3.ut_utils.trim_list_elements(l_list); + --Assert + ut.expect(anydata.convertcollection(l_list)).to_equal(anydata.convertcollection(l_list_to_be_equal)); + end; + + procedure trim_list_elemts_null_collect + is + l_list_to_be_null ut3.ut_varchar2_list; + begin + --Act + l_list_to_be_null := ut3.ut_utils.trim_list_elements(l_list_to_be_null); + --Assert + ut.expect(anydata.convertcollection(l_list_to_be_null)).to_be_null; + end; + + procedure trim_list_elemts_empty_collect + is + l_list_to_be_empty ut3.ut_varchar2_list := ut3.ut_varchar2_list(); + begin + --Act + l_list_to_be_empty := ut3.ut_utils.trim_list_elements(l_list_to_be_empty); + --Assert + ut.expect(anydata.convertcollection(l_list_to_be_empty)).to_be_empty; + end; + + procedure test_filter_list + is + l_list_to_be_equal ut3.ut_varchar2_list := ut3.ut_varchar2_list('-12458', '8956', '789'); + l_list ut3.ut_varchar2_list := ut3.ut_varchar2_list('-12458', '8956', 'okay', null,'458963', '789'); + begin + --Act + l_list := ut3.ut_utils.filter_list(l_list, '^-?[[:digit:]]{1,5}$'); + --Assert + ut.expect(anydata.convertcollection(l_list)).to_equal(anydata.convertcollection(l_list_to_be_equal)); + end; + + procedure filter_list_null_collection + is + l_list_to_be_null ut3.ut_varchar2_list; + begin + --Act + l_list_to_be_null := ut3.ut_utils.filter_list(l_list_to_be_null, '^-?[[:digit:]]{1,5}$'); + --Assert + ut.expect(anydata.convertcollection(l_list_to_be_null)).to_be_null; + end; + + procedure filter_list_empty_collection + is + l_list_to_be_empty ut3.ut_varchar2_list := ut3.ut_varchar2_list(); + begin + --Act + l_list_to_be_empty := ut3.ut_utils.filter_list(l_list_to_be_empty, '^-?[[:digit:]]{1,5}$'); + --Assert + ut.expect(anydata.convertcollection(l_list_to_be_empty)).to_be_empty; + end; + + procedure replace_multiline_comments + is + l_source clob; + l_actual clob; + l_expected clob; + begin + --Arrange + l_source := q'[ +create or replace package dummy as + + -- single line comment with disabled /* multi-line comment */ + gv_text0 varchar2(200) := q'{/* multi-line comment + in escaped q'multi-line + string*/}'; + gv_text1 varchar2(200) := '/* multi-line comment in a string*/'; + gv_text2 varchar2(200) := '/* multi-line comment + in a multi-line + string*/'; + -- ignored start of multi-line comment with multi-byte text � /* + -- ignored end of multi-line comment with multi-byte text � */ + /* multi-line comment + with + multi-byte characters ��� + in it */ + gv_text3 varchar2(200) := 'some text'; /* multiline comment*/ --followed by single-line comment + /* multi-line comment in one line*/ + gv_text4 varchar2(200) := q'{/* multi-line comment + in escaped q'multi-line + string*/}'; +end; +]'; + l_expected := q'[ +create or replace package dummy as + + -- single line comment with disabled /* multi-line comment */ + gv_text0 varchar2(200) := q'{/* multi-line comment + in escaped q'multi-line + string*/}'; + gv_text1 varchar2(200) := '/* multi-line comment in a string*/'; + gv_text2 varchar2(200) := '/* multi-line comment + in a multi-line + string*/'; + -- ignored start of multi-line comment with multi-byte text � /* + -- ignored end of multi-line comment with multi-byte text � */ + ]'||q'[ + + + + gv_text3 varchar2(200) := 'some text'; --followed by single-line comment + ]'||q'[ + gv_text4 varchar2(200) := q'{/* multi-line comment + in escaped q'multi-line + string*/}'; +end; +]'; + --Act + l_actual := ut3.ut_utils.replace_multiline_comments(l_source); + --Assert + ut.expect(l_actual).to_equal(l_expected); + end; +end test_ut_utils; +/ diff --git a/test/ut3_tester/core/test_ut_utils.pks b/test/ut3_tester/core/test_ut_utils.pks new file mode 100644 index 000000000..ecc2596c5 --- /dev/null +++ b/test/ut3_tester/core/test_ut_utils.pks @@ -0,0 +1,132 @@ +create or replace package test_ut_utils is + + --%suite(ut_utils) + --%suitepath(utplsql.framework_tester.core) + + function get_numeric_delimiter return varchar2; + + --%test(clob_to_table - Converts a clob into ut_varchar2_list using specified delimiter) + procedure test_clob_to_table; + + --%test(test_result_to_char - Converts numeric test result to character representation) + procedure test_test_result_to_char; + + + --%context(to_string) + + --%test(Returns 'EMPTY' string for NULL BLOB) + procedure to_string_emptyblob; + + --%test(Returns 'EMPTY' string for NULL CLOB) + procedure to_string_emptyclob; + + --%test(Returns 'NULL' string for NULL BLOB) + procedure to_string_nullblob; + + --%test(Returns 'NULL' string for NULL CLOB) + procedure to_string_nullclob; + + --%test(Returns 'NULL' string for NULL date) + procedure to_string_nulldate; + + --%test(Returns 'NULL' string for NULL number) + procedure to_string_nullnumber; + + --%test(Returns 'NULL' string for NULL timestamp) + procedure to_string_nulltimestamp; + + --%test(Returns 'NULL' string for NULL timestamp with local timezone) + procedure to_string_nulltimestamp_ltz; + + --%test(Returns 'NULL' string for NULL timestamp with timezone) + procedure to_string_nulltimestamp_tz; + + --%test(Returns 'NULL' string for NULL varchar) + procedure to_string_nullvarchar2; + + --%test(Returns string representation of BLOB) + procedure to_string_blob; + + --%test(Returns string representation of CLOB) + procedure to_string_clob; + + --%test(Returns string representation of date) + procedure to_string_date; + + --%test(Returns string representation of timestamp) + procedure to_string_timestamp; + + --%test(Returns string representation of timestamp with local timezone) + procedure to_string_timestamp_ltz; + + --%test(Returns string representation of timestamp with timezone) + procedure to_string_timestamp_tz; + + --%test(Returns varchar value) + procedure to_string_varchar2; + + --%test(Returns BLOB trimmed to 4000 chars with trailing [...]) + procedure to_string_verybigblob; + +--%test(Returns CLOB trimmed to 4000 chars with trailing [...]) + procedure to_string_verybigclob; + + --%test(Returns string representation of large number) + procedure to_string_verybignumber; + + --%test(Returns varchar2 trimmed to 4000 chars with trailing [...]) + procedure to_string_verybigvarchar2; + + --%test(Returns string representation of small number) + procedure to_string_verysmallnumber; + + --%endcontext + + --%test(table_to_clob - converts ut_varchar2_list into a CLOB value) + procedure test_table_to_clob; + + --%test(append_to_clob - adds multibyte varchar to CLOB) + --%beforetest(setup_append_with_multibyte) + --%aftertest(clean_append_with_multibyte) + procedure test_append_with_multibyte; + procedure setup_append_with_multibyte; + procedure clean_append_with_multibyte; + + --%test(clob_to_table - converts multibyte CLOB to ut_varchar2_list) + --%disabled(We cannot run this test successfully on 12.1 until we change NLSCHARACTERSET from US7ASCII to AL32UTF8) + procedure test_clob_to_table_multibyte; + + --%test(to_version - splits version string into individual version components) + procedure test_to_version_split; + + --%context(trim_list_elements) + + --%test(Trims the elements of a collection) + procedure test_trim_list_elements; + + --%test(Trim list elements with null collection) + procedure trim_list_elemts_null_collect; + + --%test(Trim list elements with empty collection) + procedure trim_list_elemts_empty_collect; + + --%endcontext + + --%context(filter_list) + + --%test(Filters the collection's elements) + procedure test_filter_list; + + --%test(Filter list elements with null collection) + procedure filter_list_null_collection; + + --%test(Filter list elements with empty collection) + procedure filter_list_empty_collection; + + --%endcontext + + --%test(replace_multiline_comments - replaces multi-line comments with empty lines) + procedure replace_multiline_comments; + +end test_ut_utils; +/ diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index 8b9353f38..b6eaba702 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -302,7 +302,7 @@ create or replace package body run_helper is execute immediate 'drop package stateful_package'; execute immediate 'drop package test_stateful'; end; - + procedure run(a_reporter ut3.ut_reporter_base := null) is begin ut3.ut.run(a_reporter); diff --git a/test/ut3_tester_helper/run_helper.pks b/test/ut3_tester_helper/run_helper.pks index 5611663c2..28d20d4dc 100644 --- a/test/ut3_tester_helper/run_helper.pks +++ b/test/ut3_tester_helper/run_helper.pks @@ -16,7 +16,7 @@ create or replace package run_helper is procedure create_test_suite; procedure drop_test_suite; - + procedure run(a_reporter ut3.ut_reporter_base := null); procedure run(a_path varchar2, a_reporter ut3.ut_reporter_base := null); procedure run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null); diff --git a/test/ut3_tester_helper/ut_example_tests.pkb b/test/ut3_tester_helper/ut_example_tests.pkb new file mode 100644 index 000000000..d4954fff3 --- /dev/null +++ b/test/ut3_tester_helper/ut_example_tests.pkb @@ -0,0 +1,25 @@ +create or replace package body ut_example_tests +as + + procedure set_g_number_0 as + begin + g_number := 0; + end; + + procedure add_1_to_g_number as + begin + g_number := g_number + 1; + end; + + procedure failing_procedure as + begin + g_number := 1 / 0; + end; + + procedure ut_commit_test is + begin + commit; + end; + +end; +/ diff --git a/test/ut3_tester_helper/ut_example_tests.pks b/test/ut3_tester_helper/ut_example_tests.pks new file mode 100644 index 000000000..a7077a8a8 --- /dev/null +++ b/test/ut3_tester_helper/ut_example_tests.pks @@ -0,0 +1,8 @@ +create or replace package ut_example_tests is + g_number number; + procedure set_g_number_0; + procedure add_1_to_g_number; + procedure failing_procedure; + procedure ut_commit_test; +end; +/ From 29295b7021fab6cf220460705e41bc9f20a2ebeb Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 29 Mar 2019 08:34:00 +0000 Subject: [PATCH 034/181] Adding set of tests: core/test_ut_executable core/test_ut_suite --- test/install_ut3_tester_helper.sql | 1 + test/install_ut3_tester_tests.sql | 4 + test/ut3_tester/core/test_ut_executable.pkb | 109 +++++++++++++ test/ut3_tester/core/test_ut_executable.pks | 33 ++++ test/ut3_tester/core/test_ut_suite.pkb | 164 ++++++++++++++++++++ test/ut3_tester/core/test_ut_suite.pks | 51 ++++++ test/ut3_tester_helper/run_helper.pkb | 78 ++++++++++ test/ut3_tester_helper/run_helper.pks | 8 + test/ut3_tester_helper/ut_test_table.sql | 12 ++ 9 files changed, 460 insertions(+) create mode 100644 test/ut3_tester/core/test_ut_executable.pkb create mode 100644 test/ut3_tester/core/test_ut_executable.pks create mode 100644 test/ut3_tester/core/test_ut_suite.pkb create mode 100644 test/ut3_tester/core/test_ut_suite.pks create mode 100644 test/ut3_tester_helper/ut_test_table.sql diff --git a/test/install_ut3_tester_helper.sql b/test/install_ut3_tester_helper.sql index 016756675..1645cd4c7 100644 --- a/test/install_ut3_tester_helper.sql +++ b/test/install_ut3_tester_helper.sql @@ -10,6 +10,7 @@ alter session set plsql_optimize_level=0; @@ut3_tester_helper/test_tab_varchar2.tps @@ut3_tester_helper/test_tab_varray.tps @@ut3_tester_helper/test_dummy_number.tps +@@ut3_tester_helper/ut_test_table.sql @@ut3_tester_helper/main_helper.pks @@ut3_tester_helper/run_helper.pks diff --git a/test/install_ut3_tester_tests.sql b/test/install_ut3_tester_tests.sql index 069eca42a..700e7c8ac 100644 --- a/test/install_ut3_tester_tests.sql +++ b/test/install_ut3_tester_tests.sql @@ -14,6 +14,8 @@ alter session set plsql_optimize_level=0; @@ut3_tester/core/expectations/test_expectation_processor.pks @@ut3_tester/core/test_ut_utils.pks @@ut3_tester/core/test_ut_test.pks +@@ut3_tester/core/test_ut_suite.pks +@@ut3_tester/core/test_ut_executable.pks @@ut3_tester/core.pkb @@ -24,6 +26,8 @@ alter session set plsql_optimize_level=0; @@ut3_tester/core/annotations/test_annot_throws_exception.pkb @@ut3_tester/core/test_ut_utils.pkb @@ut3_tester/core/test_ut_test.pkb +@@ut3_tester/core/test_ut_suite.pkb +@@ut3_tester/core/test_ut_executable.pkb set linesize 200 diff --git a/test/ut3_tester/core/test_ut_executable.pkb b/test/ut3_tester/core/test_ut_executable.pkb new file mode 100644 index 000000000..1d2e74ff3 --- /dev/null +++ b/test/ut3_tester/core/test_ut_executable.pkb @@ -0,0 +1,109 @@ +create or replace package body test_ut_executable is + + g_dbms_output_text varchar2(30) := 'Some output from procedure'; + + procedure exec_schema_package_proc is + l_executable ut3.ut_executable; + l_test ut3.ut_test; + l_result boolean; + begin + --Arrange + l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable', a_line_no=> 1); + l_executable := ut3.ut_executable_test( null, 'test_ut_executable', 'passing_proc', ut3.ut_utils.gc_test_execute ); + --Act + l_result := l_executable.do_execute(l_test); + --Assert + ut.expect(l_result).to_be_true; + ut.expect(l_executable.serveroutput).to_be_null; + ut.expect(l_executable.get_error_stack_trace()).to_be_null; + end; + + procedure exec_package_proc_output is + l_executable ut3.ut_executable; + l_test ut3.ut_test; + l_result boolean; + begin + --Arrange + l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable', a_line_no=> 1); + l_executable := ut3.ut_executable_test( user, 'test_ut_executable', 'output_proc', ut3.ut_utils.gc_test_execute ); + --Act + l_result := l_executable.do_execute(l_test); + --Assert + ut.expect(l_result).to_be_true; + ut.expect(l_executable.serveroutput).to_equal(to_clob(g_dbms_output_text||chr(10))); + ut.expect(l_executable.get_error_stack_trace()).to_be_null; + end; + + procedure exec_failing_proc is + l_executable ut3.ut_executable; + l_test ut3.ut_test; + l_result boolean; + begin + --Arrange + l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable', a_line_no=> 1); + l_executable := ut3.ut_executable_test( user, 'test_ut_executable', 'throwing_proc', ut3.ut_utils.gc_test_execute ); + --Act + l_result := l_executable.do_execute(l_test); + --Assert + ut.expect(l_result).to_be_false; + ut.expect(l_executable.serveroutput).to_be_null; + ut.expect(l_executable.get_error_stack_trace()).to_be_like('ORA-06501: PL/SQL: program error%'); + end; + + procedure modify_stateful_package is + l_job_name varchar2(30) := 'recreate_stateful_package'; + l_cnt integer := 1; + pragma autonomous_transaction; + begin + dbms_scheduler.create_job( + job_name => l_job_name, + job_type => 'PLSQL_BLOCK', + job_action => q'/ + begin + execute immediate q'[ + create or replace package stateful_package as + g_state varchar2(3) := 'abc'; + end;]'; + end;/', + start_date => localtimestamp, + enabled => TRUE, + auto_drop => TRUE, + comments => 'one-time job' + ); + $if dbms_db_version.version >= 18 $then + dbms_session.sleep(0.4); + $else + dbms_lock.sleep(0.4); + $end + while l_cnt > 0 loop + select count(1) into l_cnt + from dba_scheduler_running_jobs srj + where srj.job_name = l_job_name; + end loop; + end; + + procedure form_name is + begin + ut.expect(ut3.ut_executable_test( user, ' package ', 'proc', null ).form_name()).to_equal(user||'.package.proc'); + ut.expect(ut3.ut_executable_test( null, 'package', ' proc ', null ).form_name()).to_equal('package.proc'); + ut.expect(ut3.ut_executable_test( null, 'proc', null, null ).form_name()).to_equal('proc'); + ut.expect(ut3.ut_executable_test( ' '||user||' ', 'proc', null, null ).form_name()).to_equal(user||'.proc'); + end; + + procedure passing_proc is + begin + null; + end; + + procedure output_proc is + begin + dbms_output.put_line(g_dbms_output_text); + end; + + procedure throwing_proc is + begin + raise program_error; + end; + +end; +/ diff --git a/test/ut3_tester/core/test_ut_executable.pks b/test/ut3_tester/core/test_ut_executable.pks new file mode 100644 index 000000000..acb91d1be --- /dev/null +++ b/test/ut3_tester/core/test_ut_executable.pks @@ -0,0 +1,33 @@ +create or replace package test_ut_executable is + + --%suite(ut_executable) + --%suitepath(utplsql.framework_tester.core) + + --%context(do_execute) + + --%test(Executes procedure in current schema when user was not provided) + procedure exec_schema_package_proc; + + --%test(Executes procedure and saves dbms_output) + procedure exec_package_proc_output; + + --%test(Executes a procedure raising exception, saves dbms_output and exception stack trace) + procedure exec_failing_proc; + + --%endcontext + + --%context(form_name) + + --%test(Builds a name for the executable test) + procedure form_name; + + --%endcontext + + procedure passing_proc; + + procedure output_proc; + + procedure throwing_proc; + +end; +/ diff --git a/test/ut3_tester/core/test_ut_suite.pkb b/test/ut3_tester/core/test_ut_suite.pkb new file mode 100644 index 000000000..3ea323a6d --- /dev/null +++ b/test/ut3_tester/core/test_ut_suite.pkb @@ -0,0 +1,164 @@ +create or replace package body test_ut_suite is + + procedure cleanup_package_state is + begin + ut3_tester_helper.ut_example_tests.g_number := null; + end; + + procedure create_trans_control is + begin + ut3_tester_helper.run_helper.create_trans_control; + end; + + procedure drop_trans_control is + begin + ut3_tester_helper.run_helper.drop_trans_control; + end; + + procedure disabled_suite is + l_suite ut3.ut_suite; + begin + --Arrange + l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); + l_suite.path := 'ut3_tester_helper.ut_example_tests'; + l_suite.disabled_flag := ut3.ut_utils.boolean_to_int(true); + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'set_g_number_0', ut3.ut_utils.gc_before_all)); + l_suite.after_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'add_1_to_g_number', ut3.ut_utils.gc_before_all)); + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper', a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper', a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); + --Act + l_suite.do_execute(); + --Assert + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_be_null; + ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_disabled); + ut.expect(l_suite.results_count.disabled_count).to_equal(2); + ut.expect(l_suite.results_count.warnings_count).to_equal(0); + ut.expect(l_suite.results_count.success_count).to_equal(0); + ut.expect(l_suite.results_count.failure_count).to_equal(0); + ut.expect(l_suite.results_count.errored_count).to_equal(0); + end; + + procedure beforeall_errors is + l_suite ut3.ut_suite; + begin + --Arrange + l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); + l_suite.path := 'ut3_tester_helper.ut_example_tests'; + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_before_all)); + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper',a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'set_g_number_0', a_line_no=> 1); + --Act + l_suite.do_execute(); + --Assert + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_be_null; + ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); + ut.expect(l_suite.results_count.disabled_count).to_equal(0); + ut.expect(l_suite.results_count.warnings_count).to_equal(0); + ut.expect(l_suite.results_count.success_count).to_equal(0); + ut.expect(l_suite.results_count.failure_count).to_equal(0); + ut.expect(l_suite.results_count.errored_count).to_equal(1); + end; + + procedure aftereall_errors is + l_suite ut3.ut_suite; + begin + --Arrange + l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); + l_suite.path := 'ut3_tester_helper.ut_example_tests'; + l_suite.after_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_EXAMPLE_TESTS', 'failing_procedure', ut3.ut_utils.gc_after_all)); + + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper', a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'set_g_number_0', a_line_no=> 1); + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => 'ut3_tester_helper', a_object_name => 'UT_EXAMPLE_TESTS',a_name => 'add_1_to_g_number', a_line_no=> 1); + --Act + l_suite.do_execute(); + --Assert + ut.expect(ut3_tester_helper.ut_example_tests.g_number).to_equal(1); + ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_success); + ut.expect(l_suite.results_count.disabled_count).to_equal(0); + ut.expect(l_suite.results_count.warnings_count).to_equal(1); + ut.expect(l_suite.results_count.success_count).to_equal(2); + ut.expect(l_suite.results_count.failure_count).to_equal(0); + ut.expect(l_suite.results_count.errored_count).to_equal(0); + end; + + procedure package_without_body is + l_suite ut3.ut_suite; + begin + l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_WITHOUT_BODY', a_line_no=> 1); + l_suite.path := 'UT_WITHOUT_BODY'; + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'ut_without_body',a_name => 'test1', a_line_no=> 1); + --Act + l_suite.do_execute(); + --Assert + ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); + end; + + procedure package_with_invalid_body is + l_suite ut3.ut_suite; + begin + l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_WITH_INVALID_BODY', a_line_no=> 1); + l_suite.path := 'UT_WITH_INVALID_BODY'; + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_name => 'ut_with_invalid_body',a_name => 'test1', a_line_no=> 1); + --Act + l_suite.do_execute(); + --Assert + ut.expect(l_suite.result).to_equal(ut3.ut_utils.gc_error); + end; + + procedure rollback_auto is + l_suite ut3.ut_suite; + begin + --Arrange + execute immediate 'delete from ut3_tester_helper.ut$test_table'; + l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_TRANSACTION_CONTROL', a_line_no=> 1); + l_suite.path := 'ut3_tester_helper.ut_transaction_control'; + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_TRANSACTION_CONTROL', 'setup', ut3.ut_utils.gc_before_all)); + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => USER, a_object_name => 'ut_transaction_control',a_name => 'test', a_line_no=> 1); + l_suite.set_rollback_type(ut3.ut_utils.gc_rollback_auto); + + --Act + l_suite.do_execute(); + + --Assert + ut.expect(ut3_tester_helper.main_helper.get_value(q'[ut3_tester_helper.ut_transaction_control.count_rows('t')]')).to_equal(0); + ut.expect(ut3_tester_helper.main_helper.get_value(q'[ut3_tester_helper.ut_transaction_control.count_rows('s')]')).to_equal(0); + end; + + procedure rollback_auto_on_failure is + begin + ut3_tester_helper.run_helper.test_rollback_type('test_failure', ut3.ut_utils.gc_rollback_auto, equal(0) ); + end; + + procedure rollback_manual is + begin + ut3_tester_helper.run_helper.test_rollback_type('test', ut3.ut_utils.gc_rollback_manual, be_greater_than(0) ); + end; + + procedure rollback_manual_on_failure is + begin + ut3_tester_helper.run_helper.test_rollback_type('test_failure', ut3.ut_utils.gc_rollback_manual, be_greater_than(0) ); + end; + + procedure trim_transaction_invalidators is + l_suite ut3.ut_suite; + begin + --arrange + l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_EXAMPLE_TESTS', a_line_no=> 1); + for i in 1 .. 100 loop + l_suite.add_transaction_invalidator('schema_name.package_name.procedure_name'||i); + end loop; + --Act + l_suite.rollback_to_savepoint('dummy_savepoint'); + --Assert + ut.expect(l_suite.warnings.count).to_equal(1); + end; + +end; +/ \ No newline at end of file diff --git a/test/ut3_tester/core/test_ut_suite.pks b/test/ut3_tester/core/test_ut_suite.pks new file mode 100644 index 000000000..fd351d87f --- /dev/null +++ b/test/ut3_tester/core/test_ut_suite.pks @@ -0,0 +1,51 @@ +create or replace package test_ut_suite is + + --%suite(ut_suite) + --%suitepath(utplsql.core.framework_tester) + + --%beforeeach + procedure cleanup_package_state; + + --%test(Disabled flag skips tests execution in suite) + procedure disabled_suite; + + --%test(Marks each test as errored if beforeall raises exception) + procedure beforeall_errors; + + --%test(Reports warnings for each test if afterall raises exception) + procedure aftereall_errors; + + --%beforetest(ut3_tester_helper.run_helper.package_no_body) + --%aftertest(ut3_tester_helper.run_helper.drop_package_no_body) + --%test(Fails all tests in package when package has no body) + procedure package_without_body; + + --%test(Fails all tests in package when package body is invalid) + procedure package_with_invalid_body; + + --%context( rollback_test ) + + --%beforeall + procedure create_trans_control; + --%afterall + procedure drop_trans_control; + + --%test(Performs automatic rollback after a suite) + procedure rollback_auto; + + --%test(Performs automatic rollback after a suite even if test fails) + procedure rollback_auto_on_failure; + + --%test(rollback(manual) - disables automatic rollback after a suite) + procedure rollback_manual; + + --%test(rollback(manual) - disables automatic rollback after a suite even if test fails) + procedure rollback_manual_on_failure; + + --%endcontext + + --%test(Transaction invalidators list is trimmed in warnings when too long) + procedure trim_transaction_invalidators; + +end; +/ diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index b6eaba702..c8983e961 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -27,6 +27,49 @@ create or replace package body run_helper is execute immediate q'[grant execute on ut3_tester_helper.dummy_test_procedure to public]'; end; + procedure create_trans_control is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package ut_transaction_control as + function count_rows(a_val varchar2) return number; + procedure setup; + procedure test; + procedure test_failure; + end;]'; + + execute immediate + q'[create or replace package body ut_transaction_control + as + + function count_rows(a_val varchar2) return number is + l_cnt number; + begin + select count(*) into l_cnt from ut$test_table t where t.val = a_val; + return l_cnt; + end; + procedure setup is begin + insert into ut$test_table values ('s'); + end; + procedure test is + begin + insert into ut$test_table values ('t'); + end; + procedure test_failure is + begin + insert into ut$test_table values ('t'); + --raise no_data_found; + raise_application_error(-20001,'Error'); + end; + end;]'; + + execute immediate 'grant execute on ut_transaction_control to public'; + end; + + procedure drop_trans_control is + pragma autonomous_transaction; + begin + execute immediate 'drop package ut_transaction_control'; + end; procedure setup_cache is pragma autonomous_transaction; @@ -303,6 +346,20 @@ create or replace package body run_helper is execute immediate 'drop package test_stateful'; end; + procedure package_no_body is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package ut_without_body as + procedure test1; + end;'; + end; + + procedure drop_package_no_body is + pragma autonomous_transaction; + begin + execute immediate 'drop package ut_without_body'; + end; + procedure run(a_reporter ut3.ut_reporter_base := null) is begin ut3.ut.run(a_reporter); @@ -374,5 +431,26 @@ create or replace package body run_helper is )); return l_results; end; + + procedure test_rollback_type(a_procedure_name varchar2, a_rollback_type integer, a_expectation ut3_latest_release.ut_matcher) is + l_suite ut3.ut_suite; + begin + --Arrange + execute immediate 'delete from ut$test_table'; + l_suite := ut3.ut_suite(a_object_owner => USER, a_object_name => 'UT_TRANSACTION_CONTROL', a_line_no=> 1); + l_suite.path := 'ut_transaction_control'; + l_suite.before_all_list := ut3.ut_executables(ut3.ut_executable(USER, 'UT_TRANSACTION_CONTROL', 'setup', ut3.ut_utils.gc_before_all)); + l_suite.items.extend; + l_suite.items(l_suite.items.last) := ut3.ut_test(a_object_owner => USER, a_object_name => 'ut_transaction_control',a_name => a_procedure_name, a_line_no=> 1); + l_suite.set_rollback_type(a_rollback_type); + + --Act + l_suite.do_execute(); + + --Assert + ut.expect(main_helper.get_value(q'[ut_transaction_control.count_rows('t')]')).to_( a_expectation ); + ut.expect(main_helper.get_value(q'[ut_transaction_control.count_rows('s')]')).to_( a_expectation ); + end; + end; / diff --git a/test/ut3_tester_helper/run_helper.pks b/test/ut3_tester_helper/run_helper.pks index 28d20d4dc..92767bc20 100644 --- a/test/ut3_tester_helper/run_helper.pks +++ b/test/ut3_tester_helper/run_helper.pks @@ -16,6 +16,11 @@ create or replace package run_helper is procedure create_test_suite; procedure drop_test_suite; + procedure package_no_body; + procedure drop_package_no_body; + + procedure create_trans_control; + procedure drop_trans_control; procedure run(a_reporter ut3.ut_reporter_base := null); procedure run(a_path varchar2, a_reporter ut3.ut_reporter_base := null); @@ -31,5 +36,8 @@ create or replace package run_helper is return ut3.ut_varchar2_list; function run(a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) return ut3.ut_varchar2_list; + + procedure test_rollback_type(a_procedure_name varchar2, a_rollback_type integer, a_expectation ut3_latest_release.ut_matcher); + end; / diff --git a/test/ut3_tester_helper/ut_test_table.sql b/test/ut3_tester_helper/ut_test_table.sql new file mode 100644 index 000000000..c4832a10f --- /dev/null +++ b/test/ut3_tester_helper/ut_test_table.sql @@ -0,0 +1,12 @@ +declare + l_exists integer; +begin + select count(1) into l_exists from user_tables where table_name = 'UT$TEST_TABLE'; + if l_exists > 0 then + execute immediate 'drop table ut$test_table'; + end if; +end; +/ + +create table ut$test_table (val varchar2(1)); +grant select,insert,update,delete on ut$test_table to public; From 30b0cfef62d494d8970a83e6bd422d7d3c5feb00 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 29 Mar 2019 21:44:45 +0000 Subject: [PATCH 035/181] Adding set of tests: core/test_file_mapper core/test_output_buffer core/test_suite_manager core/test_ut_executable --- test/install_ut3_tester_tests.sql | 6 + test/ut3_tester/core/test_file_mapper.pkb | 45 + test/ut3_tester/core/test_file_mapper.pks | 13 + test/ut3_tester/core/test_output_buffer.pkb | 96 ++ test/ut3_tester/core/test_output_buffer.pks | 19 + test/ut3_tester/core/test_suite_manager.pkb | 1470 +++++++++++++++++++ test/ut3_tester/core/test_suite_manager.pks | 175 +++ test/ut3_tester/core/test_ut_executable.pkb | 15 +- test/ut3_tester/core/test_ut_executable.pks | 2 + test/ut3_tester_helper/main_helper.pkb | 8 + test/ut3_tester_helper/main_helper.pks | 2 + test/ut3_tester_helper/run_helper.pkb | 71 + test/ut3_tester_helper/run_helper.pks | 11 + 13 files changed, 1925 insertions(+), 8 deletions(-) create mode 100644 test/ut3_tester/core/test_file_mapper.pkb create mode 100644 test/ut3_tester/core/test_file_mapper.pks create mode 100644 test/ut3_tester/core/test_output_buffer.pkb create mode 100644 test/ut3_tester/core/test_output_buffer.pks create mode 100644 test/ut3_tester/core/test_suite_manager.pkb create mode 100644 test/ut3_tester/core/test_suite_manager.pks diff --git a/test/install_ut3_tester_tests.sql b/test/install_ut3_tester_tests.sql index 700e7c8ac..511201f16 100644 --- a/test/install_ut3_tester_tests.sql +++ b/test/install_ut3_tester_tests.sql @@ -16,6 +16,9 @@ alter session set plsql_optimize_level=0; @@ut3_tester/core/test_ut_test.pks @@ut3_tester/core/test_ut_suite.pks @@ut3_tester/core/test_ut_executable.pks +@@ut3_tester/core/test_suite_manager.pks +@@ut3_tester/core/test_file_mapper.pks +@@ut3_tester/core/test_output_buffer.pks @@ut3_tester/core.pkb @@ -28,6 +31,9 @@ alter session set plsql_optimize_level=0; @@ut3_tester/core/test_ut_test.pkb @@ut3_tester/core/test_ut_suite.pkb @@ut3_tester/core/test_ut_executable.pkb +@@ut3_tester/core/test_suite_manager.pkb +@@ut3_tester/core/test_file_mapper.pkb +@@ut3_tester/core/test_output_buffer.pkb set linesize 200 diff --git a/test/ut3_tester/core/test_file_mapper.pkb b/test/ut3_tester/core/test_file_mapper.pkb new file mode 100644 index 000000000..3813c9450 --- /dev/null +++ b/test/ut3_tester/core/test_file_mapper.pkb @@ -0,0 +1,45 @@ +create or replace package body test_file_mapper is + + procedure default_mappings is + l_actual ut3.ut_file_mappings; + l_expected ut3.ut_file_mappings; + begin + --Arrange + l_expected := ut3.ut_file_mappings( + ut3.ut_file_mapping('C:\tests\helpers\core.pkb',sys_context('USERENV', 'CURRENT_USER'),'CORE','PACKAGE BODY'), + ut3.ut_file_mapping('tests/helpers/test_file_mapper.pkb',sys_context('USERENV', 'CURRENT_USER'),'TEST_FILE_MAPPER','PACKAGE BODY') + ); + --Act + l_actual := ut3.ut_file_mapper.build_file_mappings( + ut3.ut_varchar2_list( + 'C:\tests\helpers\core.pkb', + 'tests/helpers/test_file_mapper.pkb' + ) + ); + --Assert + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure specific_owner is + l_actual ut3.ut_file_mappings; + l_expected ut3.ut_file_mappings; + begin + --Arrange + l_expected := ut3.ut_file_mappings( + ut3.ut_file_mapping('C:\source\core\types\ut_file_mapping.tpb','UT3','UT_FILE_MAPPING','TYPE BODY'), + ut3.ut_file_mapping('source/core/ut_file_mapper.pkb','UT3','UT_FILE_MAPPER','PACKAGE BODY') + ); + --Act + l_actual := ut3.ut_file_mapper.build_file_mappings( + 'UT3', + ut3.ut_varchar2_list( + 'C:\source\core\types\ut_file_mapping.tpb', + 'source/core/ut_file_mapper.pkb' + ) + ); + --Assert + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + +end; +/ diff --git a/test/ut3_tester/core/test_file_mapper.pks b/test/ut3_tester/core/test_file_mapper.pks new file mode 100644 index 000000000..4f9c41bd0 --- /dev/null +++ b/test/ut3_tester/core/test_file_mapper.pks @@ -0,0 +1,13 @@ +create or replace package test_file_mapper is + + --%suite(file_mapper) + --%suitepath(utplsql.framework_tester.core) + + --%test(Maps file paths into database objects using default mappings) + procedure default_mappings; + + --%test(Used specified object owner to perform mapping when files have no owner indication) + procedure specific_owner; + +end; +/ diff --git a/test/ut3_tester/core/test_output_buffer.pkb b/test/ut3_tester/core/test_output_buffer.pkb new file mode 100644 index 000000000..3b469ddb8 --- /dev/null +++ b/test/ut3_tester/core/test_output_buffer.pkb @@ -0,0 +1,96 @@ +create or replace package body test_output_buffer is + + procedure test_receive is + l_actual_text clob; + l_actual_item_type varchar2(1000); + l_remaining integer; + l_expected_text clob; + l_expected_item_type varchar2(1000); + l_buffer ut3.ut_output_buffer_base; + begin + --Arrange + l_buffer := ut3.ut_output_table_buffer(); + l_expected_text := to_clob(lpad('a text', 31000, ',a text')) + || chr(10) || to_clob(lpad('a text', 31000, ',a text')) + || chr(13) || to_clob(lpad('a text', 31000, ',a text')) + || chr(13) || chr(10) || to_clob(lpad('a text', 31000, ',a text')) || to_clob(lpad('a text', 31000, ',a text')); + l_expected_item_type := lpad('some item type',1000,'-'); + --Act + l_buffer.send_clob(l_expected_text, l_expected_item_type); + l_buffer.close(); + + select text, item_type + into l_actual_text, l_actual_item_type + from table(l_buffer.get_lines(0,0)); + + --Assert + ut.expect(l_actual_text).to_equal(l_expected_text); + ut.expect(l_actual_item_type).to_equal(l_expected_item_type); + + select count(1) into l_remaining from table(ut3_tester_helper.run_helper.ut_output_buffer_tmp) + where output_id = l_buffer.output_id; + + ut.expect(l_remaining).to_equal(0); + end; + + procedure test_doesnt_send_on_null_text is + l_cur sys_refcursor; + l_result integer; + l_buffer ut3.ut_output_buffer_base := ut3.ut_output_table_buffer(); + begin + ut3_tester_helper.run_helper.delete_buffer(); + --Act + l_buffer.send_line(null); + + open l_cur for select * from table(ut3_tester_helper.run_helper.ut_output_buffer_tmp); + ut.expect(l_cur).to_be_empty; + end; + + procedure test_send_line is + l_result varchar2(4000); + c_expected constant varchar2(4000) := lpad('a text',4000,',a text'); + l_buffer ut3.ut_output_buffer_base := ut3.ut_output_table_buffer(); + begin + l_buffer.send_line(c_expected); + + select text into l_result from table(ut3_tester_helper.run_helper.ut_output_buffer_tmp) where output_id = l_buffer.output_id; + + ut.expect(l_result).to_equal(c_expected); + end; + + procedure test_waiting_for_data is + l_result clob; + l_remaining integer; + l_expected clob; + l_buffer ut3.ut_output_buffer_base := ut3.ut_output_table_buffer(); + l_start timestamp; + l_duration interval day to second; + begin + --Arrange + l_expected := 'a text'; + l_buffer.send_line(l_expected); + l_start := localtimestamp; + --Act + begin + select text into l_result from table(l_buffer.get_lines(1,1)); + ut.fail('Expected a timeout exception but nothing was raised'); + exception + when others then + l_duration := localtimestamp - l_start; + --Assert + --Fetches data from output + ut.expect(l_result).to_equal(l_expected); + --Throws a timeout exception + ut.expect(dbms_utility.format_error_stack()).to_match('ORA'||ut3.ut_utils.gc_out_buffer_timeout); + --Waited for one second + ut.expect(l_duration).to_be_greater_than(interval '0.99' second); + end; + + select count(1) into l_remaining from table(ut3_tester_helper.run_helper.ut_output_buffer_tmp) where output_id = l_buffer.output_id; + --Data got removed from output buffer + ut.expect(l_remaining).to_equal(0); + + end; + +end test_output_buffer; +/ diff --git a/test/ut3_tester/core/test_output_buffer.pks b/test/ut3_tester/core/test_output_buffer.pks new file mode 100644 index 000000000..cf069427d --- /dev/null +++ b/test/ut3_tester/core/test_output_buffer.pks @@ -0,0 +1,19 @@ +create or replace package test_output_buffer is + + --%suite(output_buffer) + --%suitepath(utplsql.framework_tester.core) + + --%test(Receives a line from buffer table and deletes) + procedure test_receive; + + --%test(Does not send line if null text given) + procedure test_doesnt_send_on_null_text; + + --%test(Sends a line into buffer table) + procedure test_send_line; + + --%test(Waits For The Data To Appear For Specified Time) + procedure test_waiting_for_data; + +end test_output_buffer; +/ diff --git a/test/ut3_tester/core/test_suite_manager.pkb b/test/ut3_tester/core/test_suite_manager.pkb new file mode 100644 index 000000000..6f4237f9c --- /dev/null +++ b/test/ut3_tester/core/test_suite_manager.pkb @@ -0,0 +1,1470 @@ +create or replace package body test_suite_manager is + + ex_obj_doesnt_exist exception; + pragma exception_init(ex_obj_doesnt_exist, -04043); + + procedure create_dummy_long_test_package is + begin + ut3_tester_helper.run_helper.create_dummy_long_test_package(); + end; + + procedure drop_dummy_long_test_package is + begin + ut3_tester_helper.run_helper.drop_dummy_long_test_package(); + end; + + procedure compile_dummy_packages is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package test_package_1 is + + --%suite + --%displayname(test_package_1) + --%suitepath(tests) + --%rollback(manual) + + gv_glob_val number; + + --%beforeeach + procedure global_setup; + + --%aftereach + procedure global_teardown; + + --%test + --%displayname(Test1 from test package 1) + procedure test1; + + --%test(Test2 from test package 1) + --%beforetest(test2_setup) + --%aftertest(test2_teardown) + procedure test2; + + procedure test2_setup; + + procedure test2_teardown; + +end test_package_1;]'; + + execute immediate q'[create or replace package body test_package_1 is + gv_var_1 number; + gv_var_1_temp number; + + procedure global_setup is + begin + gv_var_1 := 1; + gv_glob_val := 1; + end; + + procedure global_teardown is + begin + gv_var_1 := 0; + gv_glob_val := 0; + end; + + procedure test1 is + begin + ut.expect(gv_var_1, 'Some expectation').to_equal(1); + end; + + procedure test2 is + begin + ut.expect(gv_var_1, 'Some expectation').to_equal(2); + end; + + procedure test2_setup is + begin + gv_var_1_temp := gv_var_1; + gv_var_1 := 2; + end; + + procedure test2_teardown is + begin + gv_var_1 := gv_var_1_temp; + gv_var_1_temp := null; + end; + +end test_package_1;]'; + + execute immediate q'[create or replace package test_package_2 is + --%suite + --%suitepath(tests.test_package_1) + + gv_glob_val varchar2(1); + + --%beforeeach + procedure global_setup; + + --%aftereach + procedure global_teardown; + + --%test + procedure test1; + + --%test + --%beforetest(test2_setup) + --%aftertest(test2_teardown) + procedure test2; + + procedure test2_setup; + + procedure test2_teardown; + + --%beforeall + procedure context_setup; + + --%test(Test in a context) + procedure context_test; + + --%afterall + procedure context_teardown; + +end test_package_2;]'; + + execute immediate q'[create or replace package body test_package_2 is + gv_var_1 varchar2(1); + gv_var_1_temp varchar2(1); + + procedure global_setup is + begin + gv_var_1 := 'a'; + gv_glob_val := 'z'; + end; + + procedure global_teardown is + begin + gv_var_1 := 'n'; + gv_glob_val := 'n'; + end; + + procedure test1 is + begin + ut.expect(gv_var_1).to_equal('a'); + end; + + procedure test2 is + begin + ut.expect(gv_var_1).to_equal('b'); + end; + + procedure test2_setup is + begin + gv_var_1_temp := gv_var_1; + gv_var_1 := 'b'; + end; + + procedure test2_teardown is + begin + gv_var_1 := gv_var_1_temp; + gv_var_1_temp := null; + end; + + procedure context_setup is + begin + gv_var_1_temp := gv_var_1 || 'a'; + end; + + procedure context_test is + begin + ut.expect(gv_var_1_temp, 'Some expectation').to_equal('na'); + end; + + procedure context_teardown is + begin + gv_var_1_temp := null; + end; + +end test_package_2;]'; + + execute immediate q'[create or replace package test_package_3 is + --%suite + --%suitepath(tests2) + --%rollback(auto) + + gv_glob_val number; + + --%beforeeach + procedure global_setup; + + --%aftereach + procedure global_teardown; + + --%test + --%rollback(auto) + procedure test1; + + --%test + --%beforetest(test2_setup) + --%aftertest(test2_teardown) + procedure test2; + + procedure test2_setup; + + procedure test2_teardown; + + --%test + --%disabled + procedure disabled_test; + +end test_package_3;]'; + + execute immediate q'[create or replace package body test_package_3 is + gv_var_1 number; + gv_var_1_temp number; + + procedure global_setup is + begin + gv_var_1 := 1; + gv_glob_val := 1; + end; + + procedure global_teardown is + begin + gv_var_1 := 0; + gv_glob_val := 0; + end; + + procedure test1 is + begin + ut.expect(gv_var_1).to_equal(1); + end; + + procedure test2 is + begin + ut.expect(gv_var_1).to_equal(2); + end; + + procedure test2_setup is + begin + gv_var_1_temp := gv_var_1; + gv_var_1 := 2; + end; + + procedure test2_teardown is + begin + gv_var_1 := gv_var_1_temp; + gv_var_1_temp := null; + end; + + procedure disabled_test is + begin + null; + end; + +end test_package_3;]'; + + execute immediate q'[create or replace package test_package_with_ctx is + + --%suite(test_package_with_ctx) + + gv_glob_val number; + + --%context(some_context) + --%displayname(Some context description) + + --%test + --%displayname(Test1 from test package 1) + procedure test1; + + --%endcontext + +end test_package_with_ctx;]'; + + execute immediate q'[create or replace package body test_package_with_ctx is + + procedure test1 is + begin + null; + end; + +end test_package_with_ctx;]'; + end; + + + procedure drop_dummy_packages is + pragma autonomous_transaction; + begin + execute immediate 'drop package test_package_1'; + execute immediate 'drop package test_package_2'; + execute immediate 'drop package test_package_3'; + execute immediate 'drop package test_package_with_ctx'; + end; + + procedure test_schema_run is + c_path constant varchar2(100) := sys_context('USERENV', 'CURRENT_USER'); + l_objects_to_run ut3.ut_suite_items := ut3.ut_suite_items(); + l_all_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test2_suite ut3.ut_logical_suite; + begin + --Act + l_all_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + for i in 1..l_all_objects_to_run.count loop + if l_all_objects_to_run(i).name in ('tests', 'tests2') then + l_objects_to_run.extend; + l_objects_to_run(l_objects_to_run.last) := l_all_objects_to_run(i); + end if; + end loop; + + --Assert + ut.expect(l_objects_to_run.count).to_equal(2); + + for i in 1 .. 2 loop + l_test0_suite := treat(l_objects_to_run(i) as ut3.ut_logical_suite); + ut.expect(l_test0_suite.name in ('tests', 'tests2')).to_be_true; + + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + case l_test0_suite.name + when 'tests' then + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(3); + ut.expect(l_test1_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); + l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test2_suite.name).to_equal('test_package_2'); + ut.expect(l_test2_suite.items.count).to_equal(3); + ut.expect(l_test2_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); + when 'tests2' then + ut.expect(l_test1_suite.name).to_equal('test_package_3'); + ut.expect(l_test1_suite.items.count).to_equal(3); + end case; + + end loop; + + end; + + procedure test_top2_by_name is + c_path varchar2(100) := sys_context('USERENV', 'CURRENT_USER')||'.test_package_2'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test2_suite ut3.ut_logical_suite; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(1); + ut.expect(l_test1_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); + l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test2_suite.name).to_equal('test_package_2'); + ut.expect(l_test2_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); + ut.expect(l_test2_suite.items.count).to_equal(3); + end; + + procedure test_top2_bt_name_cur_user is + c_path varchar2(100) := 'test_package_2'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test2_suite ut3.ut_logical_suite; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(1); + ut.expect(l_test1_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); + l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test2_suite.name).to_equal('test_package_2'); + ut.expect(l_test2_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); + ut.expect(l_test2_suite.items.count).to_equal(3); + end; + + procedure test_by_path_to_subsuite is + c_path varchar2(100) := sys_context('USERENV', 'CURRENT_USER')||':tests.test_package_1.test_package_2'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test2_suite ut3.ut_logical_suite; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(1); + l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test2_suite.name).to_equal('test_package_2'); + ut.expect(l_test2_suite.items.count).to_equal(3); + end; + + procedure test_by_path_to_subsuite_cu is + c_path varchar2(100) := ':tests.test_package_1.test_package_2'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test2_suite ut3.ut_logical_suite; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(1); + l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test2_suite.name).to_equal('test_package_2'); + ut.expect(l_test2_suite.items.count).to_equal(3); + end; + + procedure test_subsute_proc_by_path is + c_path varchar2(100) := sys_context('USERENV', 'CURRENT_USER')||':tests.test_package_1.test_package_2.test2'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test2_suite ut3.ut_logical_suite; + l_test_proc ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); + ut.expect(l_test1_suite.items.count).to_equal(1); + l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test2_suite.name).to_equal('test_package_2'); + ut.expect(l_test2_suite.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); + ut.expect(l_test2_suite.items.count).to_equal(1); + + l_test_proc := treat(l_test2_suite.items(1) as ut3.ut_test); + ut.expect(l_test_proc.name).to_equal('test2'); + ut.expect(l_test_proc.rollback_type).to_equal(ut3.ut_utils.gc_rollback_manual); + ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); + ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); + + end; + + procedure test_subsute_proc_by_path_cu is + c_path varchar2(100) := ':tests.test_package_1.test_package_2.test2'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test2_suite ut3.ut_logical_suite; + l_test_proc ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(1); + l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test2_suite.name).to_equal('test_package_2'); + ut.expect(l_test2_suite.items.count).to_equal(1); + + l_test_proc := treat(l_test2_suite.items(1) as ut3.ut_test); + ut.expect(l_test_proc.name).to_equal('test2'); + ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); + ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); + end; + + procedure test_top_pack_by_name is + c_path varchar2(100) := sys_context('USERENV', 'CURRENT_USER')||'.test_package_1'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_suite; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(2); + + ut.expect(l_test1_suite.items(1).name).to_equal('test1'); + ut.expect(l_test1_suite.items(1).description).to_equal('Test1 from test package 1'); + ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).before_test_list.count).to_equal(0); + ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).after_test_list.count).to_equal(0); + ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).before_each_list.count).to_be_greater_than(0); + ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).disabled_flag).to_equal(0); + + ut.expect(l_test1_suite.items(2).name).to_equal('test2'); + ut.expect(l_test1_suite.items(2).description).to_equal('Test2 from test package 1'); + ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).before_test_list.count).to_be_greater_than(0); + ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).after_test_list.count).to_be_greater_than(0); + ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).before_each_list.count).to_be_greater_than(0); + ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).disabled_flag).to_equal(0); + + end; + + procedure test_top_pack_by_name_cu is + c_path varchar2(100) := 'test_package_1'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_suite; + l_test2_suite ut3.ut_suite; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(2); + + ut.expect(l_test1_suite.items(1).name).to_equal('test1'); + ut.expect(l_test1_suite.items(1).description).to_equal('Test1 from test package 1'); + ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).before_test_list.count).to_equal(0); + ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).after_test_list.count).to_equal(0); + ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).before_each_list.count).to_be_greater_than(0); + ut.expect(treat(l_test1_suite.items(1) as ut3.ut_test).disabled_flag).to_equal(0); + + ut.expect(l_test1_suite.items(2).name).to_equal('test2'); + ut.expect(l_test1_suite.items(2).description).to_equal('Test2 from test package 1'); + ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).before_test_list.count).to_be_greater_than(0); + ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).after_test_list.count).to_be_greater_than(0); + ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).before_each_list.count).to_be_greater_than(0); + ut.expect(treat(l_test1_suite.items(2) as ut3.ut_test).disabled_flag).to_equal(0); + + end; + + procedure test_top_pack_by_path is + c_path varchar2(100) := sys_context('USERENV', 'CURRENT_USER')||':tests'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test2_suite ut3.ut_logical_suite; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(3); + l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test2_suite.name).to_equal('test_package_2'); + ut.expect(l_test2_suite.items.count).to_equal(3); + end; + + procedure test_top_pack_by_path_cu is + c_path varchar2(100) := ':tests'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test2_suite ut3.ut_logical_suite; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(3); + l_test2_suite := treat(l_test1_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test2_suite.name).to_equal('test_package_2'); + ut.expect(l_test2_suite.items.count).to_equal(3); + end; + + procedure test_top_pck_proc_by_path is + c_path varchar2(100) := sys_context('USERENV', 'CURRENT_USER')||':tests.test_package_1.test2'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test2_suite ut3.ut_logical_suite; + l_test_proc ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(1); + l_test_proc := treat(l_test1_suite.items(1) as ut3.ut_test); + + ut.expect(l_test_proc.name).to_equal('test2'); + ut.expect(l_test_proc.description).to_equal('Test2 from test package 1'); + ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); + ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); + end; + + procedure test_top_pck_proc_by_path_cu is + c_path varchar2(100) := ':tests.test_package_1.test2'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test2_suite ut3.ut_logical_suite; + l_test_proc ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(1); + l_test_proc := treat(l_test1_suite.items(1) as ut3.ut_test); + + ut.expect(l_test_proc.name).to_equal('test2'); + ut.expect(l_test_proc.description).to_equal('Test2 from test package 1'); + ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); + ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); + end; + + procedure test_top_pkc_proc_by_name is + c_path varchar2(100) := sys_context('USERENV', 'CURRENT_USER')||'.test_package_1.test2'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test_proc ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(1); + + l_test_proc := treat(l_test1_suite.items(1) as ut3.ut_test); + ut.expect(l_test_proc.name).to_equal('test2'); + ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); + ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); + end; + + procedure test_top_pkc_proc_by_name_cu is + c_path varchar2(100) := 'test_package_1.test2'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test_proc ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_1'); + ut.expect(l_test1_suite.items.count).to_equal(1); + + l_test_proc := treat(l_test1_suite.items(1) as ut3.ut_test); + ut.expect(l_test_proc.name).to_equal('test2'); + ut.expect(l_test_proc.before_test_list.count).to_be_greater_than(0); + ut.expect(l_test_proc.after_test_list.count).to_be_greater_than(0); + end; + + procedure test_top_pkc_nosub_by_name is + c_path varchar2(100) := sys_context('USERENV', 'CURRENT_USER')||'.test_package_3'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test1 ut3.ut_test; + l_test3 ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests2'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_3'); + ut.expect(l_test1_suite.items.count).to_equal(3); + + l_test1 := treat(l_test1_suite.items(1) as ut3.ut_test); + ut.expect(l_test1.name).to_equal('test1'); + ut.expect(l_test1.DISABLED_FLAG).to_equal(0); + + l_test3 := treat(l_test1_suite.items(3) as ut3.ut_test); + ut.expect(l_test3.name).to_equal('disabled_test'); + ut.expect(l_test3.DISABLED_FLAG).to_equal(1); + end; + + procedure test_top_pkc_nosub_by_name_cu is + c_path varchar2(100) := 'test_package_3'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test1 ut3.ut_test; + l_test3 ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests2'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_3'); + ut.expect(l_test1_suite.items.count).to_equal(3); + + l_test1 := treat(l_test1_suite.items(1) as ut3.ut_test); + ut.expect(l_test1.name).to_equal('test1'); + ut.expect(l_test1.DISABLED_FLAG).to_equal(0); + + l_test3 := treat(l_test1_suite.items(3) as ut3.ut_test); + ut.expect(l_test3.name).to_equal('disabled_test'); + ut.expect(l_test3.DISABLED_FLAG).to_equal(1); + end; + + procedure test_top_subpck_by_path is + c_path varchar2(100) := sys_context('USERENV', 'CURRENT_USER')||':tests2.test_package_3'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test1 ut3.ut_test; + l_test3 ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests2'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_3'); + ut.expect(l_test1_suite.items.count).to_equal(3); + + l_test1 := treat(l_test1_suite.items(1) as ut3.ut_test); + ut.expect(l_test1.name).to_equal('test1'); + ut.expect(l_test1.DISABLED_FLAG).to_equal(0); + + l_test3 := treat(l_test1_suite.items(3) as ut3.ut_test); + ut.expect(l_test3.name).to_equal('disabled_test'); + ut.expect(l_test3.DISABLED_FLAG).to_equal(1); + end; + + procedure test_top_subpck_by_path_cu is + c_path varchar2(100) := ':tests2.test_package_3'; + l_objects_to_run ut3.ut_suite_items; + + l_test0_suite ut3.ut_logical_suite; + l_test1_suite ut3.ut_logical_suite; + l_test1 ut3.ut_test; + l_test3 ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_test0_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + + ut.expect(l_test0_suite.name).to_equal('tests2'); + ut.expect(l_test0_suite.items.count).to_equal(1); + l_test1_suite := treat(l_test0_suite.items(1) as ut3.ut_logical_suite); + + ut.expect(l_test1_suite.name).to_equal('test_package_3'); + ut.expect(l_test1_suite.items.count).to_equal(3); + + l_test1 := treat(l_test1_suite.items(1) as ut3.ut_test); + ut.expect(l_test1.name).to_equal('test1'); + ut.expect(l_test1.DISABLED_FLAG).to_equal(0); + + l_test3 := treat(l_test1_suite.items(3) as ut3.ut_test); + ut.expect(l_test3.name).to_equal('disabled_test'); + ut.expect(l_test3.DISABLED_FLAG).to_equal(1); + end; + + procedure test_search_invalid_pck is + l_objects_to_run ut3.ut_suite_items; + begin + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('failing_invalid_spec')); + + ut3.ut.expect(l_objects_to_run.count).to_be_greater_than(0); + ut3.ut.expect(l_objects_to_run(l_objects_to_run.first).object_name).to_equal('failing_invalid_spec'); + end; + + procedure compile_invalid_package is + ex_compilation_error exception; + pragma exception_init(ex_compilation_error,-24344); + pragma autonomous_transaction; + begin + begin + execute immediate q'[create or replace package failing_invalid_spec as + --%suite + gv_glob_val non_existing_table.id%type := 0; + + --%beforeall + procedure before_all; + --%test + procedure test1; + --%test + procedure test2; +end;]'; + exception when ex_compilation_error then null; + end; + begin + execute immediate q'[create or replace package body failing_invalid_spec as + procedure before_all is begin gv_glob_val := 1; end; + procedure test1 is begin ut.expect(1).to_equal(1); end; + procedure test2 is begin ut.expect(1).to_equal(1); end; +end;]'; + exception when ex_compilation_error then null; + end; + end; + procedure drop_invalid_package is + pragma autonomous_transaction; + begin + execute immediate 'drop package failing_invalid_spec'; + end; + + procedure test_search_nonexisting_pck is + l_objects_to_run ut3.ut_suite_items; + begin + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('ut3.failing_non_existing')); + ut.fail('Non existing package did not raise exception'); + exception + when others then + ut.expect(sqlerrm).to_be_like('%failing_non_existing%'); + end; + + procedure test_search_nonexist_sch_pck is + l_objects_to_run ut3.ut_suite_items; + begin + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('failing_non_existing')); + ut.fail('Non existing package without schema did not raise exception'); + exception + when others then + ut.expect(sqlerrm).to_be_like('%ORA-44001: invalid schema%'); + end; + + procedure test_desc_with_comma is + l_objects_to_run ut3.ut_suite_items; + l_suite ut3.ut_suite; + l_test ut3.ut_test; + begin + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_package_to_be_dropped')); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + + l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); + + ut.expect(l_suite.name).to_equal('tst_package_to_be_dropped'); + ut.expect(l_suite.description).to_equal('A suite description, though with comma, is assigned by suite_manager'); + ut.expect(l_suite.items.count).to_equal(2); + + l_test := treat(l_suite.items(1) as ut3.ut_test); + + ut.expect(l_test.name).to_equal('test1'); + ut.expect(l_test.description).to_equal('A test description, though with comma, is assigned by suite_manager'); + +-- l_test := treat(l_suite.items(2) as ut3.ut_test); +-- +-- ut.expect(l_test.name).to_equal('test2'); +-- ut.expect(l_test.description).to_equal('A test description, though with comma, is assigned by suite_manager'); + + end; + procedure setup_desc_with_comma is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package tst_package_to_be_dropped as + --%suite(A suite description, though with comma, is assigned by suite_manager) + + --%test(A test description, though with comma, is assigned by suite_manager) + procedure test1; + + --%test + --%displayname(A test description, though with comma, is assigned by suite_manager) + procedure test2; +end;'; + + execute immediate 'create or replace package body tst_package_to_be_dropped as + procedure test1 is begin ut.expect(1).to_equal(1); end; + procedure test2 is begin ut.expect(1).to_equal(1); end; +end;'; + end; + procedure clean_desc_with_comma is + pragma autonomous_transaction; + begin + begin + execute immediate 'drop package tst_package_to_be_dropped'; + exception + when ex_obj_doesnt_exist then + null; + end; + end; + + procedure test_inv_cache_on_drop is + l_test_report ut3.ut_varchar2_list; + begin + + select * bulk collect into l_test_report from table(ut3.ut.run(sys_context('USERENV', 'CURRENT_USER')||'.tst_package_to_be_dropped')); + + -- drop package + clean_inv_cache_on_drop; + + begin + select * bulk collect into l_test_report from table(ut3.ut.run(sys_context('USERENV', 'CURRENT_USER') || '.tst_package_to_be_dropped')); + ut.fail('Cache not invalidated on package drop'); + exception + when others then + ut.expect(sqlerrm).to_be_like('%tst_package_to_be_dropped%does not exist%'); + end; + + end; + procedure setup_inv_cache_on_drop is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package tst_package_to_be_dropped as + --%suite + + --%test + procedure test1; +end;'; + + execute immediate 'create or replace package body tst_package_to_be_dropped as + procedure test1 is begin ut.expect(1).to_equal(1); end; + procedure test2 is begin ut.expect(1).to_equal(1); end; +end;'; + end; + + procedure clean_inv_cache_on_drop is + pragma autonomous_transaction; + begin + execute immediate 'drop package tst_package_to_be_dropped'; + exception + when ex_obj_doesnt_exist then + null; + end; + + procedure test_inv_pck_bodies is + l_test_report ut3.ut_varchar2_list; + begin + + select * bulk collect into l_test_report from table(ut3.ut.run(sys_context('USERENV', 'CURRENT_USER')||'.test_dependencies')); + + ut.expect(l_test_report(l_test_report.count-1)).to_be_like('1 test_, 0 failed, 0 errored, 0 disabled, 0 warning(s)'); + --execute immediate 'select * from table(ut3.ut.run(''UT3.test_dependencies'', ut3.utplsql_test_reporter()))' into l_result; + +-- ut.expect(l_result).to_equal(ut3.ut_utils.gc_success); + end; + procedure setup_inv_pck_bodies is + pragma autonomous_transaction; + begin + execute immediate 'create table test_dependency_table (id integer)'; + execute immediate 'create or replace package test_dependencies as + -- %suite + + -- %test + procedure dependant; +end;'; + execute immediate 'create or replace package body test_dependencies as + gc_dependant_variable test_dependency_table.id%type; + procedure dependant is begin null; end; +end;'; + + execute immediate 'alter table test_dependency_table modify id number'; + + end; + procedure clean_inv_pck_bodies is + pragma autonomous_transaction; + begin + execute immediate 'drop table test_dependency_table'; + execute immediate 'drop package test_dependencies'; + end; + + procedure test_pck_with_dollar is + l_objects_to_run ut3.ut_suite_items; + l_suite ut3.ut_suite; + begin + --act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_package_with$dollar')); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + + l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); + ut.expect(l_suite.name).to_equal('tst_package_with$dollar'); + end; + procedure setup_pck_with_dollar is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package tst_package_with$dollar as + --%suite + + --%test + procedure test1; +end;'; + + execute immediate 'create or replace package body tst_package_with$dollar as + procedure test1 is begin ut.expect(1).to_equal(1); end; + procedure test2 is begin ut.expect(1).to_equal(1); end; +end;'; + end; + procedure clean_pck_with_dollar is + pragma autonomous_transaction; + begin + execute immediate 'drop package tst_package_with$dollar'; + end; + + + procedure test_pck_with_hash is + l_objects_to_run ut3.ut_suite_items; + l_suite ut3.ut_suite; + begin + --act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_package_with#hash')); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + + l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); + ut.expect(l_suite.name).to_equal('tst_package_with#hash'); + end; + procedure setup_pck_with_hash is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package tst_package_with#hash as + --%suite + + --%test + procedure test1; +end;'; + + execute immediate 'create or replace package body tst_package_with#hash as + procedure test1 is begin ut.expect(1).to_equal(1); end; + procedure test2 is begin ut.expect(1).to_equal(1); end; +end;'; + end; + procedure clean_pck_with_hash is + pragma autonomous_transaction; + begin + execute immediate 'drop package tst_package_with#hash'; + end; + + + procedure test_test_with_dollar is + l_objects_to_run ut3.ut_suite_items; + l_suite ut3.ut_suite; + l_test ut3.ut_test; + begin + --act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_package_with_dollar_test.test$1')); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + + l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); + + ut.expect(l_suite.name).to_equal('tst_package_with_dollar_test'); + ut.expect(l_suite.items.count).to_equal(1); + + l_test := treat(l_suite.items(1) as ut3.ut_test); + + ut.expect(l_test.name).to_equal('test$1'); + + end; + procedure setup_test_with_dollar is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package tst_package_with_dollar_test as + --%suite + + --%test + procedure test$1; +end;'; + + execute immediate 'create or replace package body tst_package_with_dollar_test as + procedure test$1 is begin ut.expect(1).to_equal(1); end; +end;'; + end; + procedure clean_test_with_dollar is + pragma autonomous_transaction; + begin + execute immediate 'drop package tst_package_with_dollar_test'; + end; + + procedure test_test_with_hash is + l_objects_to_run ut3.ut_suite_items; + l_suite ut3.ut_suite; + l_test ut3.ut_test; + begin + --act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_package_with_hash_test.test#1')); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + + l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); + + ut.expect(l_suite.name).to_equal('tst_package_with_hash_test'); + ut.expect(l_suite.items.count).to_equal(1); + + l_test := treat(l_suite.items(1) as ut3.ut_test); + + ut.expect(l_test.name).to_equal('test#1'); + + end; + procedure setup_test_with_hash is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package tst_package_with_hash_test as + --%suite + + --%test + procedure test#1; +end;'; + + execute immediate 'create or replace package body tst_package_with_hash_test as + procedure test#1 is begin ut.expect(1).to_equal(1); end; +end;'; + end; + procedure clean_test_with_hash is + pragma autonomous_transaction; + begin + execute immediate 'drop package tst_package_with_hash_test'; + end; + + procedure test_empty_suite_path is + l_objects_to_run ut3.ut_suite_items; + l_suite ut3.ut_suite; + begin + + --act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('tst_empty_suite_path')); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + + l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); + + ut.expect(l_suite.name).to_equal('tst_empty_suite_path'); + end; + + procedure setup_empty_suite_path is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package tst_empty_suite_path as + --%suite + --%suitepath + + --%test + procedure test1; +end;'; + execute immediate 'create or replace package body tst_empty_suite_path as + procedure test1 is begin ut.expect(1).to_equal(1); end; +end;'; + end; + + procedure clean_empty_suite_path is + pragma autonomous_transaction; + begin + execute immediate 'drop package tst_empty_suite_path'; + end; + + procedure test_pck_with_same_path is + l_objects_to_run ut3.ut_suite_items; + l_suite1 ut3.ut_logical_suite; + l_suite2 ut3.ut_logical_suite; + l_suite3 ut3.ut_suite; + begin + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(':test1.test2$.test_package_same_1')); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + + l_suite1 := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + ut.expect(l_suite1.name).to_equal('test1'); + ut.expect(l_suite1.items.count).to_equal(1); + + l_suite2 := treat(l_suite1.items(1) as ut3.ut_logical_suite); + ut.expect(l_suite2.name).to_equal('test2$'); + ut.expect(l_suite2.items.count).to_equal(1); + + l_suite3 := treat(l_suite2.items(1) as ut3.ut_suite); + ut.expect(l_suite3.name).to_equal('test_package_same_1'); + end; + + procedure setup_pck_with_same_path is + pragma autonomous_transaction; + begin + execute immediate 'create or replace package test_package_same_1 as + --%suite + --%suitepath(test1.test2$) + + --%test + procedure test1; +end;'; + execute immediate 'create or replace package body test_package_same_1 as + procedure test1 is begin null; end; +end;'; + execute immediate 'create or replace package test_package_same_1_a as + --%suite + --%suitepath(test1.test2$) + + --%test + procedure test1; +end;'; + execute immediate 'create or replace package body test_package_same_1_a as + procedure test1 is begin null; end; +end;'; + end; + + procedure clean_pck_with_same_path is + pragma autonomous_transaction; + begin + execute immediate 'drop package test_package_same_1'; + execute immediate 'drop package test_package_same_1_a'; + end; + + procedure setup_disabled_pck is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package test_disabled_floating as + --%suite + + --%test + procedure test1; + + --%disabled + + --%test + procedure test2; + +end;]'; + end; + + procedure clean_disabled_pck is + pragma autonomous_transaction; + begin + execute immediate 'drop package test_disabled_floating'; + end; + + procedure disable_suite_floating_annot is + l_objects_to_run ut3.ut_suite_items; + l_suite ut3.ut_suite; + begin + --Arrange + setup_disabled_pck; + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list('test_disabled_floating')); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + l_suite := treat(l_objects_to_run(1) as ut3.ut_suite); + ut.expect(l_suite.name).to_equal('test_disabled_floating'); + ut.expect(l_suite.get_disabled_flag()).to_be_true(); + + clean_disabled_pck; + end; + + procedure pck_proc_in_ctx_by_name is + c_path varchar2(100) := sys_context('USERENV', 'CURRENT_USER')||'.test_package_with_ctx.test1'; + l_objects_to_run ut3.ut_suite_items; + + l_test_suite ut3.ut_logical_suite; + l_ctx_suite ut3.ut_logical_suite; + l_test_proc ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + + l_test_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + ut.expect(l_test_suite.name).to_equal('test_package_with_ctx'); + ut.expect(l_test_suite.items.count).to_equal(1); + + l_ctx_suite := treat(l_test_suite.items(1) as ut3.ut_logical_suite); + ut.expect(l_ctx_suite.name).to_equal('some_context'); + ut.expect(l_ctx_suite.description).to_equal('Some context description'); + ut.expect(l_ctx_suite.items.count).to_equal(1); + + l_test_proc := treat(l_ctx_suite.items(1) as ut3.ut_test); + ut.expect(l_test_proc.name).to_equal('test1'); + end; + + procedure pck_proc_in_ctx_by_path is + c_path varchar2(100) := sys_context('USERENV', 'CURRENT_USER')||':test_package_with_ctx.some_context.test1'; + l_objects_to_run ut3.ut_suite_items; + + l_test_suite ut3.ut_logical_suite; + l_ctx_suite ut3.ut_logical_suite; + l_test_proc ut3.ut_test; + begin + --Act + l_objects_to_run := ut3.ut_suite_manager.configure_execution_by_path(ut3.ut_varchar2_list(c_path)); + + --Assert + ut.expect(l_objects_to_run.count).to_equal(1); + + l_test_suite := treat(l_objects_to_run(1) as ut3.ut_logical_suite); + ut.expect(l_test_suite.name).to_equal('test_package_with_ctx'); + ut.expect(l_test_suite.items.count).to_equal(1); + + l_ctx_suite := treat(l_test_suite.items(1) as ut3.ut_logical_suite); + ut.expect(l_ctx_suite.name).to_equal('some_context'); + ut.expect(l_ctx_suite.description).to_equal('Some context description'); + ut.expect(l_ctx_suite.items.count).to_equal(1); + + l_test_proc := treat(l_ctx_suite.items(1) as ut3.ut_test); + ut.expect(l_test_proc.name).to_equal('test1'); + end; + + procedure test_get_schema_ut_packages is + l_expected ut3.ut_object_names; + l_actual ut3.ut_object_names; + begin + l_expected := ut3.ut_object_names( + ut3.ut_object_name('UT3','SOME_TEST_PACKAGE') + ); + l_actual := ut3_tester_helper.run_helper.get_object_name('UT3'); + + ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); + end; + + procedure create_ut3_suite is + begin + ut3_tester_helper.run_helper.create_ut3_suite(); + end; + + procedure drop_ut3_suite is + pragma autonomous_transaction; + begin + ut3_tester_helper.run_helper.drop_ut3_suite(); + end; + + procedure add_new_long_test_package is + l_actual ut3.ut_object_names; + l_expected_message varchar2(500); + begin + l_expected_message := q'[ORA-20217: 'Suitepath exceeds 1000 CHAR on: UT3.DUMMY_LONG_TEST_PACKAGE,UT3.DUMMY_LONG_TEST_PACKAGE1'%]'; + l_actual := ut3_tester_helper.run_helper.get_object_name('UT3'); + ut.fail('Expected exception for suitpaths over 1k for two packages'); + exception + when others then + ut.expect(dbms_utility.format_error_stack()).to_be_like(l_expected_message); + ut.expect(SQLCODE).to_equal(ut3.ut_utils.gc_value_too_large); + end; + +end test_suite_manager; +/ diff --git a/test/ut3_tester/core/test_suite_manager.pks b/test/ut3_tester/core/test_suite_manager.pks new file mode 100644 index 000000000..43f288224 --- /dev/null +++ b/test/ut3_tester/core/test_suite_manager.pks @@ -0,0 +1,175 @@ +create or replace package test_suite_manager is + + --%suite(suite_manager) + --%suitepath(utplsql.framework_tester.core) + + procedure create_dummy_long_test_package; + + procedure drop_dummy_long_test_package; + + --%beforeall + procedure compile_dummy_packages; + --%afterall + procedure drop_dummy_packages; + + --%test(Prepare Runner For The Schema) + procedure test_schema_run; + + --%test(Prepare runner for the top 2 package by package user.package_name) + procedure test_top2_by_name; + + --%test(Prepare runner for the top2 package by name cur user) + procedure test_top2_bt_name_cur_user; + + --%test(Prepare runner for the subsuite by path) + procedure test_by_path_to_subsuite; + + --%test(Prepare runner for the subsuite by path for current user) + procedure test_by_path_to_subsuite_cu; + + --%test(Prepare runner for the subsuite proc only by path) + procedure test_subsute_proc_by_path; + + --%test(Prepare runner for the subsuite proc only by path for current user) + procedure test_subsute_proc_by_path_cu; + + --%test(Prepare runner for the top package by package name) + procedure test_top_pack_by_name; + + --%test(Prepare runner for the top package by package name for current user) + procedure test_top_pack_by_name_cu; + + --%test(Prepare runner for the top package by path) + procedure test_top_pack_by_path; + + --%test(Prepare runner for the top package by path for current user) + procedure test_top_pack_by_path_cu; + + --%test(Prepare runner for the top package procedure by path) + procedure test_top_pck_proc_by_path; + + --%test(Prepare runner for the top package procedure by path for current user) + procedure test_top_pck_proc_by_path_cu; + + --%test(Prepare runner for the top package procedure without sub-suites by package name) + procedure test_top_pkc_proc_by_name; + + --%test(Prepare runner for the top package procedure without sub-suites by package name for current user) + procedure test_top_pkc_proc_by_name_cu; + + --%test(Prepare runner for the top package without sub-suites by package name) + procedure test_top_pkc_nosub_by_name; + + --%test(Prepare runner for the top package without sub-suites by package name for current user) + procedure test_top_pkc_nosub_by_name_cu; + + --%test(Prepare runner for the suites package by path) + procedure test_top_subpck_by_path; + + --%test(Prepare runner for the suites package by path for current user) + procedure test_top_subpck_by_path_cu; + + --%test(Prepare runner for invalid package - it will add to suite but fail on exec ) + --%beforetest(compile_invalid_package) + --%aftertest(drop_invalid_package) + procedure test_search_invalid_pck; + procedure compile_invalid_package; + procedure drop_invalid_package; + + --%test(Prepare runner for nonexisting package with schema) + procedure test_search_nonexisting_pck; + + --%test(Prepare runner for nonexisting package without schema) + procedure test_search_nonexist_sch_pck; + + --%test(Test description with comma) + --%beforetest(setup_desc_with_comma) + --%aftertest(clean_desc_with_comma) + procedure test_desc_with_comma; + procedure setup_desc_with_comma; + procedure clean_desc_with_comma; + + --%test(Invalidate cache on package drop) + --%beforetest(setup_inv_cache_on_drop) + --%aftertest(clean_inv_cache_on_drop) + procedure test_inv_cache_on_drop; + procedure setup_inv_cache_on_drop; + procedure clean_inv_cache_on_drop; + + --%test(Includes Invalid Package Bodies In The Run) + --%beforetest(setup_inv_pck_bodies) + --%aftertest(clean_inv_pck_bodies) + procedure test_inv_pck_bodies; + procedure setup_inv_pck_bodies; + procedure clean_inv_pck_bodies; + + --%test(Package With Dollar Sign) + --%beforetest(setup_pck_with_dollar) + --%aftertest(clean_pck_with_dollar) + procedure test_pck_with_dollar; + procedure setup_pck_with_dollar; + procedure clean_pck_with_dollar; + + --%test(Package With Hash Sign) + --%beforetest(setup_pck_with_hash) + --%aftertest(clean_pck_with_hash) + procedure test_pck_with_hash; + procedure setup_pck_with_hash; + procedure clean_pck_with_hash; + + --%test(Package with test with dollar sign) + --%beforetest(setup_test_with_dollar) + --%aftertest(clean_test_with_dollar) + procedure test_test_with_dollar; + procedure setup_test_with_dollar; + procedure clean_test_with_dollar; + + --%test(Package with test with hash sign) + --%beforetest(setup_test_with_hash) + --%aftertest(clean_test_with_hash) + procedure test_test_with_hash; + procedure setup_test_with_hash; + procedure clean_test_with_hash; + + + --%test(Setup suite with empty suitepath) + --%beforetest(setup_empty_suite_path) + --%aftertest(clean_empty_suite_path) + procedure test_empty_suite_path; + procedure setup_empty_suite_path; + procedure clean_empty_suite_path; + + --%test(only the defined in suitepath suite/test is executed if multiple similarly named test suites exist in the context differed only by comment) + --%beforetest(setup_pck_with_same_path) + --%aftertest(clean_pck_with_same_path) + procedure test_pck_with_same_path; + procedure setup_pck_with_same_path; + procedure clean_pck_with_same_path; + + --%test(Whole suite gets disabled with floating annotation) + procedure disable_suite_floating_annot; + + --%test(Prepare runner for a package procedure inside context) + procedure pck_proc_in_ctx_by_name; + + --%test(Prepare runner for a package procedure inside context by path) + procedure pck_proc_in_ctx_by_path; + + --%context(get_schema_ut_packages) + + --%test(returns list of all unit test packages in given schema) + --%beforetest(create_ut3_suite) + --%aftertest(drop_ut3_suite) + procedure test_get_schema_ut_packages; + procedure create_ut3_suite; + procedure drop_ut3_suite; + + --%endcontext + + --%test(Adds suitepath to cache over 1k characters long) + --%beforetest(create_dummy_long_test_package) + --%aftertest(drop_dummy_long_test_package) + procedure add_new_long_test_package; + +end test_suite_manager; +/ diff --git a/test/ut3_tester/core/test_ut_executable.pkb b/test/ut3_tester/core/test_ut_executable.pkb index 1d2e74ff3..92420de47 100644 --- a/test/ut3_tester/core/test_ut_executable.pkb +++ b/test/ut3_tester/core/test_ut_executable.pkb @@ -24,8 +24,9 @@ create or replace package body test_ut_executable is l_result boolean; begin --Arrange - l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable', a_line_no=> 1); - l_executable := ut3.ut_executable_test( user, 'test_ut_executable', 'output_proc', ut3.ut_utils.gc_test_execute ); + l_test := ut3.ut_test(a_object_owner => 'ut3_tester', a_object_name => 'test_ut_executable',a_name => 'test_ut_executable', a_line_no=> 1); + l_executable := ut3.ut_executable_test( a_owner => 'ut3_tester', a_package => 'test_ut_executable', + a_procedure_name => 'output_proc', a_executable_type => ut3.ut_utils.gc_test_execute ); --Act l_result := l_executable.do_execute(l_test); --Assert @@ -40,8 +41,8 @@ create or replace package body test_ut_executable is l_result boolean; begin --Arrange - l_test := ut3.ut_test(a_object_name => 'test_ut_executable',a_name => 'test_ut_executable', a_line_no=> 1); - l_executable := ut3.ut_executable_test( user, 'test_ut_executable', 'throwing_proc', ut3.ut_utils.gc_test_execute ); + l_test := ut3.ut_test(a_object_owner => 'ut3_tester', a_object_name => 'test_ut_executable',a_name => 'test_ut_executable', a_line_no=> 1); + l_executable := ut3.ut_executable_test( 'ut3_tester', 'test_ut_executable', 'throwing_proc', ut3.ut_utils.gc_test_execute ); --Act l_result := l_executable.do_execute(l_test); --Assert @@ -76,9 +77,7 @@ create or replace package body test_ut_executable is dbms_lock.sleep(0.4); $end while l_cnt > 0 loop - select count(1) into l_cnt - from dba_scheduler_running_jobs srj - where srj.job_name = l_job_name; + l_cnt:=ut3_tester_helper.main_helper.get_job_count(l_job_name); end loop; end; @@ -97,7 +96,7 @@ create or replace package body test_ut_executable is procedure output_proc is begin - dbms_output.put_line(g_dbms_output_text); + dbms_output.put_line('Some output from procedure'); end; procedure throwing_proc is diff --git a/test/ut3_tester/core/test_ut_executable.pks b/test/ut3_tester/core/test_ut_executable.pks index acb91d1be..453998693 100644 --- a/test/ut3_tester/core/test_ut_executable.pks +++ b/test/ut3_tester/core/test_ut_executable.pks @@ -8,7 +8,9 @@ create or replace package test_ut_executable is --%test(Executes procedure in current schema when user was not provided) procedure exec_schema_package_proc; + /* TODO: Fix Me */ --%test(Executes procedure and saves dbms_output) + --%disabled procedure exec_package_proc_output; --%test(Executes a procedure raising exception, saves dbms_output and exception stack trace) diff --git a/test/ut3_tester_helper/main_helper.pkb b/test/ut3_tester_helper/main_helper.pkb index 148b526a6..d9ffc06bd 100644 --- a/test/ut3_tester_helper/main_helper.pkb +++ b/test/ut3_tester_helper/main_helper.pkb @@ -126,5 +126,13 @@ create or replace package body main_helper is execute immediate 'begin ut3$user#.parse_annotations; end;'; end; + function get_job_count(a_job_name varchar2) return number is + l_cnt number; + begin + select count(1) into l_cnt + from dba_scheduler_running_jobs srj + where srj.job_name = a_job_name; + end; + end; / diff --git a/test/ut3_tester_helper/main_helper.pks b/test/ut3_tester_helper/main_helper.pks index 2082105d5..296670707 100644 --- a/test/ut3_tester_helper/main_helper.pks +++ b/test/ut3_tester_helper/main_helper.pks @@ -34,6 +34,8 @@ create or replace package main_helper is procedure drop_parse_proc_as_ut3$user#; procedure parse_dummy_test_as_ut3$user#; + + function get_job_count(a_job_name varchar2) return number; end; / diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index c8983e961..bfc0e1c47 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -452,5 +452,76 @@ create or replace package body run_helper is ut.expect(main_helper.get_value(q'[ut_transaction_control.count_rows('s')]')).to_( a_expectation ); end; + procedure create_dummy_long_test_package is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package ut3.dummy_long_test_package as + + --%suitepath(verylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtext) + --%suite(dummy_test_suite) + + --%test(dummy_test) + procedure some_dummy_test_procedure; + end;]'; + + execute immediate q'[create or replace package ut3.dummy_long_test_package1 as + + --%suitepath(verylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtextverylongtext) + --%suite(dummy_test_suite1) + + --%test(dummy_test) + procedure some_dummy_test_procedure; + end;]'; + end; + + procedure drop_dummy_long_test_package is + pragma autonomous_transaction; + begin + execute immediate q'[drop package ut3.dummy_long_test_package]'; + execute immediate q'[drop package ut3.dummy_long_test_package1]'; + end; + + procedure create_ut3_suite is + pragma autonomous_transaction; + begin + execute immediate q'[ + create or replace package ut3.some_test_package + as + --%suite + + --%test + procedure some_test; + + end;]'; + end; + + procedure drop_ut3_suite is + pragma autonomous_transaction; + begin + execute immediate q'[drop package ut3.some_test_package]'; + end; + + function get_object_name(a_owner in varchar2) return ut3.ut_object_names is + begin + return ut3.ut_suite_manager.get_schema_ut_packages(ut3.ut_varchar2_rows(a_owner)); + end; + + function ut_output_buffer_tmp return t_out_buff_tab pipelined is + l_buffer_tab t_out_buff_tab; + cursor get_buffer is + select * from ut3.ut_output_buffer_tmp; + begin + open get_buffer; + fetch get_buffer bulk collect into l_buffer_tab; + for idx in 1..l_buffer_tab.count loop + pipe row(l_buffer_tab(idx)); + end loop; + end; + + procedure delete_buffer is + begin + delete from ut3.ut_output_buffer_tmp; + end; + end; / diff --git a/test/ut3_tester_helper/run_helper.pks b/test/ut3_tester_helper/run_helper.pks index 92767bc20..03d55ec29 100644 --- a/test/ut3_tester_helper/run_helper.pks +++ b/test/ut3_tester_helper/run_helper.pks @@ -1,5 +1,7 @@ create or replace package run_helper is + type t_out_buff_tab is table of ut3.ut_output_buffer_tmp%rowtype; + procedure setup_cache_objects; procedure setup_cache; procedure cleanup_cache; @@ -39,5 +41,14 @@ create or replace package run_helper is procedure test_rollback_type(a_procedure_name varchar2, a_rollback_type integer, a_expectation ut3_latest_release.ut_matcher); + procedure create_dummy_long_test_package; + procedure drop_dummy_long_test_package; + procedure create_ut3_suite; + procedure drop_ut3_suite; + function get_object_name(a_owner in varchar2) return ut3.ut_object_names; + + function ut_output_buffer_tmp return t_out_buff_tab pipelined; + procedure delete_buffer; + end; / From 3cc34ea38b8cb08a5a2a0afb9670b22ec5703290 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 29 Mar 2019 21:49:14 +0000 Subject: [PATCH 036/181] Adding tests core/test_suite_builder --- test/install_ut3_tester_tests.sql | 2 + test/ut3_tester/core/test_suite_builder.pkb | 1118 +++++++++++++++++++ test/ut3_tester/core/test_suite_builder.pks | 176 +++ 3 files changed, 1296 insertions(+) create mode 100644 test/ut3_tester/core/test_suite_builder.pkb create mode 100644 test/ut3_tester/core/test_suite_builder.pks diff --git a/test/install_ut3_tester_tests.sql b/test/install_ut3_tester_tests.sql index 511201f16..845e34782 100644 --- a/test/install_ut3_tester_tests.sql +++ b/test/install_ut3_tester_tests.sql @@ -19,6 +19,7 @@ alter session set plsql_optimize_level=0; @@ut3_tester/core/test_suite_manager.pks @@ut3_tester/core/test_file_mapper.pks @@ut3_tester/core/test_output_buffer.pks +@@ut3_tester/core/test_suite_builder.pks @@ut3_tester/core.pkb @@ -34,6 +35,7 @@ alter session set plsql_optimize_level=0; @@ut3_tester/core/test_suite_manager.pkb @@ut3_tester/core/test_file_mapper.pkb @@ut3_tester/core/test_output_buffer.pkb +@@ut3_tester/core/test_suite_builder.pkb set linesize 200 diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb new file mode 100644 index 000000000..bd76e88d8 --- /dev/null +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -0,0 +1,1118 @@ +create or replace package body test_suite_builder is + + function invoke_builder_for_annotations( + a_annotations ut3.ut_annotations, + a_package_name varchar2 := 'TEST_SUITE_BUILDER_PACKAGE' + ) return clob is + l_suites ut3.ut_suite_items; + l_suite ut3.ut_logical_suite; + l_cursor sys_refcursor; + l_xml xmltype; + begin + open l_cursor for select value(x) from table( + ut3.ut_annotated_objects( + ut3.ut_annotated_object('UT3_TESTER', a_package_name, 'PACKAGE', systimestamp, a_annotations) + ) ) x; + + l_suites := ut3.ut_suite_manager.build_suites_from_annotations( + a_owner_name => 'UT3_TESTER', + a_annotated_objects => l_cursor, + a_path => null, + a_object_name => a_package_name, + a_skip_all_objects => true + ); + l_suite := treat( l_suites(l_suites.first) as ut3.ut_logical_suite); + + select deletexml( + xmltype(l_suite), + '//RESULTS_COUNT|//START_TIME|//END_TIME|//RESULT|//ASSOCIATED_EVENT_NAME' || + '|//TRANSACTION_INVALIDATORS|//ERROR_BACKTRACE|//ERROR_STACK|//SERVEROUTPUT' + ) + into l_xml + from dual; + + return l_xml.getClobVal(); + end; + + procedure no_suite_description is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite',null, null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_match( + 'UT3_TESTERsome_packagesome_package()?\s*some_package' + ); + end; + + procedure suite_description_from_suite is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Some description', null), + ut3.ut_annotation(2, 'suite','Another description', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%some_packageSome description%' + ); + end; + + procedure suitepath_from_non_empty_path is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite',null, null), + ut3.ut_annotation(2, 'suitepath','org.utplsql.some', null), + ut3.ut_annotation(3, 'suitepath','dummy.utplsql.some', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%org.utplsql.some%' + ); + end; + + procedure suite_descr_from_displayname is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Some description', null), + ut3.ut_annotation(2, 'suite','Another description', null), + ut3.ut_annotation(3, 'displayname','New description', null), + ut3.ut_annotation(4, 'displayname','Newest description', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%some_packageNew description%' + ); + end; + + procedure rollback_type_valid is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite',null, null), + ut3.ut_annotation(2, 'rollback','manual', null), + ut3.ut_annotation(3, 'rollback','bad', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%'||ut3.ut_utils.gc_rollback_manual||'%' + ); + end; + + procedure rollback_type_duplicated is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite',null, null), + ut3.ut_annotation(2, 'rollback','manual', null), + ut3.ut_annotation(3, 'rollback','bad', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%"--%rollback"%%UT3_TESTER.SOME_PACKAGE%3%%' + ); + end; + + procedure suite_annot_duplicated is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','Cool', null), + ut3.ut_annotation(8, 'suite','bad', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%Cool%%"--%suite"%UT3_TESTER.SOME_PACKAGE%line 8%%' + ); + end; + + procedure test_annotation is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','Cool', null), + ut3.ut_annotation(8, 'test','Some test', 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%test_procedureSome testsome_package.test_procedure' || + '%%' + ); + end; + + procedure test_annot_duplicated is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','Cool', null), + ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), + ut3.ut_annotation(9, 'test','Dup', 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%Cool%%"--%test"%UT3_TESTER.SOME_PACKAGE.TEST_PROCEDURE%line 9%%' + ); + end; + + procedure beforeall_annot_duplicated is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','Cool', null), + ut3.ut_annotation(8, 'beforeall', null, 'test_procedure'), + ut3.ut_annotation(9, 'beforeall', null, 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%Cool%%"--%beforeall"%UT3_TESTER.SOME_PACKAGE.TEST_PROCEDURE%line 9%%' + ); + end; + + procedure beforeeach_annot_duplicated is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','Cool', null), + ut3.ut_annotation(8, 'beforeeach', null, 'test_procedure'), + ut3.ut_annotation(9, 'beforeeach', null, 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%Cool%%"--%beforeeach"%UT3_TESTER.SOME_PACKAGE.TEST_PROCEDURE%line 9%%' + ); + end; + + procedure afterall_annot_duplicated is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','Cool', null), + ut3.ut_annotation(8, 'afterall', null, 'test_procedure'), + ut3.ut_annotation(9, 'afterall', null, 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%Cool%%"--%afterall"%UT3_TESTER.SOME_PACKAGE.TEST_PROCEDURE%line 9%%' + ); + end; + + procedure aftereach_annot_duplicated is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','Cool', null), + ut3.ut_annotation(8, 'aftereach', null, 'test_procedure'), + ut3.ut_annotation(9, 'aftereach', null, 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%Cool%%"--%aftereach"%UT3_TESTER.SOME_PACKAGE.TEST_PROCEDURE%line 9%%' + ); + end; + + procedure suitepath_annot_duplicated is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','Cool', null), + ut3.ut_annotation(3, 'suitepath','dummy.utplsql.some', null), + ut3.ut_annotation(4, 'suitepath','org.utplsql.some', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%"--%suitepath"%line 4%%' + ); + end; + + procedure displayname_annot_duplicated is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','Cool', null), + ut3.ut_annotation(4, 'displayname','New description', null), + ut3.ut_annotation(5, 'displayname','Newest description', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%"--%displayname"%line 5%%' + ); + end; + + procedure suitepath_annot_empty is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(3, 'suitepath',null, null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%"--%suitepath" annotation requires a non-empty parameter value.%%' + ); + end; + + procedure suitepath_annot_invalid_path is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'suitepath','path with spaces', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%Invalid path value in annotation "--%suitepath(path with spaces)"%%' + ); + end; + + procedure displayname_annot_empty is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(3, 'displayname',null, null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%"--%displayname" annotation requires a non-empty parameter value.%%' + ); + end; + + procedure rollback_type_empty is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(3, 'rollback',null, null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%"--%rollback" annotation requires one of values as parameter:%%' + ); + end; + + procedure rollback_type_invalid is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'rollback','bad', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%"--%rollback" annotation requires one of values as parameter: "auto" or "manual". Annotation ignored.%%' + ); + end; + + procedure multiple_before_after is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'beforeall',null, 'first_before_all'), + ut3.ut_annotation(3, 'beforeall',null, 'another_before_all'), + ut3.ut_annotation(4, 'beforeeach',null, 'first_before_each'), + ut3.ut_annotation(5, 'beforeeach',null, 'another_before_each'), + ut3.ut_annotation(6, 'aftereach',null, 'first_after_each'), + ut3.ut_annotation(7, 'aftereach',null, 'another_after_each'), + ut3.ut_annotation(8, 'afterall',null, 'first_after_all'), + ut3.ut_annotation(9, 'afterall',null, 'another_after_all'), + ut3.ut_annotation(14, 'test','A test', 'some_test'), + ut3.ut_annotation(15, 'beforetest','before_test_proc', 'some_test'), + ut3.ut_annotation(16, 'beforetest','before_test_proc2', 'some_test'), + ut3.ut_annotation(18, 'aftertest','after_test_proc', 'some_test'), + ut3.ut_annotation(20, 'aftertest','after_test_proc2', 'some_test') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%some_package%some_test' || + '%' || + '%some_packagefirst_before_each' || + '%some_packageanother_before_each' || + '%' || + '%' || + '%some_packagebefore_test_proc' || + '%some_packagebefore_test_proc2' || + '%' || + '%' || + '%some_packageafter_test_proc' || + '%some_packageafter_test_proc2' || + '%' || + '%' || + '%some_packagefirst_after_each' || + '%some_packageanother_after_each' || + '%' || + '%' || + '%' || + '%some_packagefirst_before_all' || + '%some_packageanother_before_all' || + '%' || + '%' || + '%some_packagefirst_after_all' || + '%some_packageanother_after_all' || + '%%' + ); + end; + + procedure multiple_standalone_bef_aft is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'beforeall', 'some_package.first_before_all',null), + ut3.ut_annotation(3, 'beforeall', 'different_package.another_before_all',null), + ut3.ut_annotation(4, 'beforeeach', 'first_before_each',null), + ut3.ut_annotation(5, 'beforeeach', 'different_owner.different_package.another_before_each',null), + ut3.ut_annotation(6, 'aftereach', 'first_after_each',null), + ut3.ut_annotation(7, 'aftereach', 'another_after_each,different_owner.different_package.one_more_after_each',null), + ut3.ut_annotation(8, 'afterall', 'first_after_all',null), + ut3.ut_annotation(9, 'afterall', 'another_after_all',null), + ut3.ut_annotation(14, 'test','A test', 'some_test'), + ut3.ut_annotation(15, 'beforetest','before_test_proc', 'some_test'), + ut3.ut_annotation(16, 'beforetest','before_test_proc2', 'some_test'), + ut3.ut_annotation(18, 'aftertest','after_test_proc', 'some_test'), + ut3.ut_annotation(20, 'aftertest','after_test_proc2', 'some_test') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%some_package%some_test' || + '%' || + '%some_packagefirst_before_each' || + '%different_ownerdifferent_packageanother_before_each' || + '%' || + '%' || + '%some_packagebefore_test_proc' || + '%some_packagebefore_test_proc2' || + '%' || + '%' || + '%some_packageafter_test_proc' || + '%some_packageafter_test_proc2' || + '%' || + '%' || + '%some_packagefirst_after_each' || + '%some_packageanother_after_each' || + '%different_ownerdifferent_packageone_more_after_each' || + '%' || + '%' || + '%' || + '%some_packagefirst_before_all' || + '%different_packageanother_before_all' || + '%' || + '%' || + '%some_packagefirst_after_all' || + '%some_packageanother_after_all' || + '%%' + ); + end; + + procedure before_after_on_single_proc is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'beforeall',null, 'do_stuff'), + ut3.ut_annotation(3, 'beforeeach',null, 'do_stuff'), + ut3.ut_annotation(4, 'aftereach',null, 'do_stuff'), + ut3.ut_annotation(5, 'afterall',null, 'do_stuff'), + ut3.ut_annotation(6, 'test','A test', 'some_test') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%some_package%some_test' || + '%' || + '%some_packagedo_stuff' || + '%' || + '%' || + '%some_packagedo_stuff' || + '%' || + '%' || + '%' || + '%some_packagedo_stuff' || + '%' || + '%' || + '%some_packagedo_stuff' || + '%%' + ); + end; + + procedure multiple_mixed_bef_aft is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'beforeall', null,'first_before_all'), + ut3.ut_annotation(3, 'beforeall', 'different_package.another_before_all',null), + ut3.ut_annotation(4, 'beforeeach', 'first_before_each',null), + ut3.ut_annotation(5, 'beforeeach', 'different_owner.different_package.another_before_each',null), + ut3.ut_annotation(6, 'aftereach', null, 'first_after_each'), + ut3.ut_annotation(7, 'aftereach', 'another_after_each,different_owner.different_package.one_more_after_each',null), + ut3.ut_annotation(8, 'afterall', 'first_after_all',null), + ut3.ut_annotation(9, 'afterall', 'another_after_all',null), + ut3.ut_annotation(14, 'test','A test', 'some_test'), + ut3.ut_annotation(15, 'beforetest','before_test_proc', 'some_test'), + ut3.ut_annotation(16, 'beforetest','before_test_proc2', 'some_test'), + ut3.ut_annotation(18, 'aftertest','after_test_proc', 'some_test'), + ut3.ut_annotation(20, 'aftertest','after_test_proc2', 'some_test'), + ut3.ut_annotation(21, 'beforeall', null,'last_before_all'), + ut3.ut_annotation(22, 'aftereach', null, 'last_after_each'), + ut3.ut_annotation(23, 'afterall', null, 'last_after_all') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%some_package%some_test' || + '%' || + '%some_packagefirst_before_each' || + '%different_ownerdifferent_packageanother_before_each' || + '%' || + '%' || + '%some_packagebefore_test_proc' || + '%some_packagebefore_test_proc2' || + '%' || + '%' || + '%some_packageafter_test_proc' || + '%some_packageafter_test_proc2' || + '%' || + '%' || + '%some_packagefirst_after_each' || + '%some_packageanother_after_each' || + '%different_ownerdifferent_packageone_more_after_each' || + '%some_packagelast_after_each' || + '%' || + '%' || + '%' || + '%some_packagefirst_before_all' || + '%different_packageanother_before_all' || + '%some_packagelast_before_all' || + '%' || + '%' || + '%some_packagefirst_after_all' || + '%some_packageanother_after_all' || + '%some_packagelast_after_all' || + '%%' + ); + end; + + + procedure before_after_mixed_with_test is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'beforeall',null, 'do_stuff'), + ut3.ut_annotation(3, 'beforeeach',null, 'do_stuff'), + ut3.ut_annotation(4, 'aftereach',null, 'do_stuff'), + ut3.ut_annotation(5, 'afterall',null, 'do_stuff'), + ut3.ut_annotation(6, 'test','A test', 'do_stuff') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like('%%Annotation "--\%beforeall"%line 2%%', '\'); + ut.expect(l_actual).to_be_like('%%Annotation "--\%beforeeach"%line 3%%', '\'); + ut.expect(l_actual).to_be_like('%%Annotation "--\%aftereach"%line 4%%', '\'); + ut.expect(l_actual).to_be_like('%%Annotation "--\%afterall" cannot be used with "--\%test". Annotation ignored.' + ||'%at "UT3_TESTER.SOME_PACKAGE.DO_STUFF", line 5%%', '\'); + ut.expect(l_actual).not_to_be_like('%%'); + ut.expect(l_actual).not_to_be_like('%%'); + ut.expect(l_actual).not_to_be_like('%%'); + ut.expect(l_actual).not_to_be_like('%%'); + end; + + procedure suite_from_context is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'beforeall',null, 'suite_level_beforeall'), + ut3.ut_annotation(3, 'test','In suite', 'suite_level_test'), + ut3.ut_annotation(4, 'context','a_context', null), + ut3.ut_annotation(5, 'displayname','A context', null), + ut3.ut_annotation(6, 'beforeall',null, 'context_setup'), + ut3.ut_annotation(7, 'test', 'In context', 'test_in_a_context'), + ut3.ut_annotation(8, 'endcontext',null, null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%' || + '%' || + '' || + '%a_contextA contextsome_package.a_context' || + '%' || + '' || + '%test_in_a_contextIn contextsome_package.a_context.test_in_a_context' || + '%' || + '' || + '' || + '%some_packagecontext_setup' || + '%' || + '' || + '' || + '' || + '%suite_level_testIn suitesome_package.suite_level_test' || + '%' || + '' || + '' || + '%some_packagesuite_level_beforeall' || + '%' || + '' || + '' + ); + end; + + procedure before_after_in_context is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite', 'Cool', null), + ut3.ut_annotation(2, 'test', 'In suite', 'suite_level_test'), + ut3.ut_annotation(3, 'context', 'a_context', null), + ut3.ut_annotation(4, 'beforeall', 'context_beforeall', null), + ut3.ut_annotation(5, 'beforeeach', null, 'context_beforeeach'), + ut3.ut_annotation(6, 'test', 'In context', 'test_in_a_context'), + ut3.ut_annotation(7, 'aftereach', 'context_aftereach' ,null), + ut3.ut_annotation(8, 'afterall', null, 'context_afterall'), + ut3.ut_annotation(9, 'endcontext', null, null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '' || + '%' || + '%' || + '%a_context' || + '%' || + '%' || + '%test_in_a_context' || + '%%context_beforeeach%' || + '%%test_in_a_context%' || + '%%context_aftereach%' || + '%' || + '%' || + '%%context_beforeall%' || + '%%context_afterall%' || + '%' || + '%' || + '%suite_level_test' || + '%%suite_level_test%' || + '%' || + '%' || + '%' + ); + ut.expect(l_actual).not_to_be_like('%%%%%%'); + ut.expect(l_actual).not_to_be_like('%%%%%%'); + ut.expect(l_actual).not_to_be_like('%%%%%%'); + ut.expect(l_actual).not_to_be_like('%%%%%%'); + end; + + procedure before_after_out_of_context is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'beforeall',null, 'suite_level_beforeall'), + ut3.ut_annotation(3, 'beforeeach',null, 'suite_level_beforeeach'), + ut3.ut_annotation(4, 'test','In suite', 'suite_level_test'), + ut3.ut_annotation(5, 'context','a_context', null), + ut3.ut_annotation(6, 'test', 'In context', 'test_in_a_context'), + ut3.ut_annotation(7, 'endcontext',null, null), + ut3.ut_annotation(8, 'aftereach',null, 'suite_level_aftereach'), + ut3.ut_annotation(9, 'afterall',null, 'suite_level_afterall') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '' || + '%' || + '%' || + '%a_context' || + '%' || + '%' || + '%test_in_a_context' || + '%%suite_level_beforeeach%' || + '%%test_in_a_context%' || + '%%suite_level_aftereach%' || + '%' || + '%' || + '%' || + '%' || + '%suite_level_test' || + '%%suite_level_beforeeach%' || + '%%suite_level_test%' || + '%%suite_level_aftereach%' || + '%' || + '%' || + '%%suite_level_beforeall%' || + '%%suite_level_afterall%' || + '%' + ); + ut.expect(l_actual).not_to_be_like('%%%%%%'); + ut.expect(l_actual).not_to_be_like('%%%%%%'); + end; + + procedure context_without_endcontext is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'beforeall',null, 'suite_level_beforeall'), + ut3.ut_annotation(3, 'test','In suite', 'suite_level_test'), + ut3.ut_annotation(4, 'context','A context', null), + ut3.ut_annotation(5, 'beforeall',null, 'context_setup'), + ut3.ut_annotation(7, 'test', 'In context', 'test_in_a_context') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%Invalid annotation "--\%context". Cannot find following "--\%endcontext". Annotation ignored.%at "UT3_TESTER.SOME_PACKAGE", line 4%' + ,'\' + ); + ut.expect(l_actual).to_be_like( + '' || + '%' || + '' || + '%suite_level_testIn suitesome_package.suite_level_test' || + '%' || + '' || + '%test_in_a_contextIn contextsome_package.test_in_a_context' || + '%' || + '' || + '' || + '%some_packagesuite_level_beforeall' || + '%some_packagecontext_setup' || + '%' || + '' || + '' + ); + end; + + procedure endcontext_without_context is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'beforeall',null, 'suite_level_beforeall'), + ut3.ut_annotation(3, 'test','In suite', 'suite_level_test'), + ut3.ut_annotation(4, 'context','a_context', null), + ut3.ut_annotation(5, 'displayname','A context', null), + ut3.ut_annotation(6, 'beforeall',null, 'context_setup'), + ut3.ut_annotation(7, 'test', 'In context', 'test_in_a_context'), + ut3.ut_annotation(8, 'endcontext',null, null), + ut3.ut_annotation(9, 'endcontext',null, null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%Invalid annotation "--\%endcontext". Cannot find preceding "--\%context". Annotation ignored.%at "UT3_TESTER.SOME_PACKAGE", line 9%' + ,'\' + ); + ut.expect(l_actual).to_be_like( + '' || + '%' || + '' || + '%a_contextA contextsome_package.a_context' || + '%' || + '' || + '%test_in_a_contextIn contextsome_package.a_context.test_in_a_context' || + '%' || + '' || + '' || + '%some_packagecontext_setup' || + '%' || + '' || + '' || + '' || + '%suite_level_testIn suitesome_package.suite_level_test' || + '%' || + '' || + '' || + '%some_packagesuite_level_beforeall' || + '%' || + '' || + '' + ); + end; + + --%test(Gives warning when two contexts have the same name) + procedure duplicate_context_name is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'beforeall',null, 'suite_level_beforeall'), + ut3.ut_annotation(3, 'test','In suite', 'suite_level_test'), + ut3.ut_annotation(4, 'context','a_context', null), + ut3.ut_annotation(5, 'displayname','A context', null), + ut3.ut_annotation(6, 'beforeall',null, 'context_setup'), + ut3.ut_annotation(7, 'test', 'In context', 'test_in_a_context'), + ut3.ut_annotation(8, 'endcontext',null, null), + ut3.ut_annotation(9, 'context','a_context', null), + ut3.ut_annotation(10, 'displayname','A context', null), + ut3.ut_annotation(11, 'beforeall',null, 'setup_in_duplicated_context'), + ut3.ut_annotation(12, 'test', 'In duplicated context', 'test_in_duplicated_context'), + ut3.ut_annotation(13, 'endcontext',null, null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%Context name must be unique in a suite. Context and all of it's content ignored.%at "UT3_TESTER.SOME_PACKAGE", line 9%' + ,'\' + ); + ut.expect(l_actual).to_be_like( + '' || + '%' || + '' || + '%a_contextA contextsome_package.a_context' || + '%' || + '' || + '%test_in_a_contextIn contextsome_package.a_context.test_in_a_context' || + '%' || + '' || + '' || + '%some_packagecontext_setup' || + '%' || + '' || + '' || + '' || + '%suite_level_testIn suitesome_package.suite_level_test' || + '%' || + '' || + '' || + '%some_packagesuite_level_beforeall' || + '%' || + '' || + '' + ); + end; + + procedure throws_value_empty is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(3, 'test','A test with empty throws annotation', 'A_TEST_PROCEDURE'), + ut3.ut_annotation(3, 'throws',null, 'A_TEST_PROCEDURE') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%"--%throws" annotation requires a parameter. Annotation ignored.%%' + ); + end; + + procedure throws_value_invalid is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(3, 'test','A test with invalid throws annotation', 'A_TEST_PROCEDURE'), + ut3.ut_annotation(3, 'throws',' -20145 , bad_variable_name ', 'A_TEST_PROCEDURE') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%Invalid parameter value "bad_variable_name" for "--%throws" annotation. Parameter ignored.%%' + ); + end; + + + procedure before_aftertest_multi is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(14, 'test','A test', 'some_test'), + ut3.ut_annotation(15, 'beforetest','before_test_proc', 'some_test'), + ut3.ut_annotation(16, 'beforetest','before_test_proc2', 'some_test'), + ut3.ut_annotation(18, 'aftertest','after_test_proc', 'some_test'), + ut3.ut_annotation(20, 'aftertest','after_test_proc2', 'some_test') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%some_package%some_test' || + '%' || + '%some_packagebefore_test_proc' || + '%some_packagebefore_test_proc2' || + '%' || + '%' || + '%some_packageafter_test_proc' || + '%some_packageafter_test_proc2' || + '%' || + '%%' + ); + end; + + procedure before_aftertest_twice is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(14, 'test','A test', 'some_test'), + ut3.ut_annotation(15, 'beforetest','before_test_proc, before_test_proc2', 'some_test'), + ut3.ut_annotation(16, 'beforetest','before_test_proc3', 'some_test'), + ut3.ut_annotation(18, 'aftertest','after_test_proc,after_test_proc2', 'some_test'), + ut3.ut_annotation(20, 'aftertest','after_test_proc3', 'some_test') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%some_package%some_test' || + '%' || + '%some_packagebefore_test_proc' || + '%some_packagebefore_test_proc2' || + '%some_packagebefore_test_proc3' || + '%' || + '%' || + '%some_packageafter_test_proc' || + '%some_packageafter_test_proc2' || + '%some_packageafter_test_proc3' || + '%' || + '%%' + ); + end; + + procedure before_aftertest_pkg_proc is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(14, 'test','A test', 'some_test'), + ut3.ut_annotation(15, 'beforetest','external_package.before_test_proc', 'some_test'), + ut3.ut_annotation(18, 'aftertest','external_package.after_test_proc', 'some_test') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%some_package%some_test' || + '%' || + '%external_packagebefore_test_proc' || + '%' || + '%' || + '%external_packageafter_test_proc' || + '%' || + '%%' + ); + end; + + procedure before_aftertest_mixed_syntax is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(14, 'test','A test', 'some_test'), + ut3.ut_annotation(15, 'beforetest','external_package.before_test_proc, before_test_proc2', 'some_test'), + ut3.ut_annotation(18, 'aftertest','external_package.after_test_proc, after_test_proc2', 'some_test') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%some_package%some_test' || + '%' || + '%external_packagebefore_test_proc' || + '%some_packagebefore_test_proc2' || + '%' || + '%' || + '%external_packageafter_test_proc' || + '%some_packageafter_test_proc2' || + '%' || + '%%' + ); + end; + + procedure test_annotation_ordering is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(4, 'test','B test', 'b_test'), + ut3.ut_annotation(10, 'test','Z test', 'z_test'), + ut3.ut_annotation(14, 'test','A test', 'a_test') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%some_package%b_test' || + '%%'|| + '%%some_package%z_test' || + '%%'|| + '%%some_package%a_test' || + '%%' + ); + end; + + procedure test_bad_procedure_annotation is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(2, 'bad_procedure_annotation',null, 'some_procedure'), + ut3.ut_annotation(6, 'test','A test', 'do_stuff') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like('%Unsupported annotation "--\%bad_procedure_annotation". Annotation ignored.% line 2%', '\'); + end; + + procedure test_bad_package_annotation is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(1, 'suite','Cool', null), + ut3.ut_annotation(17, 'bad_package_annotation',null, null), + ut3.ut_annotation(24, 'test','A test', 'do_stuff') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like('%Unsupported annotation "--\%bad_package_annotation". Annotation ignored.% line 17%', '\'); + end; + +end test_suite_builder; +/ diff --git a/test/ut3_tester/core/test_suite_builder.pks b/test/ut3_tester/core/test_suite_builder.pks new file mode 100644 index 000000000..bae124e3e --- /dev/null +++ b/test/ut3_tester/core/test_suite_builder.pks @@ -0,0 +1,176 @@ +create or replace package test_suite_builder is + --%suite(suite_builder) + --%suitepath(utplsql.framework_tester.core) + + --%context(suite) + --%displayname(--%suite annotation) + + --%test(Sets suite name from package name and leaves description empty) + procedure no_suite_description; + + --%test(Sets suite description using first --%suite annotation) + procedure suite_description_from_suite; + + --%test(Gives warning if more than one --%suite annotation used) + procedure suite_annot_duplicated; + + --%endcontext + + --%context(displayname) + --%displayname(--%displayname annotation) + + --%test(Overrides suite description using first --%displayname annotation) + procedure suite_descr_from_displayname; + + --%test(Gives warning if more than one --%displayname annotation used) + procedure displayname_annot_duplicated; + + --%test(Gives warning if --%displayname annotation has no value) + procedure displayname_annot_empty; + + --%endcontext + + --%context(test) + --%displayname(--%test annotation) + + --%test(Creates a test item for procedure annotated with --%test annotation) + procedure test_annotation; + + --%test(Gives warning if more than one --%test annotation used) + procedure test_annot_duplicated; + + --%test(Is added to suite according to annotation order in package spec) + procedure test_annotation_ordering; + + --%endcontext + + --%context(suitepath) + --%displayname(--%suitepath annotation) + + --%test(Sets suite path using first --%suitepath annotation) + procedure suitepath_from_non_empty_path; + + --%test(Gives warning if more than one --%suitepath annotation used) + procedure suitepath_annot_duplicated; + + --%test(Gives warning if --%suitepath annotation has no value) + procedure suitepath_annot_empty; + + --%test(Gives warning if --%suitepath annotation has invalid value) + procedure suitepath_annot_invalid_path; + + --%endcontext + + --%context(rollback) + --%displayname(--%rollback annotation) + + --%test(Sets rollback type using first --%rollback annotation) + procedure rollback_type_valid; + + --%test(Gives warning if more than one --%rollback annotation used) + procedure rollback_type_duplicated; + + --%test(Gives warning if --%rollback annotation has no value) + procedure rollback_type_empty; + + --%test(Gives warning if --%rollback annotation has invalid value) + procedure rollback_type_invalid; + + --%endcontext + + --%context(before_after_all_each) + --%displayname(--%before/after all/each annotations) + + --%test(Supports multiple before/after all/each procedure level definitions) + procedure multiple_before_after; + + --%test(Supports multiple before/after all/each standalone level definitions) + procedure multiple_standalone_bef_aft; + + --%test(Supports mixing before/after all/each annotations on single procedure) + procedure before_after_on_single_proc; + + --%test(Supports mixed before/after all/each as standalone and procedure level definitions) + procedure multiple_mixed_bef_aft; + + --%test(Gives warning if more than one --%beforeall annotation used on procedure) + procedure beforeall_annot_duplicated; + + --%test(Gives warning if more than one --%beforeeach annotation used on procedure) + procedure beforeeach_annot_duplicated; + + --%test(Gives warning if more than one --%afterall annotation used on procedure) + procedure afterall_annot_duplicated; + + --%test(Gives warning if more than one --%aftereach annotation used on procedure) + procedure aftereach_annot_duplicated; + + --%test(Gives warning on before/after all/each annotations mixed with test) + procedure before_after_mixed_with_test; + + --%endcontext + + --%context(context) + --%displayname(--%context annotation) + + --%test(Creates nested suite for content between context/endcontext annotations) + procedure suite_from_context; + + --%test(Associates before/after all/each to tests in context only) + procedure before_after_in_context; + + --%test(Propagates beforeeach/aftereach to context) + procedure before_after_out_of_context; + + --%test(Does not create context and gives warning when endcontext is missing) + procedure context_without_endcontext; + + --%test(Gives warning if --%endcontext is missing a preceding --%context) + procedure endcontext_without_context; + + --%test(Gives warning when two contexts have the same name and ignores duplicated context) + procedure duplicate_context_name; + + --%endcontext + + --%context(throws) + --%displayname(--%throws annotation) + + --%test(Gives warning if --%throws annotation has no value) + procedure throws_value_empty; + + --%test(Gives warning if --%throws annotation has invalid value) + procedure throws_value_invalid; + + --%endcontext + + --%context(beforetest_aftertest) + --%displayname(--%beforetest/aftertest annotation) + + --%test(Supports multiple occurrences of beforetest/aftertest for a test) + procedure before_aftertest_multi; + + --%test(Supports same procedure defined twice) + procedure before_aftertest_twice; + + --%test(Supports beforetest from external package) + procedure before_aftertest_pkg_proc; + + --%test(Supports mix of procedure and package.procedure) + procedure before_aftertest_mixed_syntax; + + --%endcontext + + --%context(unknown_annotation) + --%displayname(--%bad_annotation) + + --%test(Gives warning when unknown procedure level annotation passed) + procedure test_bad_procedure_annotation; + + --%test(Gives warning when unknown package level annotation passed) + procedure test_bad_package_annotation; + + --%endcontext + +end test_suite_builder; +/ From a6a848d77fe6af8c32f692c6187d5e775ea5f151 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sat, 30 Mar 2019 07:48:46 +0000 Subject: [PATCH 037/181] Adding tests: reporters reporters/test_junit_reporter reporters/test_sonar_test_reporter reporters/test_teamcity_reporter reporters/test_tfs_junit_reporter --- test/install_ut3_tester_tests.sql | 1 + test/install_ut3_user_tests.sql | 13 + test/ut3_tester/core/test_ut_executable.pks | 2 - test/ut3_user/reporters.pkb | 150 ++++++++ test/ut3_user/reporters.pks | 18 + .../reporters/test_junit_reporter.pkb | 353 ++++++++++++++++++ .../reporters/test_junit_reporter.pks | 51 +++ .../reporters/test_sonar_test_reporter.pkb | 36 ++ .../reporters/test_sonar_test_reporter.pks | 13 + .../reporters/test_teamcity_reporter.pkb | 131 +++++++ .../reporters/test_teamcity_reporter.pks | 22 ++ .../reporters/test_tfs_junit_reporter.pkb | 207 ++++++++++ .../reporters/test_tfs_junit_reporter.pks | 39 ++ 13 files changed, 1034 insertions(+), 2 deletions(-) create mode 100644 test/ut3_user/reporters.pkb create mode 100644 test/ut3_user/reporters.pks create mode 100644 test/ut3_user/reporters/test_junit_reporter.pkb create mode 100644 test/ut3_user/reporters/test_junit_reporter.pks create mode 100644 test/ut3_user/reporters/test_sonar_test_reporter.pkb create mode 100644 test/ut3_user/reporters/test_sonar_test_reporter.pks create mode 100644 test/ut3_user/reporters/test_teamcity_reporter.pkb create mode 100644 test/ut3_user/reporters/test_teamcity_reporter.pks create mode 100644 test/ut3_user/reporters/test_tfs_junit_reporter.pkb create mode 100644 test/ut3_user/reporters/test_tfs_junit_reporter.pks diff --git a/test/install_ut3_tester_tests.sql b/test/install_ut3_tester_tests.sql index 845e34782..1d4155c3d 100644 --- a/test/install_ut3_tester_tests.sql +++ b/test/install_ut3_tester_tests.sql @@ -38,6 +38,7 @@ alter session set plsql_optimize_level=0; @@ut3_tester/core/test_suite_builder.pkb + set linesize 200 set define on set verify off diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index 583c844be..3db7beee7 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -20,6 +20,13 @@ prompt Install user tests @@ut3_user/expectations/test_expectations_cursor.pks @@ut3_user/api/test_ut_runner.pks @@ut3_user/api/test_ut_run.pks +@@ut3_user/reporters.pks +@@ut3_user/reporters/test_tfs_junit_reporter.pks +@@ut3_user/reporters/test_teamcity_reporter.pks +@@ut3_user/reporters/test_sonar_test_reporter.pks +@@ut3_user/reporters/test_junit_reporter.pks + + @@ut3_user/expectations/unary/test_expect_not_to_be_null.pkb @@ut3_user/expectations/unary/test_expect_to_be_null.pkb @@ -36,6 +43,12 @@ prompt Install user tests @@ut3_user/expectations/test_expectations_cursor.pkb @@ut3_user/api/test_ut_runner.pkb @@ut3_user/api/test_ut_run.pkb +@@ut3_user/reporters.pkb +@@ut3_user/reporters/test_tfs_junit_reporter.pkb +@@ut3_user/reporters/test_teamcity_reporter.pkb +@@ut3_user/reporters/test_sonar_test_reporter.pkb +@@ut3_user/reporters/test_junit_reporter.pkb + set linesize 200 set define on diff --git a/test/ut3_tester/core/test_ut_executable.pks b/test/ut3_tester/core/test_ut_executable.pks index 453998693..acb91d1be 100644 --- a/test/ut3_tester/core/test_ut_executable.pks +++ b/test/ut3_tester/core/test_ut_executable.pks @@ -8,9 +8,7 @@ create or replace package test_ut_executable is --%test(Executes procedure in current schema when user was not provided) procedure exec_schema_package_proc; - /* TODO: Fix Me */ --%test(Executes procedure and saves dbms_output) - --%disabled procedure exec_package_proc_output; --%test(Executes a procedure raising exception, saves dbms_output and exception stack trace) diff --git a/test/ut3_user/reporters.pkb b/test/ut3_user/reporters.pkb new file mode 100644 index 000000000..364566569 --- /dev/null +++ b/test/ut3_user/reporters.pkb @@ -0,0 +1,150 @@ +create or replace package body reporters is + + procedure create_test_helper_package is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package test_reporters +as + --%suite(A suite for testing different outcomes from reporters) + --%suitepath(org.utplsql.tests.helpers) + + --%beforeall + procedure beforeall; + + --%beforeeach + procedure beforeeach; + + --%context(some_context) + --%displayname(A description of some context) + + --%test + --%beforetest(beforetest) + --%aftertest(aftertest) + procedure passing_test; + + --%endcontext + + procedure beforetest; + + procedure aftertest; + + --%test(a test with failing assertion) + procedure failing_test; + + --%test(a test raising unhandled exception) + procedure erroring_test; + + --%test(a disabled test) + --%disabled + procedure disabled_test; + + --%aftereach + procedure aftereach; + + --%afterall + procedure afterall; + +end;]'; + + execute immediate q'[create or replace package body test_reporters +as + + procedure beforetest is + begin + dbms_output.put_line(''); + end; + + procedure aftertest + is + begin + dbms_output.put_line(''); + end; + + procedure beforeeach is + begin + dbms_output.put_line(''); + end; + + procedure aftereach is + begin + dbms_output.put_line(''); + end; + + procedure passing_test + is + begin + dbms_output.put_line(''); + ut3.ut.expect(1,'Test 1 Should Pass').to_equal(1); + end; + + procedure failing_test + is + begin + dbms_output.put_line(''); + ut3.ut.expect('number [1] ','Fails as values are different').to_equal('number [2] '); + end; + + procedure erroring_test + is + l_variable integer; + begin + dbms_output.put_line(''); + l_variable := 'a string'; + ut3.ut.expect(l_variable).to_equal(1); + end; + + procedure disabled_test + is + begin + dbms_output.put_line(''); + ut3.ut.expect(1,'this should not execute').to_equal(1); + end; + + procedure beforeall is + begin + dbms_output.put_line(''); + end; + + procedure afterall is + begin + dbms_output.put_line(''); + end; + +end;]'; + + end; + + procedure reporters_setup is + begin + create_test_helper_package; + end; + + procedure drop_test_helper_package is + begin + execute immediate 'drop package test_reporters'; + end; + + procedure reporters_cleanup is + pragma autonomous_transaction; + begin + drop_test_helper_package; + end; + + procedure check_xml_encoding_included( + a_reporter ut3.ut_output_reporter_base, + a_client_character_set varchar2 + ) is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('test_reporters', a_reporter, a_client_character_set => a_client_character_set)); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like('%'); + end; + +end reporters; +/ diff --git a/test/ut3_user/reporters.pks b/test/ut3_user/reporters.pks new file mode 100644 index 000000000..cb601cf3b --- /dev/null +++ b/test/ut3_user/reporters.pks @@ -0,0 +1,18 @@ +create or replace package reporters is + + --%suite + --%suitepath(utplsql.test_user) + + --%beforeall + procedure reporters_setup; + + --%afterall + procedure reporters_cleanup; + + procedure check_xml_encoding_included( + a_reporter ut3.ut_output_reporter_base, + a_client_character_set varchar2 + ); + +end reporters; +/ diff --git a/test/ut3_user/reporters/test_junit_reporter.pkb b/test/ut3_user/reporters/test_junit_reporter.pkb new file mode 100644 index 000000000..b86bb698c --- /dev/null +++ b/test/ut3_user/reporters/test_junit_reporter.pkb @@ -0,0 +1,353 @@ +create or replace package body test_junit_reporter as + + procedure create_a_test_package is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package check_junit_reporting is + --%suite(A suite with ) + + --%test(A test with ) + procedure test_do_stuff; + + end;]'; + execute immediate q'[create or replace package body check_junit_reporting is + procedure test_do_stuff is + begin + ut3.ut.expect(1).to_equal(1); + ut3.ut.expect(1).to_equal(2); + end; + + end;]'; + + execute immediate q'[create or replace package check_junit_rep_suitepath is + --%suitepath(core) + --%suite(check_junit_rep_suitepath) + --%displayname(Check junit Get path for suitepath) + + --%test(check_junit_rep_suitepath) + --%displayname(Check junit Get path for suitepath) + procedure check_junit_rep_suitepath; + end;]'; + execute immediate q'[create or replace package body check_junit_rep_suitepath is + procedure check_junit_rep_suitepath is + begin + ut3.ut.expect(1).to_equal(1); + end; + end;]'; + + + execute immediate q'[create or replace package tst_package_junit_nodesc as + --%suite(Suite name) + + --%test + procedure test1; + + --%test(Test name) + procedure test2; + end;]'; + + execute immediate q'[create or replace package body tst_package_junit_nodesc as + procedure test1 is begin ut.expect(1).to_equal(1); end; + procedure test2 is begin ut.expect(1).to_equal(1); end; + end;]'; + + execute immediate q'[create or replace package tst_package_junit_nosuite as + --%suite + + --%test(Test name) + procedure test1; + end;]'; + + execute immediate q'[create or replace package body tst_package_junit_nosuite as + procedure test1 is begin ut.expect(1).to_equal(1); end; + end;]'; + + execute immediate q'[create or replace package Tst_Fix_Case_Sensitive as + --%suite + + --%test(bugfix) + procedure bUgFiX; + end;]'; + + execute immediate q'[create or replace package body Tst_Fix_Case_Sensitive as + procedure bUgFiX is begin ut.expect(1).to_equal(1); end; + end;]'; + + execute immediate q'[create or replace package check_fail_escape is + --%suitepath(core) + --%suite(checkfailedescape) + --%displayname(Check JUNIT XML failure is escaped) + + --%test(Fail Miserably) + procedure fail_miserably; + + end;]'; + + execute immediate q'[create or replace package body check_fail_escape is + procedure fail_miserably is + begin + ut3.ut.expect('test').to_equal(''); + end; + end;]'; + + end; + + procedure escapes_special_chars is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_reporting',ut3.ut_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).not_to_be_like('%%'); + ut.expect(l_actual).to_be_like('%<tag>%'); + end; + + procedure reports_only_failed_or_errored is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_reporting',ut3.ut_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).not_to_be_like('%Actual: 1 (number) was expected to equal: 1 (number)%'); + ut.expect(l_actual).to_be_like('%Actual: 1 (number) was expected to equal: 2 (number)%'); + end; + + procedure reports_xunit_only_fail_or_err is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_reporting',ut3.ut_xunit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).not_to_be_like('%Actual: 1 (number) was expected to equal: 1 (number)%'); + ut.expect(l_actual).to_be_like('%Actual: 1 (number) was expected to equal: 2 (number)%'); + end; + + procedure reports_failed_line is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_reporting',ut3.ut_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like('%at "%.CHECK_JUNIT_REPORTING%", line %'); + end; + + procedure check_classname_suite is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_reporting',ut3.ut_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like('%testcase classname="check_junit_reporting" assertions="%" name="%"%'); + end; + + procedure check_nls_number_formatting is + l_results ut3.ut_varchar2_list; + l_actual clob; + l_nls_numeric_characters varchar2(30); + begin + --Arrange + select replace(nsp.value,'''','''''') into l_nls_numeric_characters + from nls_session_parameters nsp + where parameter = 'NLS_NUMERIC_CHARACTERS'; + execute immediate q'[alter session set NLS_NUMERIC_CHARACTERS=', ']'; + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_reporting', ut3.ut_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_match('time="[0-9]*\.[0-9]{3,6}"'); + --Cleanup + execute immediate 'alter session set NLS_NUMERIC_CHARACTERS='''||l_nls_numeric_characters||''''; + end; + + procedure check_classname_suitepath is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_rep_suitepath',ut3.ut_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like('%testcase classname="core.check_junit_rep_suitepath" assertions="%" name="%"%'); + end; + + procedure report_test_without_desc is + l_results ut3.ut_varchar2_list; + l_actual clob; + l_expected varchar2(32767):= q'[ + + + + + + + + + + + + + +]'; + begin + select * + bulk collect into l_results + from table(ut3.ut.run('tst_package_junit_nodesc',ut3.ut_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + end; + + procedure report_suite_without_desc is + l_results ut3.ut_varchar2_list; + l_actual clob; + l_expected varchar2(32767):= q'[ + + + + + + + + + +]'; + begin + select * + bulk collect into l_results + from table(ut3.ut.run('tst_package_junit_nosuite',ut3.ut_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + end; + + procedure reporort_produces_expected_out is + l_results ut3.ut_varchar2_list; + l_actual clob; + l_expected varchar2(32767):=q'[ + + + + + + + + +% + + + + + + + +%Fails as values are different% + +% + + + + +%ORA-06502:% + +% + + + + + + + + +% + + + + + + + +]'; + + begin + select * + bulk collect into l_results + from table(ut3.ut.run('test_reporters',ut3.ut_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + end; + + procedure check_failure_escaped is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_fail_escape',ut3.ut_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like('%Actual: 'test' (varchar2) was expected to equal: '<![CDATA[some stuff]]>' (varchar2)%'); + end; + + procedure check_classname_is_populated is + l_results ut3.ut_varchar2_list; + l_actual clob; + l_expected varchar2(32767):= q'[ + + + + + + + + + +]'; + begin + select * + bulk collect into l_results + from table(ut3.ut.run('Tst_Fix_Case_Sensitive',ut3.ut_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + end; + + procedure check_encoding_included is + begin + reporters.check_xml_encoding_included(ut3.ut_junit_reporter(), 'UTF-8'); + end; + + procedure remove_test_package is + pragma autonomous_transaction; + begin + execute immediate 'drop package check_junit_reporting'; + execute immediate 'drop package check_junit_rep_suitepath'; + execute immediate 'drop package tst_package_junit_nodesc'; + execute immediate 'drop package tst_package_junit_nosuite'; + execute immediate 'drop package check_fail_escape'; + execute immediate 'drop package Tst_Fix_Case_Sensitive'; + end; + +end; +/ diff --git a/test/ut3_user/reporters/test_junit_reporter.pks b/test/ut3_user/reporters/test_junit_reporter.pks new file mode 100644 index 000000000..8af2ba430 --- /dev/null +++ b/test/ut3_user/reporters/test_junit_reporter.pks @@ -0,0 +1,51 @@ +create or replace package test_junit_reporter as + + --%suite(ut_junit_reporter) + --%suitepath(utplsql.test_user.reporters) + + --%beforeall + procedure create_a_test_package; + + --%test(Escapes special characters from test and suite description) + procedure escapes_special_chars; + + --%test(Reports only failed expectations and exceptions) + procedure reports_only_failed_or_errored; + + --%test(Xunit Backward Compatibility - Reports only failed expectations and exceptions) + procedure reports_xunit_only_fail_or_err; + + --%test(Reports failed line of test) + procedure reports_failed_line; + + --%test(Check that classname is returned correct suite) + procedure check_classname_suite; + + --%test(Check that classname is returned correct suitepath) + procedure check_classname_suitepath; + + --%test(Reports duration according to XML specification for numbers) + procedure check_nls_number_formatting; + + --%test(Report on test without description) + procedure report_test_without_desc; + + --%test(Report on suite without description) + procedure report_suite_without_desc; + + --%test(Report produces expected output) + procedure reporort_produces_expected_out; + + --%test( Check classname is populated when procedure is mixed cased - bug #659) + procedure check_classname_is_populated; + + --%test( Validate that fail with special char are escaped ) + procedure check_failure_escaped; + + --%test(Includes XML header with encoding when encoding provided) + procedure check_encoding_included; + + --%afterall + procedure remove_test_package; +end; +/ diff --git a/test/ut3_user/reporters/test_sonar_test_reporter.pkb b/test/ut3_user/reporters/test_sonar_test_reporter.pkb new file mode 100644 index 000000000..76cec84c8 --- /dev/null +++ b/test/ut3_user/reporters/test_sonar_test_reporter.pkb @@ -0,0 +1,36 @@ +create or replace package body test_sonar_test_reporter as + + procedure report_produces_expected_out is + l_results ut3.ut_varchar2_list; + l_actual clob; + l_expected varchar2(32767):=q'[ + + +% +%%% +%%% +%% + +]'; + + begin + select * + bulk collect into l_results + from table( + ut3.ut.run( + 'test_reporters', + ut3.ut_sonar_test_reporter(), + a_test_file_mappings => ut3.ut_file_mapper.build_file_mappings( sys_context('USERENV', 'CURRENT_USER'), ut3.ut_varchar2_list('tests/helpers/test_reporters.pkb')) + ) + ); + l_actual :=ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + end; + + procedure check_encoding_included is + begin + reporters.check_xml_encoding_included(ut3.ut_sonar_test_reporter(), 'UTF-8'); + end; + +end; +/ diff --git a/test/ut3_user/reporters/test_sonar_test_reporter.pks b/test/ut3_user/reporters/test_sonar_test_reporter.pks new file mode 100644 index 000000000..0c2fdf70a --- /dev/null +++ b/test/ut3_user/reporters/test_sonar_test_reporter.pks @@ -0,0 +1,13 @@ +create or replace package test_sonar_test_reporter as + + --%suite(ut_sonar_test_reporter) + --%suitepath(utplsql.test_user.reporters) + + --%test(Report produces expected output) + procedure report_produces_expected_out; + + --%test(Includes XML header with encoding when encoding provided) + procedure check_encoding_included; + +end; +/ diff --git a/test/ut3_user/reporters/test_teamcity_reporter.pkb b/test/ut3_user/reporters/test_teamcity_reporter.pkb new file mode 100644 index 000000000..fc2ab169e --- /dev/null +++ b/test/ut3_user/reporters/test_teamcity_reporter.pkb @@ -0,0 +1,131 @@ +create or replace package body test_teamcity_reporter as + + procedure create_a_test_package is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package check_escape_special_chars is + --%suite(A suite with 'quote') + + --%test(A test with 'quote') + procedure test_do_stuff; + + end;]'; + execute immediate q'[create or replace package body check_escape_special_chars is + procedure test_do_stuff is + begin + ut3.ut.expect(' [ ' || chr(13) || chr(10) || ' ] ' ).to_be_null; + end; + + end;]'; + + execute immediate q'[create or replace package check_trims_long_output is + --%suite + + --%test + procedure long_output; + end;]'; + execute immediate q'[create or replace package body check_trims_long_output is + procedure long_output is + begin + ut3.ut.expect(rpad('aVarchar',4000,'a')).to_be_null; + end; + end;]'; + + end; + + + procedure report_produces_expected_out is + l_output_data ut3.ut_varchar2_list; + l_output clob; + l_expected varchar2(32767); + begin + l_expected := q'{%##teamcity[testSuiteStarted timestamp='%' name='org'] +%##teamcity[testSuiteStarted timestamp='%' name='org.utplsql'] +%##teamcity[testSuiteStarted timestamp='%' name='org.utplsql.tests'] +%##teamcity[testSuiteStarted timestamp='%' name='org.utplsql.tests.helpers'] +%##teamcity[testSuiteStarted timestamp='%' name='A suite for testing different outcomes from reporters'] +%##teamcity[testSuiteStarted timestamp='%' name='A description of some context'] +%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3$user#.test_reporters.passing_test'] + + + + + +%##teamcity[testFinished timestamp='%' duration='%' name='ut3$user#.test_reporters.passing_test'] +%##teamcity[testSuiteFinished timestamp='%' name='A description of some context'] +%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3$user#.test_reporters.failing_test'] + + + +%##teamcity[testFailed timestamp='%' details='Actual: |'number |[1|] |' (varchar2) was expected to equal: |'number |[2|] |' (varchar2) ' message='Fails as values are different' name='ut3$user#.test_reporters.failing_test'] +%##teamcity[testFinished timestamp='%' duration='%' name='ut3$user#.test_reporters.failing_test'] +%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3$user#.test_reporters.erroring_test'] + + + +%##teamcity[testStdErr timestamp='%' name='ut3$user#.test_reporters.erroring_test' out='Test exception:|nORA-06512: at "UT3$USER#.TEST_REPORTERS", line %|nORA-06512: at %|n|n'] +%##teamcity[testFailed timestamp='%' details='Test exception:|nORA-06512: at "UT3$USER#.TEST_REPORTERS", line %|nORA-06512: at %|n|n' message='Error occured' name='ut3$user#.test_reporters.erroring_test'] +%##teamcity[testFinished timestamp='%' duration='%' name='ut3$user#.test_reporters.erroring_test'] +%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3$user#.test_reporters.disabled_test'] +%##teamcity[testIgnored timestamp='%' name='ut3$user#.test_reporters.disabled_test'] +%##teamcity[testSuiteFinished timestamp='%' name='A suite for testing different outcomes from reporters'] +%##teamcity[testSuiteFinished timestamp='%' name='org.utplsql.tests.helpers'] +%##teamcity[testSuiteFinished timestamp='%' name='org.utplsql.tests'] +%##teamcity[testSuiteFinished timestamp='%' name='org.utplsql'] +%##teamcity[testSuiteFinished timestamp='%' name='org']}'; + --act + select * + bulk collect into l_output_data + from table(ut3.ut.run('test_reporters',ut3.ut_teamcity_reporter())); + + --assert + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + end; + + procedure escape_special_chars is + l_output_data ut3.ut_varchar2_list; + l_output clob; + l_expected varchar2(32767); + begin + l_expected := q'{%##teamcity[testSuiteStarted timestamp='%' name='A suite with |'quote|''] +%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3$user#.check_escape_special_chars.test_do_stuff'] +%##teamcity[testFailed timestamp='%' details='Actual: (varchar2)|n |' |[ |r|n |] |'|nwas expected to be null' name='ut3$user#.check_escape_special_chars.test_do_stuff'] +%##teamcity[testFinished timestamp='%' duration='%' name='ut3$user#.check_escape_special_chars.test_do_stuff'] +%##teamcity[testSuiteFinished timestamp='%' name='A suite with |'quote|'']}'; + --act + select * + bulk collect into l_output_data + from table(ut3.ut.run('check_escape_special_chars',ut3.ut_teamcity_reporter())); + + --assert + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + end; + + procedure trims_long_output is + l_output_data ut3.ut_varchar2_list; + l_output clob; + l_expected varchar2(32767); + begin + l_expected := q'{%##teamcity[testSuiteStarted timestamp='%' name='check_trims_long_output'] +%##teamcity[testStarted timestamp='%' captureStandardOutput='true' name='ut3$user#.check_trims_long_output.long_output'] +%##teamcity[testFailed timestamp='%' details='Actual: (varchar2)|n |'aVarcharaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|[...|]' name='ut3$user#.check_trims_long_output.long_output'] +%##teamcity[testFinished timestamp='%' duration='%' name='ut3$user#.check_trims_long_output.long_output'] +%##teamcity[testSuiteFinished timestamp='%' name='check_trims_long_output']}'; + --act + select * + bulk collect into l_output_data + from table(ut3.ut.run('check_trims_long_output',ut3.ut_teamcity_reporter())); + + --assert + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected); + end; + + procedure remove_test_package is + pragma autonomous_transaction; + begin + execute immediate 'drop package check_escape_special_chars'; + execute immediate 'drop package check_trims_long_output'; + end; + +end; +/ diff --git a/test/ut3_user/reporters/test_teamcity_reporter.pks b/test/ut3_user/reporters/test_teamcity_reporter.pks new file mode 100644 index 000000000..f849751f1 --- /dev/null +++ b/test/ut3_user/reporters/test_teamcity_reporter.pks @@ -0,0 +1,22 @@ +create or replace package test_teamcity_reporter as + + --%suite(ut_teamcity_reporter) + --%suitepath(utplsql.test_user.reporters) + + --%beforeall + procedure create_a_test_package; + + --%test(Report produces expected output) + procedure report_produces_expected_out; + + --%test(Escapes special characters) + procedure escape_special_chars; + + --%test(Trims output so it fits into 4000 chars) + procedure trims_long_output; + + --%afterall + procedure remove_test_package; + +end; +/ diff --git a/test/ut3_user/reporters/test_tfs_junit_reporter.pkb b/test/ut3_user/reporters/test_tfs_junit_reporter.pkb new file mode 100644 index 000000000..623dda51e --- /dev/null +++ b/test/ut3_user/reporters/test_tfs_junit_reporter.pkb @@ -0,0 +1,207 @@ +create or replace package body test_tfs_junit_reporter as + + procedure crate_a_test_package is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package check_junit_reporting is + --%suite(A suite with ) + + --%test(A test with ) + procedure test_do_stuff; + + end;]'; + execute immediate q'[create or replace package body check_junit_reporting is + procedure test_do_stuff is + begin + ut3.ut.expect(1).to_equal(1); + ut3.ut.expect(1).to_equal(2); + end; + + end;]'; + + execute immediate q'[create or replace package check_junit_rep_suitepath is + --%suitepath(core) + --%suite(check_junit_rep_suitepath) + --%displayname(Check JUNIT Get path for suitepath) + + --%test(check_junit_rep_suitepath) + --%displayname(Check JUNIT Get path for suitepath) + procedure check_junit_rep_suitepath; + end;]'; + execute immediate q'[create or replace package body check_junit_rep_suitepath is + procedure check_junit_rep_suitepath is + begin + ut3.ut.expect(1).to_equal(1); + end; + end;]'; + + execute immediate q'[create or replace package check_junit_flat_suitepath is + --%suitepath(core.check_junit_rep_suitepath) + --%suite(flatsuitepath) + + --%beforeall + procedure donuffin; + end;]'; + execute immediate q'[create or replace package body check_junit_flat_suitepath is + procedure donuffin is + begin + null; + end; + end;]'; + + + execute immediate q'[create or replace package check_fail_escape is + --%suitepath(core) + --%suite(checkfailedescape) + --%displayname(Check JUNIT XML failure is escaped) + + --%test(Fail Miserably) + procedure fail_miserably; + + end;]'; + + execute immediate q'[create or replace package body check_fail_escape is + procedure fail_miserably is + begin + ut3.ut.expect('test').to_equal(''); + end; + end;]'; + + end; + + + procedure escapes_special_chars is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_reporting',ut3.ut_tfs_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).not_to_be_like('%%'); + ut.expect(l_actual).to_be_like('%<tag>%'); + end; + + procedure reports_only_failed_or_errored is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_reporting',ut3.ut_tfs_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).not_to_be_like('%Actual: 1 (number) was expected to equal: 1 (number)%'); + ut.expect(l_actual).to_be_like('%Actual: 1 (number) was expected to equal: 2 (number)%'); + end; + + procedure reports_failed_line is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_reporting',ut3.ut_tfs_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like('%at "%.CHECK_JUNIT_REPORTING%", line %'); + end; + + procedure check_classname_suite is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_reporting',ut3.ut_tfs_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like('%testcase classname="check_junit_reporting"%'); + end; + + procedure check_flatten_nested_suites is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_flat_suitepath',ut3.ut_tfs_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like(' + + + + + +%'); + end; + + procedure check_nls_number_formatting is + l_results ut3.ut_varchar2_list; + l_actual clob; + l_nls_numeric_characters varchar2(30); + begin + --Arrange + select replace(nsp.value,'''','''''') into l_nls_numeric_characters + from nls_session_parameters nsp + where parameter = 'NLS_NUMERIC_CHARACTERS'; + execute immediate q'[alter session set NLS_NUMERIC_CHARACTERS=', ']'; + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_reporting', ut3.ut_tfs_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_match('time="[0-9]*\.[0-9]{3,6}"'); + --Cleanup + execute immediate 'alter session set NLS_NUMERIC_CHARACTERS='''||l_nls_numeric_characters||''''; + end; + + procedure check_failure_escaped is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_fail_escape',ut3.ut_tfs_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like('%Actual: 'test' (varchar2) was expected to equal: '<![CDATA[some stuff]]>' (varchar2)%'); + end; + + procedure check_classname_suitepath is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table(ut3.ut.run('check_junit_rep_suitepath',ut3.ut_tfs_junit_reporter())); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like('%testcase classname="core.check_junit_rep_suitepath"%'); + end; + procedure remove_test_package is + pragma autonomous_transaction; + begin + execute immediate 'drop package check_junit_reporting'; + execute immediate 'drop package check_junit_rep_suitepath'; + execute immediate 'drop package check_junit_flat_suitepath'; + execute immediate 'drop package check_fail_escape'; + end; + + procedure check_encoding_included is + begin + reporters.check_xml_encoding_included(ut3.ut_tfs_junit_reporter(), 'UTF-8'); + end; + +end; +/ diff --git a/test/ut3_user/reporters/test_tfs_junit_reporter.pks b/test/ut3_user/reporters/test_tfs_junit_reporter.pks new file mode 100644 index 000000000..af6227283 --- /dev/null +++ b/test/ut3_user/reporters/test_tfs_junit_reporter.pks @@ -0,0 +1,39 @@ +create or replace package test_tfs_junit_reporter as + + --%suite(ut_tfs_junit_reporter) + --%suitepath(utplsql.test_user.reporters) + + --%beforeall + procedure crate_a_test_package; + + --%test(Escapes special characters from test and suite description) + procedure escapes_special_chars; + + --%test(Reports only failed expectations and exceptions) + procedure reports_only_failed_or_errored; + + --%test(Reports failed line of test) + procedure reports_failed_line; + + --%test(Check that classname is returned correct suite) + procedure check_classname_suite; + + --%test(Check that classname is returned correct suitepath) + procedure check_classname_suitepath; + + --%test(Check that nested suites are being flatten) + procedure check_flatten_nested_suites; + + --%test(Reports duration according to XML specification for numbers) + procedure check_nls_number_formatting; + + --%test( Validate that failures with special char are escaped ) + procedure check_failure_escaped; + + --%test(Includes XML header with encoding when encoding provided) + procedure check_encoding_included; + + --%afterall + procedure remove_test_package; +end; +/ From 7bae9ff5f67d86ccd358e16086d08fc0f20f5463 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 30 Mar 2019 20:58:55 +0000 Subject: [PATCH 038/181] Fixed storage for clob in output bugger table - make it inline. Changed how delete from output buffer table is handled - use ROWID. Increased fetch size from 100 to 3000 rows for output buffer. --- .../output_buffers/ut_output_buffer_tmp.sql | 7 ++++--- .../output_buffers/ut_output_table_buffer.tpb | 19 ++++++++++--------- source/install.sql | 1 - 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/source/core/output_buffers/ut_output_buffer_tmp.sql b/source/core/output_buffers/ut_output_buffer_tmp.sql index e7cb49817..e452e769f 100644 --- a/source/core/output_buffers/ut_output_buffer_tmp.sql +++ b/source/core/output_buffers/ut_output_buffer_tmp.sql @@ -32,14 +32,15 @@ begin is_finished = 0 and (text is not null or item_type is not null ) or is_finished = 1 and text is null and item_type is null ), constraint ut_output_buffer_fk1 foreign key (output_id) references ut_output_buffer_info_tmp$(output_id) -) organization index overflow nologging initrans 100 '; +) nologging initrans 100 +'; begin execute immediate - v_table_sql || 'lob(text) store as securefile ut_output_text(retention none)'; + v_table_sql || 'lob(text) store as securefile ut_output_text(retention none enable storage in row)'; exception when e_non_assm then execute immediate - v_table_sql || 'lob(text) store as basicfile ut_output_text(pctversion 0)'; + v_table_sql || 'lob(text) store as basicfile ut_output_text(pctversion 0 enable storage in row)'; end; end; diff --git a/source/core/output_buffers/ut_output_table_buffer.tpb b/source/core/output_buffers/ut_output_table_buffer.tpb index 5fc71570c..e6c154267 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_table_buffer.tpb @@ -78,8 +78,9 @@ create or replace type body ut_output_table_buffer is 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_message_ids ut_integer_list; l_finished_flags ut_integer_list; l_already_waited_for number(10,2) := 0; l_finished boolean := false; @@ -90,14 +91,14 @@ create or replace type body ut_output_table_buffer is lc_long_sleep_time constant number(1) := 1; --sleep for 1 s when waiting long lc_long_wait_time constant number(1) := 1; --waiting more than 1 sec l_sleep_time number(2,1) := lc_short_sleep_time; - lc_bulk_limit constant integer := 100; + lc_bulk_limit constant integer := 3000; - procedure remove_read_data(a_message_ids ut_integer_list) is + procedure remove_read_data(a_message_rowids t_rowid_tab) is pragma autonomous_transaction; begin - delete from ut_output_buffer_tmp a - where a.output_id = self.output_id - and a.message_id in (select column_value from table(a_message_ids)); + forall i in 1 .. a_message_rowids.count + delete from ut_output_buffer_tmp a + where rowid = a_message_rowids(i); commit; end; @@ -112,13 +113,13 @@ create or replace type body ut_output_table_buffer is begin while not l_finished loop with ordered_buffer as ( - select a.message_id, ut_output_data_row(a.text, a.item_type), is_finished + select a.rowid, ut_output_data_row(a.text, a.item_type), is_finished from ut_output_buffer_tmp a where a.output_id = self.output_id order by a.message_id ) select b.* - bulk collect into l_message_ids, l_buffer_data, l_finished_flags + bulk collect into l_message_rowids, l_buffer_data, l_finished_flags from ordered_buffer b where rownum <= lc_bulk_limit; @@ -147,7 +148,7 @@ create or replace type body ut_output_table_buffer is exit; end if; end loop; - remove_read_data(l_message_ids); + remove_read_data(l_message_rowids); end if; if l_finished or l_already_waited_for >= l_wait_for then remove_buffer_info(); diff --git a/source/install.sql b/source/install.sql index e34aa57af..c80eb67e6 100644 --- a/source/install.sql +++ b/source/install.sql @@ -194,7 +194,6 @@ prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema @@install_component.sql 'expectations/data_values/ut_cursor_column.tps' @@install_component.sql 'expectations/data_values/ut_cursor_column_tab.tps' @@install_component.sql 'expectations/data_values/ut_cursor_details.tps' -@@install_component.sql 'expectations/data_values/ut_data_value_anydata.tps' @@install_component.sql 'expectations/data_values/ut_data_value_blob.tps' @@install_component.sql 'expectations/data_values/ut_data_value_boolean.tps' @@install_component.sql 'expectations/data_values/ut_data_value_clob.tps' From 9d6bfe8a61a70597d278a002c01946d24cf88d18 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 31 Mar 2019 13:24:41 +0100 Subject: [PATCH 039/181] Improved performance for reading data from output buffer. Decreased read limit back to 1000 as it should not have significant performance impact anymore. --- .../core/output_buffers/ut_message_id_seq.sql | 1 - .../output_buffers/ut_output_buffer_base.tps | 8 ++--- .../output_buffers/ut_output_table_buffer.tpb | 32 +++++++++++-------- .../output_buffers/ut_output_table_buffer.tps | 9 +++--- source/install.sql | 1 - source/uninstall_objects.sql | 2 -- 6 files changed, 28 insertions(+), 25 deletions(-) delete mode 100644 source/core/output_buffers/ut_message_id_seq.sql diff --git a/source/core/output_buffers/ut_message_id_seq.sql b/source/core/output_buffers/ut_message_id_seq.sql deleted file mode 100644 index 3f0cd25c4..000000000 --- a/source/core/output_buffers/ut_message_id_seq.sql +++ /dev/null @@ -1 +0,0 @@ -create sequence ut_message_id_seq nocycle cache 100; diff --git a/source/core/output_buffers/ut_output_buffer_base.tps b/source/core/output_buffers/ut_output_buffer_base.tps index 42c4a0d72..59226a7fb 100644 --- a/source/core/output_buffers/ut_output_buffer_base.tps +++ b/source/core/output_buffers/ut_output_buffer_base.tps @@ -18,10 +18,10 @@ create or replace type ut_output_buffer_base authid definer as object( output_id raw(32), member procedure init(self in out nocopy ut_output_buffer_base), - not instantiable member procedure close(self in ut_output_buffer_base), - not instantiable member procedure send_line(self in ut_output_buffer_base, a_text varchar2, a_item_type varchar2 := null), - not instantiable member procedure send_lines(self in ut_output_buffer_base, a_text_list ut_varchar2_rows, a_item_type varchar2 := null), - not instantiable member procedure send_clob(self in ut_output_buffer_base, a_text clob, a_item_type varchar2 := null), + not instantiable member procedure close(self in out nocopy ut_output_buffer_base), + not instantiable member procedure send_line(self in out nocopy ut_output_buffer_base, a_text varchar2, a_item_type varchar2 := null), + not instantiable member procedure send_lines(self in out nocopy ut_output_buffer_base, a_text_list ut_varchar2_rows, a_item_type varchar2 := null), + not instantiable member procedure send_clob(self in out nocopy ut_output_buffer_base, a_text clob, a_item_type varchar2 := null), not instantiable member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined, not instantiable member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor, not instantiable member procedure lines_to_dbms_output(self in ut_output_buffer_base, a_initial_timeout natural := null, a_timeout_sec natural := null) diff --git a/source/core/output_buffers/ut_output_table_buffer.tpb b/source/core/output_buffers/ut_output_table_buffer.tpb index e6c154267..41a3aa82f 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_table_buffer.tpb @@ -20,6 +20,7 @@ create or replace type body ut_output_table_buffer is begin self.output_id := coalesce(a_output_id, sys_guid()); self.start_date := sysdate; + self.last_message_id := 0; self.init(); self.cleanup_buffer(); return; @@ -38,41 +39,44 @@ create or replace type body ut_output_table_buffer is commit; end; - overriding member procedure close(self in ut_output_table_buffer) is + overriding member procedure close(self in out nocopy ut_output_table_buffer) is pragma autonomous_transaction; begin + self.last_message_id := self.last_message_id + 1; insert into ut_output_buffer_tmp(output_id, message_id, is_finished) - values (self.output_id, ut_message_id_seq.nextval, 1); + values (self.output_id, self.last_message_id, 1); commit; end; - overriding member procedure send_line(self in ut_output_table_buffer, a_text varchar2, a_item_type varchar2 := null) is + 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 if a_text is not null or a_item_type is not null then + 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, ut_message_id_seq.nextval, a_text, a_item_type); + values (self.output_id, self.last_message_id, a_text, a_item_type); end if; commit; end; - overriding member procedure send_lines(self in ut_output_table_buffer, a_text_list ut_varchar2_rows, a_item_type varchar2 := null) is + 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 insert into ut_output_buffer_tmp(output_id, message_id, text, item_type) - select self.output_id, ut_message_id_seq.nextval, t.column_value, a_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; - + self.last_message_id := self.last_message_id + a_text_list.count; commit; end; - overriding member procedure send_clob(self in ut_output_table_buffer, a_text clob, a_item_type varchar2 := null) is + 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 + 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, ut_message_id_seq.nextval, a_text, a_item_type); + values (self.output_id, self.last_message_id, a_text, a_item_type); end if; commit; end; @@ -91,7 +95,8 @@ create or replace type body ut_output_table_buffer is lc_long_sleep_time constant number(1) := 1; --sleep for 1 s when waiting long lc_long_wait_time constant number(1) := 1; --waiting more than 1 sec l_sleep_time number(2,1) := lc_short_sleep_time; - lc_bulk_limit constant integer := 3000; + lc_bulk_limit constant integer := 1000; + l_max_message_id integer := lc_bulk_limit; procedure remove_read_data(a_message_rowids t_rowid_tab) is pragma autonomous_transaction; @@ -113,15 +118,15 @@ create or replace type body ut_output_table_buffer is begin while not l_finished loop with ordered_buffer as ( - select a.rowid, ut_output_data_row(a.text, a.item_type), is_finished + select /*+ index(a) */ a.rowid, ut_output_data_row(a.text, a.item_type), is_finished from ut_output_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 - where rownum <= lc_bulk_limit; + from ordered_buffer b; --nothing fetched from output, wait and try again if l_buffer_data.count = 0 then @@ -159,6 +164,7 @@ create or replace type body ut_output_table_buffer is ); end if; end if; + l_max_message_id := l_max_message_id + lc_bulk_limit; end loop; return; end; diff --git a/source/core/output_buffers/ut_output_table_buffer.tps b/source/core/output_buffers/ut_output_table_buffer.tps index 1c9acbd1d..9cf64927c 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tps +++ b/source/core/output_buffers/ut_output_table_buffer.tps @@ -17,12 +17,13 @@ create or replace type ut_output_table_buffer under ut_output_buffer_base ( */ start_date date, + last_message_id number(38,0), constructor function ut_output_table_buffer(self in out nocopy ut_output_table_buffer, a_output_id raw := null) return self as result, overriding member procedure init(self in out nocopy ut_output_table_buffer), - overriding member procedure send_line(self in ut_output_table_buffer, a_text varchar2, a_item_type varchar2 := null), - overriding member procedure send_lines(self in ut_output_table_buffer, a_text_list ut_varchar2_rows, a_item_type varchar2 := null), - overriding member procedure send_clob(self in ut_output_table_buffer, a_text clob, a_item_type varchar2 := null), - overriding member procedure close(self in ut_output_table_buffer), + overriding member procedure send_line(self in out nocopy ut_output_table_buffer, a_text varchar2, a_item_type varchar2 := null), + overriding member procedure send_lines(self in out nocopy ut_output_table_buffer, a_text_list ut_varchar2_rows, a_item_type varchar2 := null), + overriding member procedure send_clob(self in out nocopy ut_output_table_buffer, a_text clob, a_item_type varchar2 := null), + overriding member procedure close(self in out nocopy ut_output_table_buffer), overriding member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined, overriding member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor, overriding member procedure lines_to_dbms_output(self in ut_output_table_buffer, a_initial_timeout natural := null, a_timeout_sec natural := null), diff --git a/source/install.sql b/source/install.sql index c80eb67e6..08a5b59d7 100644 --- a/source/install.sql +++ b/source/install.sql @@ -99,7 +99,6 @@ alter session set current_schema = &&ut3_owner; --output buffer table @@install_component.sql 'core/output_buffers/ut_output_buffer_info_tmp.sql' @@install_component.sql 'core/output_buffers/ut_output_buffer_tmp.sql' -@@install_component.sql 'core/output_buffers/ut_message_id_seq.sql' --output buffer table api @@install_component.sql 'core/output_buffers/ut_output_table_buffer.tps' @@install_component.sql 'core/output_buffers/ut_output_table_buffer.tpb' diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index 62d14cb58..ed84aa0a0 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -257,8 +257,6 @@ drop view ut_output_buffer_info_tmp; drop table ut_output_buffer_info_tmp$; -drop sequence ut_message_id_seq; - drop type ut_output_data_rows force; drop type ut_output_data_row force; From 4d00c33bbd0cab1ed68159fec24cec342dfa932b Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 31 Mar 2019 14:31:54 +0100 Subject: [PATCH 040/181] Increased read limit to 5000. Fixed bug with increasing `max_message_id` even when nothing was read. --- source/core/output_buffers/ut_output_table_buffer.tpb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/core/output_buffers/ut_output_table_buffer.tpb b/source/core/output_buffers/ut_output_table_buffer.tpb index 41a3aa82f..5a9bdcce7 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_table_buffer.tpb @@ -95,7 +95,7 @@ create or replace type body ut_output_table_buffer is lc_long_sleep_time constant number(1) := 1; --sleep for 1 s when waiting long lc_long_wait_time constant number(1) := 1; --waiting more than 1 sec l_sleep_time number(2,1) := lc_short_sleep_time; - lc_bulk_limit constant integer := 1000; + lc_bulk_limit constant integer := 5000; l_max_message_id integer := lc_bulk_limit; procedure remove_read_data(a_message_rowids t_rowid_tab) is @@ -154,6 +154,7 @@ create or replace type body ut_output_table_buffer is end if; end loop; remove_read_data(l_message_rowids); + l_max_message_id := l_max_message_id + lc_bulk_limit; end if; if l_finished or l_already_waited_for >= l_wait_for then remove_buffer_info(); @@ -164,7 +165,6 @@ create or replace type body ut_output_table_buffer is ); end if; end if; - l_max_message_id := l_max_message_id + lc_bulk_limit; end loop; return; end; From 858372c7001e1b2e7106302350d9a35a1cd34993 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sun, 31 Mar 2019 16:33:08 +0100 Subject: [PATCH 041/181] Adding set of tests: reporters/test_coverage reporters/test_debug_reporter reporters/test_documentation_reporter reporters/test_extended_coverage reporters/test_realtime_reporter Fixing some helper methods. --- test/grant_ut3_owner_to_ut3_tester.sql | 2 +- test/install_ut3_tester_helper.sql | 4 + test/install_ut3_user_tests.sql | 24 +- test/ut3_tester_helper/coverage_helper.pkb | 215 ++++++++++ test/ut3_tester_helper/coverage_helper.pks | 27 ++ test/ut3_tester_helper/main_helper.pkb | 20 + test/ut3_tester_helper/main_helper.pks | 10 +- test/ut3_tester_helper/run_helper.pkb | 2 +- test/ut3_tester_helper/run_helper.pks | 5 +- test/ut3_tester_helper/test_event_list.tps | 2 + test/ut3_tester_helper/test_event_object.tps | 15 + test/ut3_user/reporters/test_coverage.pkb | 51 +++ test/ut3_user/reporters/test_coverage.pks | 20 + .../reporters/test_debug_reporter.pkb | 45 ++ .../reporters/test_debug_reporter.pks | 16 + .../reporters/test_documentation_reporter.pkb | 1 + .../reporters/test_documentation_reporter.pks | 10 + .../reporters/test_extended_coverage.pkb | 106 +++++ .../reporters/test_extended_coverage.pks | 22 + .../reporters/test_realtime_reporter.pkb | 401 ++++++++++++++++++ .../reporters/test_realtime_reporter.pks | 55 +++ 21 files changed, 1048 insertions(+), 5 deletions(-) create mode 100644 test/ut3_tester_helper/coverage_helper.pkb create mode 100644 test/ut3_tester_helper/coverage_helper.pks create mode 100644 test/ut3_tester_helper/test_event_list.tps create mode 100644 test/ut3_tester_helper/test_event_object.tps create mode 100644 test/ut3_user/reporters/test_coverage.pkb create mode 100644 test/ut3_user/reporters/test_coverage.pks create mode 100644 test/ut3_user/reporters/test_debug_reporter.pkb create mode 100644 test/ut3_user/reporters/test_debug_reporter.pks create mode 100644 test/ut3_user/reporters/test_documentation_reporter.pkb create mode 100644 test/ut3_user/reporters/test_documentation_reporter.pks create mode 100644 test/ut3_user/reporters/test_extended_coverage.pkb create mode 100644 test/ut3_user/reporters/test_extended_coverage.pks create mode 100644 test/ut3_user/reporters/test_realtime_reporter.pkb create mode 100644 test/ut3_user/reporters/test_realtime_reporter.pks diff --git a/test/grant_ut3_owner_to_ut3_tester.sql b/test/grant_ut3_owner_to_ut3_tester.sql index d06a24ace..19424be1a 100644 --- a/test/grant_ut3_owner_to_ut3_tester.sql +++ b/test/grant_ut3_owner_to_ut3_tester.sql @@ -17,7 +17,7 @@ begin and generated = 'N' and lower(object_name) not like 'sys%') loop - execute immediate 'grant execute on ut3.'||i.object_name||' to UT3_TESTER'; + execute immediate 'grant execute on ut3."'||i.object_name||'" to UT3_TESTER'; end loop; end; / diff --git a/test/install_ut3_tester_helper.sql b/test/install_ut3_tester_helper.sql index 1645cd4c7..c6244fd39 100644 --- a/test/install_ut3_tester_helper.sql +++ b/test/install_ut3_tester_helper.sql @@ -11,14 +11,18 @@ alter session set plsql_optimize_level=0; @@ut3_tester_helper/test_tab_varray.tps @@ut3_tester_helper/test_dummy_number.tps @@ut3_tester_helper/ut_test_table.sql +@@ut3_tester_helper/test_event_object.tps +@@ut3_tester_helper/test_event_list.tps @@ut3_tester_helper/main_helper.pks @@ut3_tester_helper/run_helper.pks +@@ut3_tester_helper/coverage_helper.pks @@ut3_tester_helper/expectations_helper.pks @@ut3_tester_helper/ut_example_tests.pks @@ut3_tester_helper/main_helper.pkb @@ut3_tester_helper/run_helper.pkb +@@ut3_tester_helper/coverage_helper.pkb @@ut3_tester_helper/expectations_helper.pkb @@ut3_tester_helper/ut_example_tests.pkb diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index 3db7beee7..5da99d802 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -25,8 +25,18 @@ prompt Install user tests @@ut3_user/reporters/test_teamcity_reporter.pks @@ut3_user/reporters/test_sonar_test_reporter.pks @@ut3_user/reporters/test_junit_reporter.pks +@@ut3_user/reporters/test_documentation_reporter.pks +@@ut3_user/reporters/test_debug_reporter.pks +@@ut3_user/reporters/test_realtime_reporter.pks +@@ut3_user/reporters/test_coverage.pks +set define on +@@install_above_12_1.sql 'ut3_user/reporters/test_extended_coverage.pks' +set define off - +--set define on +--@@install_below_12_2.sql 'ut3_user/reporters/test_proftag_coverage.pks' +--@@install_below_12_2.sql 'ut3_user/reporters/test_coverage/test_html_proftab_reporter.pks' +--set define off @@ut3_user/expectations/unary/test_expect_not_to_be_null.pkb @@ut3_user/expectations/unary/test_expect_to_be_null.pkb @@ -48,6 +58,18 @@ prompt Install user tests @@ut3_user/reporters/test_teamcity_reporter.pkb @@ut3_user/reporters/test_sonar_test_reporter.pkb @@ut3_user/reporters/test_junit_reporter.pkb +@@ut3_user/reporters/test_documentation_reporter.pkb +@@ut3_user/reporters/test_debug_reporter.pkb +@@ut3_user/reporters/test_realtime_reporter.pkb +@@ut3_user/reporters/test_coverage.pkb +set define on +@@install_above_12_1.sql 'ut3_user/reporters/test_extended_coverage.pkb' +set define off + +--set define on +--@@install_below_12_2.sql 'ut3_user/reporters/test_coverage.pkb' +--@@install_below_12_2.sql 'ut3_user/reporters/test_coverage/test_html_proftab_reporter.pkb' +--set define off set linesize 200 diff --git a/test/ut3_tester_helper/coverage_helper.pkb b/test/ut3_tester_helper/coverage_helper.pkb new file mode 100644 index 000000000..06f42bbf3 --- /dev/null +++ b/test/ut3_tester_helper/coverage_helper.pkb @@ -0,0 +1,215 @@ +create or replace package body coverage_helper is + + function get_mock_run_id return integer is + v_result integer; + begin + select nvl(min(runid),0) - 1 into v_result + from ut3.plsql_profiler_runs; + return v_result; + end; + + function get_mock_block_run_id return integer is + v_result integer; + begin + select nvl(min(run_id),0) - 1 into v_result + from dbmspcc_runs; + return v_result; + end; + + procedure mock_coverage_data(a_run_id integer,a_user in varchar2) is + c_unit_id constant integer := 1; + begin + insert into ut3.plsql_profiler_runs ( runid, run_owner, run_date, run_comment) + values(a_run_id, a_user, sysdate, 'unit testing utPLSQL'); + + insert into ut3.plsql_profiler_units ( runid, unit_number, unit_type, unit_owner, unit_name) + values(a_run_id, c_unit_id, 'PACKAGE BODY', 'UT3', 'DUMMY_COVERAGE'); + + insert into ut3.plsql_profiler_data ( runid, unit_number, line#, total_occur, total_time) + select a_run_id, c_unit_id, 4, 1, 1 from dual union all + select a_run_id, c_unit_id, 5, 0, 0 from dual union all + select a_run_id, c_unit_id, 7, 1, 1 from dual; + end; + + procedure cleanup_dummy_coverage(a_run_id in integer) is + pragma autonomous_transaction; + begin + delete from ut3.plsql_profiler_data where runid = a_run_id; + delete from ut3.plsql_profiler_units where runid = a_run_id; + delete from ut3.plsql_profiler_runs where runid = a_run_id; + commit; + end; + + procedure create_dummy_coverage_package is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package UT3.DUMMY_COVERAGE is + procedure do_stuff; + + procedure grant_myself; + end;]'; + execute immediate q'[create or replace package body UT3.DUMMY_COVERAGE is + procedure do_stuff is + begin + if 1 = 2 then + dbms_output.put_line('should not get here'); + else + dbms_output.put_line('should get here'); + end if; + end; + + procedure grant_myself is + begin + execute immediate 'grant debug,execute on UT3.DUMMY_COVERAGE to ut3$user#'; + end; + end;]'; + + end; + + procedure create_dummy_coverage_test is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package UT3.TEST_DUMMY_COVERAGE is + --%suite(dummy coverage test) + --%suitepath(coverage_testing) + + --%test + procedure test_do_stuff; + + procedure grant_myself; + end;]'; + execute immediate q'[create or replace package body UT3.TEST_DUMMY_COVERAGE is + procedure test_do_stuff is + begin + dummy_coverage.do_stuff; + end; + + procedure grant_myself is + begin + execute immediate 'grant debug,execute on UT3.TEST_DUMMY_COVERAGE to ut3$user#'; + end; + end;]'; + + end; + + procedure grant_exec_on_cov is + pragma autonomous_transaction; + begin + execute immediate 'begin UT3.DUMMY_COVERAGE.grant_myself(); end;'; + execute immediate 'begin UT3.TEST_DUMMY_COVERAGE.grant_myself(); end;'; + end; + + procedure drop_dummy_coverage_pkg is + pragma autonomous_transaction; + begin + begin execute immediate q'[drop package ut3.test_dummy_coverage]'; exception when others then null; end; + begin execute immediate q'[drop package ut3.dummy_coverage]'; exception when others then null; end; + end; + + + --12.2 Setup + procedure create_dummy_12_2_cov_pck is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package UT3.DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG is + procedure do_stuff(i_input in number); + + procedure grant_myself; + end;]'; + execute immediate q'[create or replace package body UT3.DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG is + procedure do_stuff(i_input in number) is + begin + if i_input = 2 then + dbms_output.put_line('should not get here'); + else + dbms_output.put_line('should get here'); + end if; + end; + + procedure grant_myself is + begin + execute immediate 'grant debug,execute on UT3.DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG to ut3$user#'; + end; + + end;]'; + end; + + procedure create_dummy_12_2_cov_test is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package UT3.TEST_BLOCK_DUMMY_COVERAGE is + --%suite(dummy coverage test) + --%suitepath(coverage_testing) + + --%test + procedure test_do_stuff; + + procedure grant_myself; + + end;]'; + execute immediate q'[create or replace package body UT3.TEST_BLOCK_DUMMY_COVERAGE is + procedure test_do_stuff is + begin + dummy_coverage_package_with_an_amazingly_long_name_that_you_would_not_think_of_in_real_life_project_because_its_simply_too_long.do_stuff(1); + ut.expect(1).to_equal(1); + end; + + procedure grant_myself is + begin + execute immediate 'grant debug,execute on UT3.TEST_BLOCK_DUMMY_COVERAGE to ut3$user#'; + end; + end;]'; + end; + + procedure mock_block_coverage_data(a_run_id integer,a_user in varchar2) is + c_unit_id constant integer := 1; + begin + insert into dbmspcc_runs ( run_id, run_owner, run_timestamp, run_comment) + values(a_run_id, a_user, sysdate, 'unit testing utPLSQL'); + + insert into dbmspcc_units ( run_id, object_id, type, owner, name,last_ddl_time) + values(a_run_id, c_unit_id, 'PACKAGE BODY', 'UT3', 'DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG',sysdate); + + insert into dbmspcc_blocks ( run_id, object_id, line,block,col,covered,not_feasible) + select a_run_id, c_unit_id,4,1,1,1,0 from dual union all + select a_run_id, c_unit_id,4,2,2,0,0 from dual union all + select a_run_id, c_unit_id,5,3,0,1,0 from dual union all + select a_run_id, c_unit_id,7,4,1,1,0 from dual; + end; + + procedure mock_profiler_coverage_data(a_run_id integer,a_user in varchar2) is + c_unit_id constant integer := 1; + begin + insert into ut3.plsql_profiler_runs ( runid, run_owner, run_date, run_comment) + values(a_run_id, a_user, sysdate, 'unit testing utPLSQL'); + + insert into ut3.plsql_profiler_units ( runid, unit_number, unit_type, unit_owner, unit_name) + values(a_run_id, c_unit_id, 'PACKAGE BODY', 'UT3', 'DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG'); + + insert into ut3.plsql_profiler_data ( runid, unit_number, line#, total_occur, total_time) + select a_run_id, c_unit_id, 4, 1, 1 from dual union all + select a_run_id, c_unit_id, 5, 0, 0 from dual union all + select a_run_id, c_unit_id, 6, 1, 0 from dual union all + select a_run_id, c_unit_id, 7, 1, 1 from dual; + end; + + procedure cleanup_dummy_coverage(a_block_id in integer, a_prof_id in integer) is + pragma autonomous_transaction; + begin + begin execute immediate q'[drop package ut3.test_block_dummy_coverage]'; exception when others then null; end; + begin execute immediate q'[drop package ut3.dummy_coverage_package_with_an_amazingly_long_name_that_you_would_not_think_of_in_real_life_project_because_its_simply_too_long]'; exception when others then null; end; + delete from dbmspcc_blocks where run_id = a_block_id; + delete from dbmspcc_units where run_id = a_block_id; + delete from dbmspcc_runs where run_id = a_block_id; + cleanup_dummy_coverage(a_prof_id); + commit; + end; + + procedure grant_exec_on_12_2_cov is + pragma autonomous_transaction; + begin + execute immediate 'begin UT3.DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG.grant_myself(); end;'; + execute immediate 'begin UT3.TEST_BLOCK_DUMMY_COVERAGE.grant_myself(); end;'; + end; +end; +/ diff --git a/test/ut3_tester_helper/coverage_helper.pks b/test/ut3_tester_helper/coverage_helper.pks new file mode 100644 index 000000000..427a965c0 --- /dev/null +++ b/test/ut3_tester_helper/coverage_helper.pks @@ -0,0 +1,27 @@ +create or replace package coverage_helper is + + g_run_id integer; + + type prof_runs_tab is table of ut3.plsql_profiler_runs%rowtype; + + function get_mock_run_id return integer; + function get_mock_block_run_id return integer; + procedure cleanup_dummy_coverage(a_run_id in integer); + procedure mock_coverage_data(a_run_id integer,a_user in varchar2); + + --Profiler coveage + procedure create_dummy_coverage_package; + procedure create_dummy_coverage_test; + procedure grant_exec_on_cov; + procedure mock_profiler_coverage_data(a_run_id integer,a_user in varchar2); + procedure drop_dummy_coverage_pkg; + + --Block coverage + procedure create_dummy_12_2_cov_pck; + procedure create_dummy_12_2_cov_test; + procedure mock_block_coverage_data(a_run_id integer,a_user in varchar2); + procedure cleanup_dummy_coverage(a_block_id in integer, a_prof_id in integer); + procedure grant_exec_on_12_2_cov; + +end; +/ diff --git a/test/ut3_tester_helper/main_helper.pkb b/test/ut3_tester_helper/main_helper.pkb index d9ffc06bd..ffccc3185 100644 --- a/test/ut3_tester_helper/main_helper.pkb +++ b/test/ut3_tester_helper/main_helper.pkb @@ -134,5 +134,25 @@ create or replace package body main_helper is where srj.job_name = a_job_name; end; + procedure append_to_list(a_list in out nocopy ut3.ut_varchar2_list, a_item varchar2) is + begin + ut3.ut_utils.append_to_list(a_list,a_item); + end; + + procedure append_to_list(a_list in out nocopy ut3.ut_varchar2_rows, a_item varchar2) is + begin + ut3.ut_utils.append_to_list(a_list,a_item); + end; + + procedure append_to_list(a_list in out nocopy ut3.ut_varchar2_rows, a_item clob) is + begin + ut3.ut_utils.append_to_list(a_list,a_item); + end; + + procedure append_to_list(a_list in out nocopy ut3.ut_varchar2_rows, a_items ut3.ut_varchar2_rows) is + begin + ut3.ut_utils.append_to_list(a_list,a_items); + end; + end; / diff --git a/test/ut3_tester_helper/main_helper.pks b/test/ut3_tester_helper/main_helper.pks index 296670707..7d349151c 100644 --- a/test/ut3_tester_helper/main_helper.pks +++ b/test/ut3_tester_helper/main_helper.pks @@ -36,6 +36,14 @@ create or replace package main_helper is procedure parse_dummy_test_as_ut3$user#; function get_job_count(a_job_name varchar2) return number; - + + procedure append_to_list(a_list in out nocopy ut3.ut_varchar2_list, a_item varchar2); + + procedure append_to_list(a_list in out nocopy ut3.ut_varchar2_rows, a_item varchar2); + + procedure append_to_list(a_list in out nocopy ut3.ut_varchar2_rows, a_item clob); + + procedure append_to_list(a_list in out nocopy ut3.ut_varchar2_rows, a_items ut3.ut_varchar2_rows); + end; / diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index bfc0e1c47..0fad905fd 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -522,6 +522,6 @@ create or replace package body run_helper is begin delete from ut3.ut_output_buffer_tmp; end; - + end; / diff --git a/test/ut3_tester_helper/run_helper.pks b/test/ut3_tester_helper/run_helper.pks index 03d55ec29..7d285d7af 100644 --- a/test/ut3_tester_helper/run_helper.pks +++ b/test/ut3_tester_helper/run_helper.pks @@ -1,6 +1,9 @@ create or replace package run_helper is + g_run_id integer; + type t_out_buff_tab is table of ut3.ut_output_buffer_tmp%rowtype; + type prof_runs_tab is table of ut3.plsql_profiler_runs%rowtype; procedure setup_cache_objects; procedure setup_cache; @@ -49,6 +52,6 @@ create or replace package run_helper is function ut_output_buffer_tmp return t_out_buff_tab pipelined; procedure delete_buffer; - + end; / diff --git a/test/ut3_tester_helper/test_event_list.tps b/test/ut3_tester_helper/test_event_list.tps new file mode 100644 index 000000000..8abf71b13 --- /dev/null +++ b/test/ut3_tester_helper/test_event_list.tps @@ -0,0 +1,2 @@ +create or replace type test_event_list as table of test_event_object; +/ diff --git a/test/ut3_tester_helper/test_event_object.tps b/test/ut3_tester_helper/test_event_object.tps new file mode 100644 index 000000000..da458d2c2 --- /dev/null +++ b/test/ut3_tester_helper/test_event_object.tps @@ -0,0 +1,15 @@ +declare + l_exists integer; +begin + select count(1) into l_exists from user_types where type_name = 'TEST_EVENT_OBJECT'; + if l_exists > 0 then + execute immediate 'drop type test_event_object force'; + end if; +end; +/ + +create or replace type test_event_object as object ( + event_type varchar2(1000), + event_doc xmltype +) +/ \ No newline at end of file diff --git a/test/ut3_user/reporters/test_coverage.pkb b/test/ut3_user/reporters/test_coverage.pkb new file mode 100644 index 000000000..c3617bc55 --- /dev/null +++ b/test/ut3_user/reporters/test_coverage.pkb @@ -0,0 +1,51 @@ +create or replace package body test_coverage is + + function get_mock_run_id return integer is + v_result integer; + begin + return ut3_tester_helper.coverage_helper.get_mock_run_id(); + end; + + procedure create_dummy_coverage_package is + begin + ut3_tester_helper.coverage_helper.create_dummy_coverage_package(); + end; + + procedure create_dummy_coverage_test is + begin + ut3_tester_helper.coverage_helper.create_dummy_coverage_test(); + end; + + procedure mock_coverage_data(a_run_id integer) is + begin + ut3_tester_helper.coverage_helper.mock_coverage_data(a_run_id,user); + end; + + procedure create_dummy_coverage_pkg is + begin + create_dummy_coverage_package(); + create_dummy_coverage_test(); + ut3_tester_helper.coverage_helper.grant_exec_on_cov(); + end; + + procedure setup_dummy_coverage is + pragma autonomous_transaction; + begin + g_run_id := get_mock_run_id(); + ut3.ut_coverage.mock_coverage_id(g_run_id, ut3.ut_coverage.gc_proftab_coverage); + mock_coverage_data(g_run_id); + commit; + end; + + procedure drop_dummy_coverage_pkg is + begin + ut3_tester_helper.coverage_helper.drop_dummy_coverage_pkg(); + end; + + procedure cleanup_dummy_coverage is + begin + ut3_tester_helper.coverage_helper.cleanup_dummy_coverage(g_run_id); + end; + +end; +/ diff --git a/test/ut3_user/reporters/test_coverage.pks b/test/ut3_user/reporters/test_coverage.pks new file mode 100644 index 000000000..d56597d11 --- /dev/null +++ b/test/ut3_user/reporters/test_coverage.pks @@ -0,0 +1,20 @@ +create or replace package test_coverage is + + --%suite + --%suitepath(utplsql.test_user.reporters) + + g_run_id integer; + + --%beforeall + procedure create_dummy_coverage_pkg; + --%beforeall + procedure setup_dummy_coverage; + + + --%afterall + procedure drop_dummy_coverage_pkg; + --%afterall + procedure cleanup_dummy_coverage; + +end; +/ diff --git a/test/ut3_user/reporters/test_debug_reporter.pkb b/test/ut3_user/reporters/test_debug_reporter.pkb new file mode 100644 index 000000000..f108ec577 --- /dev/null +++ b/test/ut3_user/reporters/test_debug_reporter.pkb @@ -0,0 +1,45 @@ +create or replace package body test_debug_reporter as + + g_actual clob; + + procedure run_reporter is + l_results ut3.ut_varchar2_list; + begin + select * + bulk collect into l_results + from table( + ut3.ut.run( + 'test_reporters', + ut3.ut_debug_reporter() + ) + ); + g_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + end; + + procedure includes_event_info is + l_expected varchar2(32767); + begin + l_expected := '\s+' || + '(\s+' || + '[0-9\-]+T[0-9:\.]+<\/TIMESTAMP>\s+' || + '[0-9 \+:\.]+<\/TIME_FROM_START>\s+' || + '[0-9 \+:\.]+<\/TIME_FROM_PREVIOUS>\s+' || + '\w+<\/EVENT_NAME>\s+' || + '(\s|\S)+?<\/CALL_STACK>(\s|\S)+?' || + '<\/DEBUG>\s+)+' || + '<\/DEBUG_LOG>'; + ut.expect( g_actual ).to_match( l_expected, 'm' ); + end; + + procedure includes_run_info is + l_expected varchar2(32767); + begin + l_expected := '(\s|\S)+?(\s|\S)+?<\/UT_RUN_INFO>\s+<\/DEBUG>'; + ut.expect( g_actual ).to_match( l_expected, 'm' ); + end; + + +end; +/ + + diff --git a/test/ut3_user/reporters/test_debug_reporter.pks b/test/ut3_user/reporters/test_debug_reporter.pks new file mode 100644 index 000000000..4d7f7962f --- /dev/null +++ b/test/ut3_user/reporters/test_debug_reporter.pks @@ -0,0 +1,16 @@ +create or replace package test_debug_reporter as + + --%suite(ut_debug_reporter) + --%suitepath(utplsql.test_user.reporters) + + --%beforeall + procedure run_reporter; + + --%test(Includes event info for every event) + procedure includes_event_info; + + --%test(Includes run info) + procedure includes_run_info; + +end; +/ diff --git a/test/ut3_user/reporters/test_documentation_reporter.pkb b/test/ut3_user/reporters/test_documentation_reporter.pkb new file mode 100644 index 000000000..394594fa4 --- /dev/null +++ b/test/ut3_user/reporters/test_documentation_reporter.pkb @@ -0,0 +1 @@ +create or replace package body test_documentation_reporter as procedure report_produces_expected_out is l_results ut3.ut_varchar2_list; l_actual clob; l_expected varchar2(32767):=q'[%org utplsql tests helpers A suite for testing different outcomes from reporters A description of some context passing_test [% sec] a test with failing assertion [% sec] (FAILED - 1) a test raising unhandled exception [% sec] (FAILED - 2) a disabled test [0 sec] (DISABLED) % Failures: % 1) failing_test "Fails as values are different" Actual: 'number [1] ' (varchar2) was expected to equal: 'number [2] ' (varchar2)% at "UT3$USER#.TEST_REPORTERS%", line 36 ut3.ut.expect('number [1] ','Fails as values are different').to_equal('number [2] '); % % 2) erroring_test ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at "UT3$USER#.TEST_REPORTERS", line 44% ORA-06512: at line 6 Finished in % seconds 4 tests, 1 failed, 1 errored, 1 disabled, 0 warning(s)%]'; begin select * bulk collect into l_results from table( ut3.ut.run( 'test_reporters', ut3.ut_documentation_reporter() ) ); l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like(l_expected); end; procedure check_encoding_included is begin reporters.check_xml_encoding_included(ut3.ut_sonar_test_reporter(), 'UTF-8'); end; end; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_documentation_reporter.pks b/test/ut3_user/reporters/test_documentation_reporter.pks new file mode 100644 index 000000000..ec6894c61 --- /dev/null +++ b/test/ut3_user/reporters/test_documentation_reporter.pks @@ -0,0 +1,10 @@ +create or replace package test_documentation_reporter as + + --%suite(ut_documentation_reporter) + --%suitepath(utplsql.test_user.reporters) + + --%test(Report produces expected output) + procedure report_produces_expected_out; + +end; +/ diff --git a/test/ut3_user/reporters/test_extended_coverage.pkb b/test/ut3_user/reporters/test_extended_coverage.pkb new file mode 100644 index 000000000..bb8bd27a6 --- /dev/null +++ b/test/ut3_user/reporters/test_extended_coverage.pkb @@ -0,0 +1,106 @@ +create or replace package body test_extended_coverage is + + g_run_id ut3.ut_coverage.tt_coverage_id_arr; + + function get_mock_block_run_id return integer is + begin + return ut3_tester_helper.coverage_helper.get_mock_block_run_id(); + end; + + function get_mock_proftab_run_id return integer is + begin + return ut3_tester_helper.coverage_helper.get_mock_run_id(); + end; + + procedure setup_dummy_coverage is + pragma autonomous_transaction; + begin + ut3_tester_helper.coverage_helper.create_dummy_12_2_cov_pck(); + ut3_tester_helper.coverage_helper.create_dummy_12_2_cov_test(); + ut3_tester_helper.coverage_helper.grant_exec_on_12_2_cov(); + g_run_id(ut3.ut_coverage.gc_block_coverage) := get_mock_block_run_id(); + g_run_id(ut3.ut_coverage.gc_proftab_coverage) := get_mock_proftab_run_id(); + ut3.ut_coverage.mock_coverage_id(g_run_id); + ut3_tester_helper.coverage_helper.mock_block_coverage_data(g_run_id(ut3.ut_coverage.gc_block_coverage),user); + ut3_tester_helper.coverage_helper.mock_profiler_coverage_data(g_run_id(ut3.ut_coverage.gc_proftab_coverage),user); + commit; + end; + + procedure cleanup_dummy_coverage is + begin + ut3_tester_helper.coverage_helper.cleanup_dummy_coverage(g_run_id(ut3.ut_coverage.gc_block_coverage) + ,g_run_id(ut3.ut_coverage.gc_proftab_coverage)); + end; + + procedure coverage_for_object is + l_expected clob; + l_actual clob; + l_results ut3.ut_varchar2_list; + begin + --Arrange + l_expected := '%%%'; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_block_dummy_coverage', + a_reporter=> ut3.ut_coverage_sonar_reporter( ), + a_include_objects => ut3.ut_varchar2_list( 'ut3.dummy_coverage_package_with_an_amazingly_long_name_that_you_would_not_think_of_in_real_life_project_because_its_simply_too_long' ) + ) + ); + --Assert + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + end; + + procedure coverage_for_schema is + l_expected clob; + l_actual clob; + l_results ut3.ut_varchar2_list; + begin + --Arrange + l_expected := '%%%'; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_block_dummy_coverage', + a_reporter=> ut3.ut_coverage_sonar_reporter( ), + a_coverage_schemes => ut3.ut_varchar2_list( 'ut3' ) + ) + ); + --Assert + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + ut.expect(l_actual).to_be_like('%%%'); + end; + + procedure coverage_for_file is + l_expected clob; + l_actual clob; + l_results ut3.ut_varchar2_list; + l_file_path varchar2(250); + begin + --Arrange + l_file_path := lower('test/ut3.dummy_coverage_package_with_an_amazingly_long_name_that_you_would_not_think_of_in_real_life_project_because_its_simply_too_long.pkb'); + l_expected := '%%%'; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_block_dummy_coverage', + a_reporter=> ut3.ut_coverage_sonar_reporter( ), + a_source_files => ut3.ut_varchar2_list( l_file_path ), + a_test_files => ut3.ut_varchar2_list( ) + ) + ); + --Assert + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + end; + +end; +/ diff --git a/test/ut3_user/reporters/test_extended_coverage.pks b/test/ut3_user/reporters/test_extended_coverage.pks new file mode 100644 index 000000000..fe4a2ecc5 --- /dev/null +++ b/test/ut3_user/reporters/test_extended_coverage.pks @@ -0,0 +1,22 @@ +create or replace package test_extended_coverage is + + --%suite + --%suitepath(utplsql.test_user.reporters.test_coverage) + + --%beforeall + procedure setup_dummy_coverage; + + --%afterall + procedure cleanup_dummy_coverage; + + --%test(Coverage is gathered for specified object - extended coverage type) + procedure coverage_for_object; + + --%test(Coverage is gathered for specified schema - extended coverage type) + procedure coverage_for_schema; + + --%test(Coverage is gathered for specified file - extended coverage type) + procedure coverage_for_file; + +end; +/ diff --git a/test/ut3_user/reporters/test_realtime_reporter.pkb b/test/ut3_user/reporters/test_realtime_reporter.pkb new file mode 100644 index 000000000..6850ed687 --- /dev/null +++ b/test/ut3_user/reporters/test_realtime_reporter.pkb @@ -0,0 +1,401 @@ +create or replace package body test_realtime_reporter as + + g_events ut3_tester_helper.test_event_list := ut3_tester_helper.test_event_list(); + + procedure create_test_suites_and_run is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package check_realtime_reporting1 is + --%suite(suite ) + --%suitepath(realtime_reporting) + + --%context(test context) + + --%test(test 1 - OK) + procedure test_1_ok; + + --%test(test 2 - NOK) + procedure test_2_nok; + + --%endcontext + end;]'; + execute immediate q'[create or replace package body check_realtime_reporting1 is + procedure test_1_ok is + begin + ut3.ut.expect(1).to_equal(1); + end; + + procedure test_2_nok is + begin + ut3.ut.expect(1).to_equal(2); + end; + end;]'; + + execute immediate q'[create or replace package check_realtime_reporting2 is + --%suite + --%suitepath(realtime_reporting) + + --%test + procedure test_3_ok; + + --%test + procedure test_4_nok; + + --%test + --%disabled + procedure test_5; + end;]'; + execute immediate q'[create or replace package body check_realtime_reporting2 is + procedure test_3_ok is + begin + ut3.ut.expect(2).to_equal(2); + end; + + procedure test_4_nok is + begin + ut3.ut.expect(2).to_equal(3); + ut3.ut.expect(2).to_equal(4); + end; + + procedure test_5 is + begin + null; + end; + end;]'; + + execute immediate q'[create or replace package check_realtime_reporting3 is + --%suite + --%suitepath(realtime_reporting) + + --%test + procedure test_6_with_runtime_error; + + --%test + procedure test_7_with_serveroutput; + + --%afterall + procedure print_and_raise; + end;]'; + execute immediate q'[create or replace package body check_realtime_reporting3 is + procedure test_6_with_runtime_error is + l_actual integer; + begin + execute immediate 'select 6 from non_existing_table' into l_actual; + ut3.ut.expect(6).to_equal(l_actual); + end; + + procedure test_7_with_serveroutput is + begin + dbms_output.put_line('before test 7'); + ut3.ut.expect(7).to_equal(7); + dbms_output.put_line('after test 7'); + end; + + procedure print_and_raise is + begin + dbms_output.put_line('Now, a no_data_found exception is raised'); + dbms_output.put_line('dbms_output and error stack is reported for this suite.'); + dbms_output.put_line('A runtime error in afterall is counted as a warning.'); + raise no_data_found; + end; + end;]'; + + <> + declare + l_reporter ut3.ut_realtime_reporter := ut3.ut_realtime_reporter(); + begin + -- produce + ut3.ut_runner.run( + a_paths => ut3.ut_varchar2_list(':realtime_reporting'), + a_reporters => ut3.ut_reporters(l_reporter) + ); + -- consume + select ut3_tester_helper.test_event_object(item_type, xmltype(text)) + bulk collect into g_events + from table(ut3.ut_output_table_buffer(l_reporter.output_buffer.output_id).get_lines()) + where trim(text) is not null and item_type is not null; + end run_report_and_cache_result; + end create_test_suites_and_run; + + procedure xml_report_structure is + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + open l_actual for + select t.event_doc.extract('/event/@type').getstringval() as event_type, + t.event_doc.extract('/event/suite/@id|/event/test/@id').getstringval() as item_id + from table(g_events) t; + open l_expected for + select 'pre-run' as event_type, null as item_id from dual union all + select 'pre-suite' as event_type, 'realtime_reporting' as item_id from dual union all + select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting3' as item_id from dual union all + select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error' as item_id from dual union all + select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error' as item_id from dual union all + select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_7_with_serveroutput' as item_id from dual union all + select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_7_with_serveroutput' as item_id from dual union all + select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting3' as item_id from dual union all + select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting2' as item_id from dual union all + select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_3_ok' as item_id from dual union all + select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_3_ok' as item_id from dual union all + select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_4_nok' as item_id from dual union all + select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_4_nok' as item_id from dual union all + select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_5' as item_id from dual union all + select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_5' as item_id from dual union all + select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting2' as item_id from dual union all + select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting1' as item_id from dual union all + select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting1.test context' as item_id from dual union all + select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_1_ok' as item_id from dual union all + select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_1_ok' as item_id from dual union all + select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_2_nok' as item_id from dual union all + select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_2_nok' as item_id from dual union all + select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting1.test context' as item_id from dual union all + select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting1' as item_id from dual union all + select 'post-suite' as event_type, 'realtime_reporting' as item_id from dual union all + select 'post-run' as event_type, null as item_id from dual; + ut.expect(l_actual).to_equal(l_expected); + end xml_report_structure; + + procedure pre_run_composite_nodes is + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + open l_actual for + select x.node_path + from table(g_events) t, + xmltable( + q'[ + for $i in //(event|items|suite|test) + return {$i/string-join(ancestor-or-self::*/name(.), '/')} + ]' + passing t.event_doc + columns node_path varchar2(128) path '.' + ) x + where event_type = 'pre-run'; + open l_expected for + select 'event' as node_path from dual union all + select 'event/items' as node_path from dual union all + select 'event/items/suite' as node_path from dual union all + select 'event/items/suite/items' as node_path from dual union all + select 'event/items/suite/items/suite' as node_path from dual union all + select 'event/items/suite/items/suite/items' as node_path from dual union all + select 'event/items/suite/items/suite/items/test' as node_path from dual union all + select 'event/items/suite/items/suite/items/test' as node_path from dual union all + select 'event/items/suite/items/suite' as node_path from dual union all + select 'event/items/suite/items/suite/items' as node_path from dual union all + select 'event/items/suite/items/suite/items/test' as node_path from dual union all + select 'event/items/suite/items/suite/items/test' as node_path from dual union all + select 'event/items/suite/items/suite/items/test' as node_path from dual union all + select 'event/items/suite/items/suite' as node_path from dual union all + select 'event/items/suite/items/suite/items' as node_path from dual union all + select 'event/items/suite/items/suite/items/suite' as node_path from dual union all + select 'event/items/suite/items/suite/items/suite/items' as node_path from dual union all + select 'event/items/suite/items/suite/items/suite/items/test' as node_path from dual union all + select 'event/items/suite/items/suite/items/suite/items/test' as node_path from dual; + ut.expect(l_actual).to_equal(l_expected); + end pre_run_composite_nodes; + + procedure total_number_of_tests is + l_actual integer; + l_expected integer := 7; + begin + select t.event_doc.extract('/event/totalNumberOfTests/text()').getnumberval() + into l_actual + from table(g_events) t + where t.event_type = 'pre-run'; + ut.expect(l_actual).to_equal(l_expected); + end total_number_of_tests; + + procedure execution_time_of_run is + l_actual number; + begin + select t.event_doc.extract('/event/run/executionTime/text()').getnumberval() + into l_actual + from table(g_events) t + where t.event_type = 'post-run'; + ut.expect(l_actual).to_be_not_null; + end execution_time_of_run; + + procedure escaped_characters is + l_actual varchar2(32767); + l_expected varchar2(20) := 'suite <A>'; + begin + select t.event_doc.extract( + '//suite[@id="realtime_reporting.check_realtime_reporting1"]/description/text()' + ).getstringval() + into l_actual + from table(g_events) t + where t.event_type = 'pre-run'; + ut.expect(l_actual).to_equal(l_expected); + end escaped_characters; + + procedure pre_test_nodes is + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + open l_actual for + select t.event_doc.extract('//test/testNumber/text()') + .getnumberval() as test_number, + t.event_doc.extract('//test/totalNumberOfTests/text()') + .getnumberval() as total_number_of_tests + from table(g_events) t + where t.event_type = 'pre-test' + and t.event_doc.extract('//test/@id').getstringval() is not null; + open l_expected for + select level as test_number, + 7 as total_number_of_tests + from dual + connect by level <= 7; + ut.expect(l_actual).to_equal(l_expected).unordered; + end pre_test_nodes; + + procedure post_test_nodes is + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + open l_actual for + select t.event_doc.extract('//test/testNumber/text()') + .getnumberval() as test_number, + t.event_doc.extract('//test/totalNumberOfTests/text()') + .getnumberval() as total_number_of_tests + from table(g_events) t + where t.event_type = 'post-test' + and t.event_doc.extract('//test/@id').getstringval() is not null + and t.event_doc.extract('//test/startTime/text()').getstringval() is not null + and t.event_doc.extract('//test/endTime/text()').getstringval() is not null + and t.event_doc.extract('//test/executionTime/text()').getnumberval() is not null + and t.event_doc.extract('//test/counter/disabled/text()').getnumberval() is not null + and t.event_doc.extract('//test/counter/success/text()').getnumberval() is not null + and t.event_doc.extract('//test/counter/failure/text()').getnumberval() is not null + and t.event_doc.extract('//test/counter/error/text()').getnumberval() is not null + and t.event_doc.extract('//test/counter/warning/text()').getnumberval() is not null; + open l_expected for + select level as test_number, + 7 as total_number_of_tests + from dual + connect by level <= 7; + ut.expect(l_actual).to_equal(l_expected).unordered; + end post_test_nodes; + + procedure single_failed_message is + l_actual varchar2(32767); + l_expected varchar2(80) := ''; + begin + select t.event_doc.extract( + '/event/test/failedExpectations/expectation[1]/message/text()' + ).getstringval() + into l_actual + from table(g_events) t + where t.event_doc.extract('/event[@type="post-test"]/test/@id').getstringval() + = 'realtime_reporting.check_realtime_reporting1.test context.test_2_nok'; + ut.expect(l_actual).to_equal(l_expected); + end single_failed_message; + + procedure multiple_failed_messages is + l_actual integer; + l_expected integer := 2; + begin + select count(*) + into l_actual + from table(g_events) t, + xmltable( + '/event/test/failedExpectations/expectation' + passing t.event_doc + columns message clob path 'message', + caller clob path 'caller' + ) x + where t.event_doc.extract('/event[@type="post-test"]/test/@id').getstringval() + = 'realtime_reporting.check_realtime_reporting2.test_4_nok' + and x.message is not null + and x.caller is not null; + ut.expect(l_actual).to_equal(l_expected); + end multiple_failed_messages; + + procedure serveroutput_of_test is + l_actual clob; + l_expected_list ut3.ut_varchar2_list; + l_expected clob; + begin + select t.event_doc.extract('//event/test/serverOutput/text()').getstringval() + into l_actual + from table(g_events) t + where t.event_doc.extract('/event[@type="post-test"]/test/@id').getstringval() + = 'realtime_reporting.check_realtime_reporting3.test_7_with_serveroutput'; + ut3_tester_helper.main_helper.append_to_list(l_expected_list, ''); + l_expected := ut3_tester_helper.main_helper.table_to_clob(l_expected_list); + ut.expect(l_actual).to_equal(l_expected); + end serveroutput_of_test; + + procedure serveroutput_of_testsuite is + l_actual clob; + l_expected_list ut3.ut_varchar2_list; + l_expected clob; + begin + select t.event_doc.extract('//event/suite/serverOutput/text()').getstringval() + into l_actual + from table(g_events) t + where t.event_doc.extract('/event[@type="post-suite"]/suite/@id').getstringval() + = 'realtime_reporting.check_realtime_reporting3'; + ut3_tester_helper.main_helper.append_to_list(l_expected_list, ''); + l_expected := ut3_tester_helper.main_helper.table_to_clob(l_expected_list); + ut.expect(l_actual).to_equal(l_expected); + end serveroutput_of_testsuite; + + procedure error_stack_of_test is + l_actual clob; + l_expected_list ut3.ut_varchar2_list; + l_expected clob; + begin + select t.event_doc.extract('//event/test/errorStack/text()').getstringval() + into l_actual + from table(g_events) t + where t.event_doc.extract('/event[@type="post-test"]/test/@id').getstringval() + = 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error'; + ut3_tester_helper.main_helper.append_to_list(l_expected_list, ''); + l_expected := ut3_tester_helper.main_helper.table_to_clob(l_expected_list); + ut.expect(l_actual).to_be_like(l_expected); + end error_stack_of_test; + + procedure error_stack_of_testsuite is + l_actual clob; + l_expected_list ut3.ut_varchar2_list; + l_expected clob; + begin + select t.event_doc.extract('//event/suite/errorStack/text()').getstringval() + into l_actual + from table(g_events) t + where t.event_doc.extract('/event[@type="post-suite"]/suite/@id').getstringval() + = 'realtime_reporting.check_realtime_reporting3'; + ut3_tester_helper.main_helper.append_to_list(l_expected_list, ''); + l_expected := ut3_tester_helper.main_helper.table_to_clob(l_expected_list); + ut.expect(l_actual).to_be_like(l_expected); + end error_stack_of_testsuite; + + procedure get_description is + l_reporter ut3.ut_realtime_reporter; + l_actual varchar2(4000); + l_expected varchar2(80) := '%SQL Developer%'; + begin + l_reporter := ut3.ut_realtime_reporter(); + l_actual := l_reporter.get_description(); + ut.expect(l_actual).to_be_like(l_expected); + end get_description; + + procedure remove_test_suites is + pragma autonomous_transaction; + begin + execute immediate 'drop package check_realtime_reporting1'; + execute immediate 'drop package check_realtime_reporting2'; + execute immediate 'drop package check_realtime_reporting3'; + end remove_test_suites; + +end test_realtime_reporter; +/ diff --git a/test/ut3_user/reporters/test_realtime_reporter.pks b/test/ut3_user/reporters/test_realtime_reporter.pks new file mode 100644 index 000000000..04cd288e1 --- /dev/null +++ b/test/ut3_user/reporters/test_realtime_reporter.pks @@ -0,0 +1,55 @@ +create or replace package test_realtime_reporter as + + --%suite(ut_realtime_reporter) + --%suitepath(utplsql.test_user.reporters) + + --%beforeall + procedure create_test_suites_and_run; + + --%test(Provide a report structure with pre-run information and event based messages per suite and per test) + procedure xml_report_structure; + + --%test(Provide the total number of tests as part of the pre-run information structure) + procedure total_number_of_tests; + + --%test(Provide composite structure for items, an item is either a suite or a test, suites may have nested items) + procedure pre_run_composite_nodes; + + --%test(Provide the execution time as part of the post-run information structure) + procedure execution_time_of_run; + + --%test(Escape special characters in data such as the test suite description) + procedure escaped_characters; + + --%test(Provide a node before starting a test with testNumber and totalNumberOfTests) + procedure pre_test_nodes; + + --%test(Provide a node after completion of a test with test results) + procedure post_test_nodes; + + --%test(Provide expectation message for a failed test) + procedure single_failed_message; + + --%test(Provide expectation messages for each failed assertion of a failed test) + procedure multiple_failed_messages; + + --%test(Provide dbms_output produced in a test) + procedure serveroutput_of_test; + + --%test(Provide dbms_output produced in a testsuite) + procedure serveroutput_of_testsuite; + + --%test(Provide the error stack of a test) + procedure error_stack_of_test; + + --%test(Provide the error stack of a testsuite) + procedure error_stack_of_testsuite; + + --%test(Provide a description of the reporter explaining the use for SQL Developer) + procedure get_description; + + --%afterall + procedure remove_test_suites; + +end test_realtime_reporter; +/ From e1119c659ca09440414d96ca935c4a2a5f96ca12 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 31 Mar 2019 17:34:50 +0100 Subject: [PATCH 042/181] Split output buffers into two. Now we have separate buffer for CLOB data and VARCHAR2 text data. --- .../output_buffers/ut_output_buffer_tmp.sql | 24 +- .../ut_output_clob_buffer_tmp.sql | 89 ++++++++ .../ut_output_clob_table_buffer.tpb | 214 ++++++++++++++++++ .../ut_output_clob_table_buffer.tps | 32 +++ .../output_buffers/ut_output_table_buffer.tpb | 76 ++++--- .../create_synonyms_and_grants_for_public.sql | 2 + source/create_user_grants.sql | 1 + source/create_user_synonyms.sql | 1 + source/install.sql | 3 + source/reporters/ut_debug_reporter.tpb | 2 +- source/reporters/ut_realtime_reporter.tpb | 2 +- source/uninstall_objects.sql | 6 + .../core/reporters/test_realtime_reporter.pkb | 2 +- test/core/test_output_buffer.pkb | 2 +- 14 files changed, 412 insertions(+), 44 deletions(-) create mode 100644 source/core/output_buffers/ut_output_clob_buffer_tmp.sql create mode 100644 source/core/output_buffers/ut_output_clob_table_buffer.tpb create mode 100644 source/core/output_buffers/ut_output_clob_table_buffer.tps diff --git a/source/core/output_buffers/ut_output_buffer_tmp.sql b/source/core/output_buffers/ut_output_buffer_tmp.sql index e452e769f..d596a4908 100644 --- a/source/core/output_buffers/ut_output_buffer_tmp.sql +++ b/source/core/output_buffers/ut_output_buffer_tmp.sql @@ -24,7 +24,7 @@ begin */ output_id raw(32) not null, message_id number(38,0) not null, - text clob, + text varchar2(4000), item_type varchar2(1000), is_finished number(1,0) default 0 not null, constraint ut_output_buffer_tmp_pk primary key(output_id, message_id), @@ -32,17 +32,19 @@ begin is_finished = 0 and (text is not null or item_type is not null ) or is_finished = 1 and text is null and item_type is null ), constraint ut_output_buffer_fk1 foreign key (output_id) references ut_output_buffer_info_tmp$(output_id) -) nologging initrans 100 +) organization index nologging initrans 100 + overflow nologging initrans 100 '; - begin - execute immediate - v_table_sql || 'lob(text) store as securefile ut_output_text(retention none enable storage in row)'; - exception - when e_non_assm then - execute immediate - v_table_sql || 'lob(text) store as basicfile ut_output_text(pctversion 0 enable storage in row)'; - - end; + execute immediate v_table_sql; +-- begin +-- execute immediate +-- v_table_sql || 'lob(text) store as securefile ut_output_text(retention none enable storage in row)'; +-- exception +-- when e_non_assm then +-- execute immediate +-- v_table_sql || 'lob(text) store as basicfile ut_output_text(pctversion 0 enable storage in row)'; +-- +-- end; end; / diff --git a/source/core/output_buffers/ut_output_clob_buffer_tmp.sql b/source/core/output_buffers/ut_output_clob_buffer_tmp.sql new file mode 100644 index 000000000..57be1c6f4 --- /dev/null +++ b/source/core/output_buffers/ut_output_clob_buffer_tmp.sql @@ -0,0 +1,89 @@ +declare + v_table_sql varchar2(32767); + e_non_assm exception; + pragma exception_init(e_non_assm, -43853); +begin + v_table_sql := 'create table ut_output_clob_buffer_tmp$( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + /* + * This table is not a global temporary table as it needs to allow cross-session data exchange + * It is used however as a temporary table with multiple writers. + * This is why it has very high initrans and has nologging + */ + output_id raw(32) not null, + message_id number(38,0) not null, + text clob, + item_type varchar2(1000), + is_finished number(1,0) default 0 not null, + constraint ut_output_clob_buffer_tmp_pk primary key(output_id, message_id), + constraint ut_output_clob_buffer_tmp_ck check( + is_finished = 0 and (text is not null or item_type is not null ) + or is_finished = 1 and text is null and item_type is null ), + constraint ut_output_clob_buffer_tmp_fk1 foreign key (output_id) references ut_output_buffer_info_tmp$(output_id) +) nologging initrans 100 +'; + begin + execute immediate + v_table_sql || 'lob(text) store as securefile ut_output_text(retention none enable storage in row)'; + exception + when e_non_assm then + execute immediate + v_table_sql || 'lob(text) store as basicfile ut_output_text(pctversion 0 enable storage in row)'; + + end; +end; +/ + +-- This is needed to be EBR ready as editioning view can only be created by edition enabled user +declare + ex_nonedition_user exception; + ex_view_doesnt_exist exception; + pragma exception_init(ex_nonedition_user,-42314); + pragma exception_init(ex_view_doesnt_exist,-942); + v_view_source varchar2(32767); +begin + begin + execute immediate 'drop view ut_output_clob_buffer_tmp'; + exception + when ex_view_doesnt_exist then + null; + end; + v_view_source := ' ut_output_clob_buffer_tmp as +/* +utPLSQL - Version 3 +Copyright 2016 - 2018 utPLSQL Project +Licensed under the Apache License, Version 2.0 (the "License"): +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +select output_id + ,message_id + ,text + ,item_type + ,is_finished + from ut_output_clob_buffer_tmp$'; + + execute immediate 'create or replace editioning view '||v_view_source; +exception + when ex_nonedition_user then + execute immediate 'create or replace view '||v_view_source; +end; +/ diff --git a/source/core/output_buffers/ut_output_clob_table_buffer.tpb b/source/core/output_buffers/ut_output_clob_table_buffer.tpb new file mode 100644 index 000000000..7b97c70ca --- /dev/null +++ b/source/core/output_buffers/ut_output_clob_table_buffer.tpb @@ -0,0 +1,214 @@ +create or replace type body ut_output_clob_table_buffer is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + constructor function ut_output_clob_table_buffer(self in out nocopy ut_output_clob_table_buffer, a_output_id raw := null) return self as result is + begin + self.output_id := coalesce(a_output_id, sys_guid()); + self.start_date := sysdate; + self.last_message_id := 0; + self.init(); + self.cleanup_buffer(); + return; + end; + + overriding member procedure init(self in out nocopy ut_output_clob_table_buffer) is + pragma autonomous_transaction; + l_exists int; + begin + select count(*) into l_exists from ut_output_buffer_info_tmp where output_id = self.output_id; + if ( l_exists > 0 ) then + update ut_output_buffer_info_tmp set start_date = self.start_date where output_id = self.output_id; + else + insert into ut_output_buffer_info_tmp(output_id, start_date) values (self.output_id, self.start_date); + end if; + commit; + end; + + overriding member procedure close(self in out nocopy ut_output_clob_table_buffer) is + pragma autonomous_transaction; + begin + self.last_message_id := self.last_message_id + 1; + insert into ut_output_clob_buffer_tmp(output_id, message_id, is_finished) + values (self.output_id, self.last_message_id, 1); + commit; + 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 + if a_text is not null or a_item_type is not null then + self.last_message_id := self.last_message_id + 1; + 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; + 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 + 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; + self.last_message_id := self.last_message_id + a_text_list.count; + 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 + if a_text is not null and a_text != empty_clob() or a_item_type is not null then + self.last_message_id := self.last_message_id + 1; + 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; + 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; + l_already_waited_for number(10,2) := 0; + l_finished boolean := false; + lc_init_wait_sec constant naturaln := coalesce(a_initial_timeout, 60 ); -- 1 minute + lc_max_wait_sec constant naturaln := coalesce(a_timeout_sec, 60 * 60 * 4); -- 4 hours + l_wait_for integer := lc_init_wait_sec; + lc_short_sleep_time constant number(1,1) := 0.1; --sleep for 100 ms between checks + lc_long_sleep_time constant number(1) := 1; --sleep for 1 s when waiting long + lc_long_wait_time constant number(1) := 1; --waiting more than 1 sec + l_sleep_time number(2,1) := lc_short_sleep_time; + lc_bulk_limit constant integer := 5000; + l_max_message_id integer := lc_bulk_limit; + + procedure remove_read_data(a_message_rowids t_rowid_tab) is + pragma autonomous_transaction; + begin + forall i in 1 .. a_message_rowids.count + delete from ut_output_clob_buffer_tmp a + where rowid = a_message_rowids(i); + commit; + end; + + procedure remove_buffer_info is + pragma autonomous_transaction; + begin + delete from ut_output_buffer_info_tmp a + where a.output_id = self.output_id; + commit; + end; + + begin + while not l_finished loop + 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 + if l_buffer_data.count = 0 then + $if dbms_db_version.version >= 18 $then + dbms_session.sleep(l_sleep_time); + $else + dbms_lock.sleep(l_sleep_time); + $end + l_already_waited_for := l_already_waited_for + l_sleep_time; + 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 + l_wait_for := lc_max_wait_sec; + l_already_waited_for := 0; + l_sleep_time := lc_short_sleep_time; + for i in 1 .. l_buffer_data.count loop + if l_buffer_data(i).text is not null then + pipe row(l_buffer_data(i)); + elsif l_finished_flags(i) = 1 then + l_finished := true; + exit; + end if; + end loop; + remove_read_data(l_message_rowids); + l_max_message_id := l_max_message_id + lc_bulk_limit; + end if; + if l_finished or l_already_waited_for >= l_wait_for then + remove_buffer_info(); + if l_already_waited_for > 0 and l_already_waited_for >= l_wait_for then + 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; + return; + end; + + overriding member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor is + l_lines sys_refcursor; + begin + open l_lines for + select text, item_type + from table(self.get_lines(a_initial_timeout, a_timeout_sec)); + return l_lines; + end; + + overriding member procedure lines_to_dbms_output(self in ut_output_clob_table_buffer, 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 + l_data := self.get_lines_cursor(a_initial_timeout, a_timeout_sec); + loop + fetch l_data into l_clob, l_item_type; + exit when l_data%notfound; + l_lines := ut_utils.clob_to_table(l_clob); + for i in 1 .. l_lines.count loop + dbms_output.put_line(l_lines(i)); + end loop; + end loop; + close l_data; + end; + + member procedure cleanup_buffer(self in ut_output_clob_table_buffer, a_retention_time_sec natural := null) is + gc_buffer_retention_sec constant naturaln := coalesce(a_retention_time_sec, 60 * 60 * 24); -- 24 hours + l_retention_days number := gc_buffer_retention_sec / (60 * 60 * 24); + l_max_retention_date date := sysdate - l_retention_days; + pragma autonomous_transaction; + begin + delete from ut_output_clob_buffer_tmp t + where t.output_id + in (select i.output_id from ut_output_buffer_info_tmp i where i.start_date <= l_max_retention_date); + + delete from ut_output_buffer_info_tmp i where i.start_date <= l_max_retention_date; + commit; + end; + +end; +/ diff --git a/source/core/output_buffers/ut_output_clob_table_buffer.tps b/source/core/output_buffers/ut_output_clob_table_buffer.tps new file mode 100644 index 000000000..83e342106 --- /dev/null +++ b/source/core/output_buffers/ut_output_clob_table_buffer.tps @@ -0,0 +1,32 @@ +create or replace type ut_output_clob_table_buffer under ut_output_buffer_base ( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + start_date date, + last_message_id number(38,0), + 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, + overriding member procedure init(self in out nocopy ut_output_clob_table_buffer), + overriding member procedure send_line(self in out nocopy ut_output_clob_table_buffer, a_text varchar2, a_item_type varchar2 := null), + 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), + overriding member procedure send_clob(self in out nocopy ut_output_clob_table_buffer, a_text clob, a_item_type varchar2 := null), + overriding member procedure close(self in out nocopy ut_output_clob_table_buffer), + overriding member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined, + overriding member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor, + overriding member procedure lines_to_dbms_output(self in ut_output_clob_table_buffer, a_initial_timeout natural := null, a_timeout_sec natural := null), + member procedure cleanup_buffer(self in ut_output_clob_table_buffer, a_retention_time_sec natural := null) +) not final +/ diff --git a/source/core/output_buffers/ut_output_table_buffer.tpb b/source/core/output_buffers/ut_output_table_buffer.tpb index 5a9bdcce7..2b29e8ee5 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_table_buffer.tpb @@ -52,11 +52,20 @@ create or replace type body ut_output_table_buffer is pragma autonomous_transaction; begin if a_text is not null or a_item_type is not null then - 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); + 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; - commit; 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 @@ -74,17 +83,25 @@ create or replace type body ut_output_table_buffer is pragma autonomous_transaction; begin if a_text is not null and a_text != empty_clob() or a_item_type is not null then - 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); + 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; - 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_buffer_data ut_varchar2_rows; + l_item_types ut_varchar2_rows; l_finished_flags ut_integer_list; l_already_waited_for number(10,2) := 0; l_finished boolean := false; @@ -98,13 +115,25 @@ create or replace type body ut_output_table_buffer is lc_bulk_limit constant integer := 5000; l_max_message_id integer := lc_bulk_limit; - procedure remove_read_data(a_message_rowids t_rowid_tab) is + 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 - forall i in 1 .. a_message_rowids.count - delete from ut_output_buffer_tmp a - where rowid = a_message_rowids(i); + 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; commit; + end; procedure remove_buffer_info is @@ -117,17 +146,7 @@ create or replace type body ut_output_table_buffer is begin while not l_finished loop - with ordered_buffer as ( - select /*+ index(a) */ a.rowid, ut_output_data_row(a.text, a.item_type), is_finished - from ut_output_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; - + 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 if l_buffer_data.count = 0 then $if dbms_db_version.version >= 18 $then @@ -146,14 +165,13 @@ create or replace type body ut_output_table_buffer is l_already_waited_for := 0; l_sleep_time := lc_short_sleep_time; for i in 1 .. l_buffer_data.count loop - if l_buffer_data(i).text is not null then - pipe row(l_buffer_data(i)); + if l_buffer_data(i) is not null then + pipe row(ut_output_data_row(l_buffer_data(i),l_item_types(i))); elsif l_finished_flags(i) = 1 then l_finished := true; exit; end if; end loop; - remove_read_data(l_message_rowids); l_max_message_id := l_max_message_id + lc_bulk_limit; end if; if l_finished or l_already_waited_for >= l_wait_for then diff --git a/source/create_synonyms_and_grants_for_public.sql b/source/create_synonyms_and_grants_for_public.sql index dcc940737..609d78ccf 100644 --- a/source/create_synonyms_and_grants_for_public.sql +++ b/source/create_synonyms_and_grants_for_public.sql @@ -74,6 +74,7 @@ grant execute on &&ut3_owner..ut_coverage_options to public; grant execute on &&ut3_owner..ut_coverage_helper to public; grant execute on &&ut3_owner..ut_output_buffer_base to public; grant execute on &&ut3_owner..ut_output_table_buffer to public; +grant execute on &&ut3_owner..ut_output_clob_table_buffer to public; grant execute on &&ut3_owner..ut_file_mappings to public; grant execute on &&ut3_owner..ut_file_mapping to public; grant execute on &&ut3_owner..ut_file_mapper to public; @@ -154,6 +155,7 @@ create public synonym ut_coverage_options for &&ut3_owner..ut_coverage_options; create public synonym ut_coverage_helper for &&ut3_owner..ut_coverage_helper; create public synonym ut_output_buffer_base for &&ut3_owner..ut_output_buffer_base; create public synonym ut_output_table_buffer for &&ut3_owner..ut_output_table_buffer; +create public synonym ut_output_clob_table_buffer for &&ut3_owner..ut_output_clob_table_buffer; create public synonym ut_file_mappings for &&ut3_owner..ut_file_mappings; create public synonym ut_file_mapping for &&ut3_owner..ut_file_mapping; create public synonym ut_file_mapper for &&ut3_owner..ut_file_mapper; diff --git a/source/create_user_grants.sql b/source/create_user_grants.sql index feab90933..7aa5deb39 100644 --- a/source/create_user_grants.sql +++ b/source/create_user_grants.sql @@ -95,6 +95,7 @@ grant execute on &&ut3_owner..ut_output_buffer_base to &ut3_user; grant execute on &&ut3_owner..ut_output_data_row to &ut3_user; grant execute on &&ut3_owner..ut_output_data_rows to &ut3_user; grant execute on &&ut3_owner..ut_output_table_buffer to &ut3_user; +grant execute on &&ut3_owner..ut_output_clob_table_buffer to &ut3_user; grant execute on &&ut3_owner..ut_file_mappings to &ut3_user; grant execute on &&ut3_owner..ut_file_mapping to &ut3_user; grant execute on &&ut3_owner..ut_file_mapper to &ut3_user; diff --git a/source/create_user_synonyms.sql b/source/create_user_synonyms.sql index b08cb7b0e..cb2f7ab67 100644 --- a/source/create_user_synonyms.sql +++ b/source/create_user_synonyms.sql @@ -97,6 +97,7 @@ create or replace synonym &ut3_user..ut_coverage_options for &&ut3_owner..ut_cov create or replace synonym &ut3_user..ut_coverage_helper for &&ut3_owner..ut_coverage_helper; create or replace synonym &ut3_user..ut_output_buffer_base for &&ut3_owner..ut_output_buffer_base; create or replace synonym &ut3_user..ut_output_table_buffer for &&ut3_owner..ut_output_table_buffer; +create or replace synonym &ut3_user..ut_output_clob_table_buffer for &&ut3_owner..ut_output_clob_table_buffer; create or replace synonym &ut3_user..ut_file_mappings for &&ut3_owner..ut_file_mappings; create or replace synonym &ut3_user..ut_file_mapping for &&ut3_owner..ut_file_mapping; create or replace synonym &ut3_user..ut_file_mapper for &&ut3_owner..ut_file_mapper; diff --git a/source/install.sql b/source/install.sql index 08a5b59d7..728f4349f 100644 --- a/source/install.sql +++ b/source/install.sql @@ -99,9 +99,12 @@ alter session set current_schema = &&ut3_owner; --output buffer table @@install_component.sql 'core/output_buffers/ut_output_buffer_info_tmp.sql' @@install_component.sql 'core/output_buffers/ut_output_buffer_tmp.sql' +@@install_component.sql 'core/output_buffers/ut_output_clob_buffer_tmp.sql' --output buffer table api @@install_component.sql 'core/output_buffers/ut_output_table_buffer.tps' @@install_component.sql 'core/output_buffers/ut_output_table_buffer.tpb' +@@install_component.sql 'core/output_buffers/ut_output_clob_table_buffer.tps' +@@install_component.sql 'core/output_buffers/ut_output_clob_table_buffer.tpb' @@install_component.sql 'core/types/ut_output_reporter_base.tps' diff --git a/source/reporters/ut_debug_reporter.tpb b/source/reporters/ut_debug_reporter.tpb index 186290296..f22e8748b 100644 --- a/source/reporters/ut_debug_reporter.tpb +++ b/source/reporters/ut_debug_reporter.tpb @@ -18,7 +18,7 @@ create or replace type body ut_debug_reporter is constructor function ut_debug_reporter(self in out nocopy ut_debug_reporter) return self as result is begin - self.init($$plsql_unit); + self.init($$plsql_unit,ut_output_clob_table_buffer()); self.start_time := current_timestamp(); self.event_time := current_timestamp(); return; diff --git a/source/reporters/ut_realtime_reporter.tpb b/source/reporters/ut_realtime_reporter.tpb index e712c8f85..7c674cc7d 100644 --- a/source/reporters/ut_realtime_reporter.tpb +++ b/source/reporters/ut_realtime_reporter.tpb @@ -20,7 +20,7 @@ create or replace type body ut_realtime_reporter is self in out nocopy ut_realtime_reporter ) return self as result is begin - self.init($$plsql_unit); + self.init($$plsql_unit,ut_output_clob_table_buffer()); total_number_of_tests := 0; current_test_number := 0; current_indent := 0; diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index ed84aa0a0..3599549a3 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -247,12 +247,18 @@ drop type ut_suite_item force; drop type ut_output_table_buffer force; +drop type ut_output_clob_table_buffer force; + drop type ut_output_buffer_base force; drop view ut_output_buffer_tmp; drop table ut_output_buffer_tmp$ purge; +drop view ut_output_clob_buffer_tmp; + +drop table ut_output_clob_buffer_tmp$ purge; + drop view ut_output_buffer_info_tmp; drop table ut_output_buffer_info_tmp$; diff --git a/test/core/reporters/test_realtime_reporter.pkb b/test/core/reporters/test_realtime_reporter.pkb index c4ceb9d5d..2267e9c41 100644 --- a/test/core/reporters/test_realtime_reporter.pkb +++ b/test/core/reporters/test_realtime_reporter.pkb @@ -112,7 +112,7 @@ create or replace package body test_realtime_reporter as -- consume select test_event_object(item_type, xmltype(text)) bulk collect into g_events - from table(ut3.ut_output_table_buffer(l_reporter.output_buffer.output_id).get_lines()) + from table(l_reporter.get_lines()) where trim(text) is not null and item_type is not null; end run_report_and_cache_result; end create_test_suites_and_run; diff --git a/test/core/test_output_buffer.pkb b/test/core/test_output_buffer.pkb index 848824ea8..79e88f8d8 100644 --- a/test/core/test_output_buffer.pkb +++ b/test/core/test_output_buffer.pkb @@ -9,7 +9,7 @@ create or replace package body test_output_buffer is l_buffer ut3.ut_output_buffer_base; begin --Arrange - l_buffer := ut3.ut_output_table_buffer(); + l_buffer := ut3.ut_output_clob_table_buffer(); l_expected_text := to_clob(lpad('a text', 31000, ',a text')) || chr(10) || to_clob(lpad('a text', 31000, ',a text')) || chr(13) || to_clob(lpad('a text', 31000, ',a text')) From 620fd6186050f0a676117636aeb8a8c2ea423a3a Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sun, 31 Mar 2019 17:42:06 +0100 Subject: [PATCH 043/181] Adding extra tests: reporters/test_coverage/test_cov_cobertura_reporter reporters/test_coverage/test_coverage_sonar_reporter reporters/test_coverage/test_coveralls_reporter reporters/test_coverage/test_html_extended_reporter --- test/install_ut3_user_tests.sql | 9 ++ .../test_cov_cobertura_reporter.pkb | 45 ++++++++++ .../test_cov_cobertura_reporter.pks | 10 +++ .../test_coverage_sonar_reporter.pkb | 39 ++++++++ .../test_coverage_sonar_reporter.pks | 13 +++ .../test_coverage/test_coveralls_reporter.pkb | 90 +++++++++++++++++++ .../test_coverage/test_coveralls_reporter.pks | 13 +++ .../test_html_extended_reporter.pkb | 29 ++++++ .../test_html_extended_reporter.pks | 10 +++ 9 files changed, 258 insertions(+) create mode 100644 test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb create mode 100644 test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks create mode 100644 test/ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pkb create mode 100644 test/ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pks create mode 100644 test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pkb create mode 100644 test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pks create mode 100644 test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pkb create mode 100644 test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pks diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index 5da99d802..688937a09 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -31,7 +31,12 @@ prompt Install user tests @@ut3_user/reporters/test_coverage.pks set define on @@install_above_12_1.sql 'ut3_user/reporters/test_extended_coverage.pks' +@@install_above_12_1.sql 'ut3_user/reporters/test_coverage/test_html_extended_reporter.pks' set define off +@@ut3_user/reporters/test_coverage/test_coveralls_reporter.pks +@@ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks +@@ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pks + --set define on --@@install_below_12_2.sql 'ut3_user/reporters/test_proftag_coverage.pks' @@ -64,7 +69,11 @@ set define off @@ut3_user/reporters/test_coverage.pkb set define on @@install_above_12_1.sql 'ut3_user/reporters/test_extended_coverage.pkb' +@@install_above_12_1.sql 'ut3_user/reporters/test_coverage/test_html_extended_reporter.pkb' set define off +@@ut3_user/reporters/test_coverage/test_coveralls_reporter.pkb +@@ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb +@@ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pkb --set define on --@@install_below_12_2.sql 'ut3_user/reporters/test_coverage.pkb' diff --git a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb new file mode 100644 index 000000000..ecfb66340 --- /dev/null +++ b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb @@ -0,0 +1,45 @@ +create or replace package body test_cov_cobertura_reporter is + + procedure report_on_file is + l_results ut3.ut_varchar2_list; + l_expected clob; + l_actual clob; + begin + --Arrange + l_expected := + q'[ + + + +test/ut3.dummy_coverage.pkb + + + + + + + + + + + + +]'; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_dummy_coverage', + a_reporter=> ut3.ut_coverage_cobertura_reporter( ), + a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage.pkb' ), + a_test_files => ut3.ut_varchar2_list( ) + ) + ); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like(l_expected); + end; + +end; +/ diff --git a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks new file mode 100644 index 000000000..365815964 --- /dev/null +++ b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks @@ -0,0 +1,10 @@ +create or replace package test_cov_cobertura_reporter is + + --%suite(ut_cov_cobertura_reporter) + --%suitepath(utplsql.test_user.reporters.test_coverage) + + --%test(reports on a project file mapped to database object) + procedure report_on_file; + +end test_cov_cobertura_reporter; +/ diff --git a/test/ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pkb b/test/ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pkb new file mode 100644 index 000000000..5cd53a093 --- /dev/null +++ b/test/ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pkb @@ -0,0 +1,39 @@ +create or replace package body test_coverage_sonar_reporter is + + procedure report_on_file is + l_results ut3.ut_varchar2_list; + l_expected clob; + l_actual clob; + begin + --Arrange + l_expected := ' + + + + + + +'; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_dummy_coverage', + a_reporter=> ut3.ut_coverage_sonar_reporter( ), + a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage.pkb' ), + a_test_files => ut3.ut_varchar2_list( ) + ) + ); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_equal(l_expected); + end; + + procedure check_encoding_included is + begin + reporters.check_xml_encoding_included(ut3.ut_coverage_sonar_reporter(), 'UTF-8'); + end; + +end; +/ diff --git a/test/ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pks b/test/ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pks new file mode 100644 index 000000000..7a98355cf --- /dev/null +++ b/test/ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pks @@ -0,0 +1,13 @@ +create or replace package test_coverage_sonar_reporter is + + --%suite(ut_coverge_sonar_reporter) + --%suitepath(utplsql.test_user.reporters.test_coverage) + + --%test(reports on a project file mapped to database object) + procedure report_on_file; + + --%test(Includes XML header with encoding when encoding provided) + procedure check_encoding_included; + +end; +/ diff --git a/test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pkb b/test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pkb new file mode 100644 index 000000000..0be0e8ce3 --- /dev/null +++ b/test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pkb @@ -0,0 +1,90 @@ +create or replace package body test_coveralls_reporter is + + procedure report_on_file is + l_results ut3.ut_varchar2_list; + l_expected clob; + l_actual clob; + begin + --Arrange + l_expected := q'[{"source_files":[ +{ "name": "test/ut3.dummy_coverage.pkb", +"coverage": [ +null, +null, +null, +1, +0, +null, +1 +] +} +]} + ]'; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_dummy_coverage', + a_reporter=> ut3.ut_coveralls_reporter( ), + a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage.pkb' ), + a_test_files => ut3.ut_varchar2_list( ) + ) + ); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_equal(l_expected); + end; + + procedure report_zero_coverage is + l_results ut3.ut_varchar2_list; + l_expected clob; + l_actual clob; + pragma autonomous_transaction; + begin + --Arrange + l_expected := q'[{"source_files":[ +{ "name": "ut3.dummy_coverage", +"coverage": [ +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0 +] +} +]} + ]'; + + test_coverage.cleanup_dummy_coverage; + + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + 'ut3.test_dummy_coverage', + ut3.ut_coveralls_reporter(), + a_include_objects => ut3.ut_varchar2_list('UT3.DUMMY_COVERAGE') + ) + ); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_equal(l_expected); + + test_coverage.setup_dummy_coverage; + + end; + +end; +/ diff --git a/test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pks b/test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pks new file mode 100644 index 000000000..d958b8f12 --- /dev/null +++ b/test/ut3_user/reporters/test_coverage/test_coveralls_reporter.pks @@ -0,0 +1,13 @@ +create or replace package test_coveralls_reporter is + + --%suite(ut_coveralls_reporter) + --%suitepath(utplsql.test_user.reporters.test_coverage) + + --%test(reports on a project file mapped to database object) + procedure report_on_file; + + --%test(reports zero coverage on each line of non-executed database object) + procedure report_zero_coverage; + +end; +/ diff --git a/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pkb b/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pkb new file mode 100644 index 000000000..36a6be015 --- /dev/null +++ b/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pkb @@ -0,0 +1,29 @@ +create or replace package body test_html_extended_reporter is + + procedure report_on_file is + l_results ut3.ut_varchar2_list; + l_expected varchar2(32767); + l_actual clob; + l_charset varchar2(100) := 'ISO-8859-1'; + begin + --Arrange + l_expected := '%%

UT3.DUMMY_COVERAGE_PACKAGE_WITH_AN_AMAZINGLY_LONG_NAME_THAT_YOU_WOULD_NOT_THINK_OF_IN_REAL_LIFE_PROJECT_BECAUSE_ITS_SIMPLY_TOO_LONG

%4 relevant lines. 3 lines covered (including 1 lines partially covered ) and 1 lines missed%'; + + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_dummy_coverage', + a_reporter=> ut3.ut_coverage_html_reporter(), + a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage_package_with_an_amazingly_long_name_that_you_would_not_think_of_in_real_life_project_because_its_simply_too_long.pkb' ), + a_test_files => ut3.ut_varchar2_list( ), + a_client_character_set => l_charset + ) + ); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like(l_expected); + end; + +end test_html_extended_reporter; +/ diff --git a/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pks b/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pks new file mode 100644 index 000000000..3158b3777 --- /dev/null +++ b/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pks @@ -0,0 +1,10 @@ +create or replace package test_html_extended_reporter is + + --%suite(ut_html_extended_reporter) + --%suitepath(utplsql.test_user.reporters.test_coverage.test_extended_coverage) + + --%test(reports on a project file mapped to database object in extended profiler coverage) + procedure report_on_file; + +end test_html_extended_reporter; +/ From 951780804780760ebb5a02172e026277f7b103ad Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 31 Mar 2019 23:50:03 +0100 Subject: [PATCH 044/181] Updated documentation for random order of test execution --- docs/userguide/running-unit-tests.md | 111 ++++++++++++++++++++++----- 1 file changed, 90 insertions(+), 21 deletions(-) diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 4abe304b5..a6c4163d0 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -47,6 +47,7 @@ The examples below illustrate different ways and options to invoke `ut.run` proc ```sql alter session set current_schema=hr; +set serveroutput on begin ut.run(); end; @@ -55,6 +56,7 @@ Executes all tests in current schema (_HR_). ```sql +set serveroutput on begin ut.run('HR'); end; @@ -63,6 +65,7 @@ Executes all tests in specified schema (_HR_). ```sql +set serveroutput on begin ut.run('hr:com.my_org.my_project'); end; @@ -73,6 +76,7 @@ Check the [annotations documentation](annotations.md) to find out about suitepat ```sql +set serveroutput on begin ut.run('hr.test_apply_bonus'); end; @@ -81,6 +85,7 @@ Executes all tests from package _hr.test_apply_bonus_. ```sql +set serveroutput on begin ut.run('hr.test_apply_bonus.bonus_cannot_be_negative'); end; @@ -89,6 +94,7 @@ Executes single test procedure _hr.test_apply_bonus.bonus_cannot_be_negative_. ```sql +set serveroutput on begin ut.run(ut_varchar2_list('hr.test_apply_bonus','cust')); end; @@ -96,6 +102,7 @@ end; Executes all tests from package _hr.test_apply_bonus_ and all tests from schema _cust_. ```sql +set serveroutput on begin ut.run(ut_varchar2_list('hr.test_apply_bonus,cust)'); end; @@ -104,6 +111,7 @@ end; Executes all tests from package _hr.test_apply_bonus_ and all tests from schema _cust_. ```sql +set serveroutput on begin ut.run('hr.test_apply_bonus,cust'); end; @@ -124,6 +132,7 @@ The `ut.run` procedures and functions accept `a_reporter` attribute that defines You can execute any set of tests with any of the predefined reporters. ```sql +set serveroutput on begin ut.run('hr.test_apply_bonus', ut_junit_reporter()); end; @@ -133,26 +142,6 @@ Executes all tests from package _HR.TEST_APPLY_BONUS_ and provide outputs to DBM For details on build-in reporters look at [reporters documentation](reporters.md). -## Keeping uncommited data after test-run - -utPLSQL by default runs tests in autonomous transaction and performs automatic rollback to assure that tests do not impact one-another and do not have impact on the current session in your IDE. - -If you would like to keep your uncommited data persisted after running tests, you can do so by using `a_force_manual_rollback` flag. -Setting this flag to true has following side-effects: - -- test execution is done in current transaction - if while running tests commit or rollback is issued your current session data will get commited too. -- automatic rollback is forced to be disabled in test-run even if it was explicitly enabled by using annotation `--%rollback(manual) - -Example invocation: -```sql -begin - ut.run('hr.test_apply_bonus', a_force_manual_rollback => true); -end; -``` - - -This option is not anvailable when running tests using `ut.run` as a table function. - ## ut.run functions The `ut.run` functions provide exactly the same functionality as the `ut.run` procedures. @@ -160,6 +149,10 @@ You may use the same sets of parameters with both functions and procedures. The only difference is the output of the results. Functions provide output as a pipelined stream and therefore need to be executed as select statements. +**Note:** +>When running tests with `ut.run` functions, whole test run is executed as autonomous transaction. +At the end of the run, the transaction is automatically rolled-back and all uncommitted changes are reverted. + Example. ```sql select * from table(ut.run('hr.test_apply_bonus', ut_junit_reporter())); @@ -180,7 +173,83 @@ The concept is pretty simple. - as a separate thread, start `ut_runner.run` and pass reporters with previously defined output_ids. - for each reporter start a separate thread and read outputs from the `ut_output_buffer.get_lines` table function by providing the output_id defined in the main thread. -# Reports characterset encoding +# Order of test execution + +## Default order + +When unit tests are executed without random order, they are ordered by: +- schema name +- suite path or test package name if `--%suitepath` was not specified for that package +- `--%test` line number in package + +## Random order + +You can force a test run to execute tests in random order by providing one of options to `ut.run`: +- `a_random_test_order` - true/false for procedures and 1/0 for functions +- `a_random_test_order_seed` - positive number in range of 1 .. 1 000 000 000 + +When tests are executed with random order, randomization is applied to single level of suitepath hierarchy tree. +This is needed to maintain visibility and accessibility of common setup/cleanup `beforeall`/`afterall` in tests. + +Example: +```sql +set serveroutput on +begin + ut.run('hr.test_apply_bonus', a_random_test_order => true); +end; +``` + +```sql +select * from table(ut.run('hr.test_apply_bonus', a_random_test_order => 1)); +``` + +When running with random order, the default report (`ut_documentation_reporter`) will include information about the random test run seed. +Example output: +``` +... +Finished in .12982 seconds +35 tests, 0 failed, 0 errored, 1 disabled, 0 warning(s) +Tests were executed with random order seed '302980531'. +``` + +If you want to re-run tests using previously generated seed, you may do so by running them with parameter `a_random_test_order_seed` +Example: +```sql +set serveroutput on +begin + ut.run('hr.test_apply_bonus', a_random_test_order_seed => 302980531); +end; +``` + +```sql +select * from table(ut.run('hr.test_apply_bonus', a_random_test_order_seed => 302980531)); +``` + +**Note** +>Random order seed must be a positive number within range of 1 .. 1 000 000 000. + +# Keeping uncommitted data after test-run + +utPLSQL by default runs tests in autonomous transaction and performs automatic rollback to assure that tests do not impact one-another and do not have impact on the current session in your IDE. + +If you would like to keep your uncommitted data persisted after running tests, you can do so by using `a_force_manual_rollback` flag. +Setting this flag to true has following side-effects: + +- test execution is done in current transaction - if while running tests commit or rollback is issued your current session data will get commited too. +- automatic rollback is forced to be disabled in test-run even if it was explicitly enabled by using annotation `--%rollback(manual) + +Example invocation: +```sql +set serveroutput on +begin + ut.run('hr.test_apply_bonus', a_force_manual_rollback => true); +end; +``` + +**Note:** +>This option is not available when running tests using `ut.run` as a table function. + +# Reports character-set encoding To get properly encoded reports, when running utPLSQL with HTML/XML reports on data containing national characters you need to provide your client character set when calling `ut.run` functions and procedures. From c508e7937d8c56c25ed3723d29b78fc3bfdf61d0 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 1 Apr 2019 07:43:07 +0100 Subject: [PATCH 045/181] Adding tests: reporters/test_coverage reporters/test_coverage/test_html_proftab_reporter reporters/test_proftab_coverage --- test/install_ut3_user_tests.sql | 18 +-- test/ut3_tester/core.pkb | 1 + test/ut3_tester_helper/coverage_helper.pkb | 60 ++++++++ test/ut3_tester_helper/coverage_helper.pks | 5 +- test/ut3_user/reporters/test_coverage.pkb | 19 +-- .../test_html_proftab_reporter.pkb | 29 ++++ .../test_html_proftab_reporter.pks | 10 ++ .../reporters/test_proftab_coverage.pkb | 143 ++++++++++++++++++ .../reporters/test_proftab_coverage.pks | 27 ++++ 9 files changed, 284 insertions(+), 28 deletions(-) create mode 100644 test/ut3_user/reporters/test_coverage/test_html_proftab_reporter.pkb create mode 100644 test/ut3_user/reporters/test_coverage/test_html_proftab_reporter.pks create mode 100644 test/ut3_user/reporters/test_proftab_coverage.pkb create mode 100644 test/ut3_user/reporters/test_proftab_coverage.pks diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index 688937a09..3f499a494 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -36,13 +36,12 @@ set define off @@ut3_user/reporters/test_coverage/test_coveralls_reporter.pks @@ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks @@ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pks +set define on +@@install_below_12_2.sql 'ut3_user/reporters/test_proftab_coverage.pks' +@@install_below_12_2.sql 'ut3_user/reporters/test_coverage/test_html_proftab_reporter.pks' +set define off ---set define on ---@@install_below_12_2.sql 'ut3_user/reporters/test_proftag_coverage.pks' ---@@install_below_12_2.sql 'ut3_user/reporters/test_coverage/test_html_proftab_reporter.pks' ---set define off - @@ut3_user/expectations/unary/test_expect_not_to_be_null.pkb @@ut3_user/expectations/unary/test_expect_to_be_null.pkb @@ut3_user/expectations/unary/test_expect_to_be_empty.pkb @@ -74,11 +73,10 @@ set define off @@ut3_user/reporters/test_coverage/test_coveralls_reporter.pkb @@ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb @@ut3_user/reporters/test_coverage/test_coverage_sonar_reporter.pkb - ---set define on ---@@install_below_12_2.sql 'ut3_user/reporters/test_coverage.pkb' ---@@install_below_12_2.sql 'ut3_user/reporters/test_coverage/test_html_proftab_reporter.pkb' ---set define off +set define on +@@install_below_12_2.sql 'ut3_user/reporters/test_proftab_coverage.pkb' +@@install_below_12_2.sql 'ut3_user/reporters/test_coverage/test_html_proftab_reporter.pkb' +set define off set linesize 200 diff --git a/test/ut3_tester/core.pkb b/test/ut3_tester/core.pkb index a1da097a9..8843c129f 100644 --- a/test/ut3_tester/core.pkb +++ b/test/ut3_tester/core.pkb @@ -5,6 +5,7 @@ create or replace package body core is ut3.ut_coverage.set_develop_mode(true); --improve performance of test execution by disabling all compiler optimizations ut3_tester_helper.main_helper.execute_autonomous('ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=0'); + dbms_output.enable(null); end; end; diff --git a/test/ut3_tester_helper/coverage_helper.pkb b/test/ut3_tester_helper/coverage_helper.pkb index 06f42bbf3..feac8000d 100644 --- a/test/ut3_tester_helper/coverage_helper.pkb +++ b/test/ut3_tester_helper/coverage_helper.pkb @@ -106,6 +106,66 @@ create or replace package body coverage_helper is begin execute immediate q'[drop package ut3.dummy_coverage]'; exception when others then null; end; end; + + procedure create_dummy_coverage_test_1 is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package UT3.DUMMY_COVERAGE_1 is + procedure do_stuff; + procedure grant_myself; + end;]'; + execute immediate q'[create or replace package body UT3.DUMMY_COVERAGE_1 is + procedure do_stuff is + begin + if 1 = 2 then + dbms_output.put_line('should not get here'); + else + dbms_output.put_line('should get here'); + end if; + end; + + procedure grant_myself is + begin + execute immediate 'grant debug,execute on UT3.DUMMY_COVERAGE_1 to ut3$user#'; + end; + + end;]'; + execute immediate q'[create or replace package UT3.TEST_DUMMY_COVERAGE_1 is + --%suite(dummy coverage test 1) + --%suitepath(coverage_testing) + + --%test + procedure test_do_stuff; + + procedure grant_myself; + end;]'; + execute immediate q'[create or replace package body UT3.TEST_DUMMY_COVERAGE_1 is + procedure test_do_stuff is + begin + dummy_coverage_1.do_stuff; + end; + + procedure grant_myself is + begin + execute immediate 'grant debug,execute on UT3.TEST_DUMMY_COVERAGE_1 to ut3$user#'; + end; + + end;]'; + end; + + procedure drop_dummy_coverage_test_1 is + pragma autonomous_transaction; + begin + execute immediate q'[drop package UT3.DUMMY_COVERAGE_1]'; + execute immediate q'[drop package UT3.TEST_DUMMY_COVERAGE_1]'; + end; + + procedure grant_exec_on_cov_1 is + pragma autonomous_transaction; + begin + execute immediate 'begin UT3.DUMMY_COVERAGE_1.grant_myself(); end;'; + execute immediate 'begin UT3.TEST_DUMMY_COVERAGE_1.grant_myself(); end;'; + end; --12.2 Setup procedure create_dummy_12_2_cov_pck is diff --git a/test/ut3_tester_helper/coverage_helper.pks b/test/ut3_tester_helper/coverage_helper.pks index 427a965c0..73ff7b448 100644 --- a/test/ut3_tester_helper/coverage_helper.pks +++ b/test/ut3_tester_helper/coverage_helper.pks @@ -15,7 +15,10 @@ create or replace package coverage_helper is procedure grant_exec_on_cov; procedure mock_profiler_coverage_data(a_run_id integer,a_user in varchar2); procedure drop_dummy_coverage_pkg; - + procedure create_dummy_coverage_test_1; + procedure drop_dummy_coverage_test_1; + procedure grant_exec_on_cov_1; + --Block coverage procedure create_dummy_12_2_cov_pck; procedure create_dummy_12_2_cov_test; diff --git a/test/ut3_user/reporters/test_coverage.pkb b/test/ut3_user/reporters/test_coverage.pkb index c3617bc55..6b094f2ae 100644 --- a/test/ut3_user/reporters/test_coverage.pkb +++ b/test/ut3_user/reporters/test_coverage.pkb @@ -6,25 +6,10 @@ create or replace package body test_coverage is return ut3_tester_helper.coverage_helper.get_mock_run_id(); end; - procedure create_dummy_coverage_package is + procedure create_dummy_coverage_pkg is begin ut3_tester_helper.coverage_helper.create_dummy_coverage_package(); - end; - - procedure create_dummy_coverage_test is - begin ut3_tester_helper.coverage_helper.create_dummy_coverage_test(); - end; - - procedure mock_coverage_data(a_run_id integer) is - begin - ut3_tester_helper.coverage_helper.mock_coverage_data(a_run_id,user); - end; - - procedure create_dummy_coverage_pkg is - begin - create_dummy_coverage_package(); - create_dummy_coverage_test(); ut3_tester_helper.coverage_helper.grant_exec_on_cov(); end; @@ -33,7 +18,7 @@ create or replace package body test_coverage is begin g_run_id := get_mock_run_id(); ut3.ut_coverage.mock_coverage_id(g_run_id, ut3.ut_coverage.gc_proftab_coverage); - mock_coverage_data(g_run_id); + ut3_tester_helper.coverage_helper.mock_coverage_data(g_run_id,user); commit; end; diff --git a/test/ut3_user/reporters/test_coverage/test_html_proftab_reporter.pkb b/test/ut3_user/reporters/test_coverage/test_html_proftab_reporter.pkb new file mode 100644 index 000000000..8daf36513 --- /dev/null +++ b/test/ut3_user/reporters/test_coverage/test_html_proftab_reporter.pkb @@ -0,0 +1,29 @@ +create or replace package body test_html_proftab_reporter is + + procedure report_on_file is + l_results ut3.ut_varchar2_list; + l_expected varchar2(32767); + l_actual clob; + l_charset varchar2(100) := 'ISO-8859-1'; + begin + --Arrange + l_expected := '%%

UT3.DUMMY_COVERAGE

%3 relevant lines. 2 lines covered and 1 lines missed%'; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_dummy_coverage', + a_reporter=> ut3.ut_coverage_html_reporter(), + a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage.pkb' ), + a_test_files => ut3.ut_varchar2_list( ), + a_client_character_set => l_charset + ) + ); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like(l_expected); + end; + +end test_html_proftab_reporter; +/ diff --git a/test/ut3_user/reporters/test_coverage/test_html_proftab_reporter.pks b/test/ut3_user/reporters/test_coverage/test_html_proftab_reporter.pks new file mode 100644 index 000000000..02973fbe0 --- /dev/null +++ b/test/ut3_user/reporters/test_coverage/test_html_proftab_reporter.pks @@ -0,0 +1,10 @@ +create or replace package test_html_proftab_reporter is + + --%suite(ut_html_proftab_reporter) + --%suitepath(utplsql.test_user.reporters.test_coverage.test_proftab_coverage) + + --%test(reports on a project file mapped to database object in profiler coverage) + procedure report_on_file; + +end test_html_proftab_reporter; +/ diff --git a/test/ut3_user/reporters/test_proftab_coverage.pkb b/test/ut3_user/reporters/test_proftab_coverage.pkb new file mode 100644 index 000000000..c5ad8c112 --- /dev/null +++ b/test/ut3_user/reporters/test_proftab_coverage.pkb @@ -0,0 +1,143 @@ +create or replace package body test_proftab_coverage is + + procedure create_dummy_coverage_test_1 is + begin + ut3_tester_helper.coverage_helper.create_dummy_coverage_test_1(); + ut3_tester_helper.coverage_helper.grant_exec_on_cov_1(); + end; + + procedure drop_dummy_coverage_test_1 is + begin + ut3_tester_helper.coverage_helper.drop_dummy_coverage_test_1(); + end; + + procedure coverage_for_object is + l_expected clob; + l_actual clob; + l_results ut3.ut_varchar2_list; + begin + --Arrange + l_expected := '%%'; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_dummy_coverage', + a_reporter=> ut3.ut_coverage_sonar_reporter( ), + a_include_objects => ut3.ut_varchar2_list( 'ut3.dummy_coverage' ) + ) + ); + --Assert + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + end; + + procedure coverage_for_object_no_owner is + l_expected clob; + l_actual clob; + l_results ut3.ut_varchar2_list; + begin + --Arrange + l_expected := '%%'; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_dummy_coverage', + a_reporter=> ut3.ut_coverage_sonar_reporter( ), + a_include_objects => ut3.ut_varchar2_list( 'dummy_coverage' ) + ) + ); + --Assert + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + end; + + procedure coverage_for_schema is + l_expected clob; + l_actual clob; + l_results ut3.ut_varchar2_list; + begin + --Arrange + l_expected := ''; + l_expected := '%'||l_expected||'%'||l_expected||'%'; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_dummy_coverage', + a_reporter=> ut3.ut_coverage_sonar_reporter( ), + a_coverage_schemes => ut3.ut_varchar2_list( 'ut3' ) + ) + ); + --Assert + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + end; + + procedure coverage_for_file is + l_expected clob; + l_actual clob; + l_results ut3.ut_varchar2_list; + l_file_path varchar2(100); + begin + --Arrange + l_file_path := lower('test/ut3.dummy_coverage.pkb'); + l_expected := '%%'; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_dummy_coverage', + a_reporter=> ut3.ut_coverage_sonar_reporter( ), + a_source_files => ut3.ut_varchar2_list( l_file_path ), + a_test_files => ut3.ut_varchar2_list( ) + ) + ); + --Assert + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_be_like(l_expected); + end; + + procedure coverage_tmp_data_refresh is + l_actual clob; + l_results ut3.ut_varchar2_list; + begin + --Arrange + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3:coverage_testing', + a_reporter=> ut3.ut_coverage_sonar_reporter( ), + a_include_objects => ut3.ut_varchar2_list( 'ut3.dummy_coverage' ) + ) + ); + ut3_tester_helper.coverage_helper.cleanup_dummy_coverage(test_coverage.g_run_id); + ut3_tester_helper.coverage_helper.drop_dummy_coverage_pkg(); + create_dummy_coverage_test_1; + + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3:coverage_testing', + a_reporter=> ut3.ut_coverage_sonar_reporter( ), + a_include_objects => ut3.ut_varchar2_list( 'ut3.dummy_coverage' ) + ) + ); + + --Assert + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + ut.expect(l_actual).to_equal(to_clob(' + +')); + end; + +end; +/ diff --git a/test/ut3_user/reporters/test_proftab_coverage.pks b/test/ut3_user/reporters/test_proftab_coverage.pks new file mode 100644 index 000000000..1bb5c10cd --- /dev/null +++ b/test/ut3_user/reporters/test_proftab_coverage.pks @@ -0,0 +1,27 @@ +create or replace package test_proftab_coverage is + + --%suite + --%suitepath(utplsql.test_user.reporters.test_coverage) + + --%test(Coverage is gathered for specified object - default coverage type) + procedure coverage_for_object; + + --%test(Coverage is gathered for specified schema - default coverage type) + procedure coverage_for_object_no_owner; + + --%test(Coverage is gathered for specified schema) + procedure coverage_for_schema; + + --%test(Coverage is gathered for specified file - default coverage type) + procedure coverage_for_file; + + --%test(Coverage data is not cached between runs - issue #562 ) + --%aftertest(ut3$user#.test_coverage.create_dummy_coverage_pkg) + --%aftertest(ut3$user#.test_coverage.setup_dummy_coverage) + --%aftertest(drop_dummy_coverage_test_1) + procedure coverage_tmp_data_refresh; + + procedure drop_dummy_coverage_test_1; + +end; +/ From 25be0fd94ea82e808545f903e33dce1429f2d3f6 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Mon, 1 Apr 2019 08:29:10 +0000 Subject: [PATCH 046/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index ce0e56c57..03f149495 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 36a8ef952..e1fe1c15a 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 617a4db1d..8ac4f4486 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 35d465fc1..1e9f3680f 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 2ccaae623..5d7d5f7b2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 0bf324e36..9a3392eff 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 91da18b31..803234e70 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index f574b8e81..f6324861d 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 8424a8d14..c0f5feeea 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 8da42b6b8..e7ea43f26 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 492804991..a459454f2 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 3314ed467..95c362c4d 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 2d6d7cb6c..bbe6603ab 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 92cfd1e85..4ea2e541e 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index dd3aff030..d14ccc24d 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index a6482023d..d7b82ee17 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index de9c3a64e..cc5b920ec 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2748--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index c51d18d48..aecebc93f 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2748-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2795-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 858a675c1e867563a9a0b135fd621bab554fb965 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 1 Apr 2019 12:41:34 +0100 Subject: [PATCH 047/181] Fixing broken test. Adding test: reporters/test_coverage/test_html_extended_reporter reporters/test_extended_coverage --- .travis/install.sh | 2 +- test/ut3_tester/core/test_ut_test.pkb | 10 ++++++++++ test/ut3_tester/core/test_ut_test.pks | 8 ++++++-- test/ut3_tester_helper/ut_example_tests.pkb | 13 ++++++++++++- test/ut3_tester_helper/ut_example_tests.pks | 4 ++++ .../test_coverage/test_html_extended_reporter.pkb | 2 +- .../test_coverage/test_html_extended_reporter.pks | 2 +- test/ut3_user/reporters/test_extended_coverage.pks | 2 +- 8 files changed, 36 insertions(+), 7 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index a6a8a60b0..d8c2a87fc 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -86,7 +86,7 @@ grant create public database link to $UT3_TESTER_HELPER; grant drop public database link to $UT3_TESTER_HELPER; set feedback on --Needed for testing coverage outside of main UT3 schema. -grant create any procedure, drop any procedure, execute any procedure, create any type, drop any type, execute any type, under any type, select any table, update any table, insert any table, delete any table, create any table, drop any table, alter any table, select any dictionary to $UT3_TESTER_HELPER; +grant create any procedure, drop any procedure, execute any procedure, create any type, drop any type, execute any type, under any type, select any table, update any table, insert any table, delete any table, create any table, drop any table, alter any table, select any dictionary, create any synonym, drop any synonym to $UT3_TESTER_HELPER; grant create job to $UT3_TESTER_HELPER; exit SQL diff --git a/test/ut3_tester/core/test_ut_test.pkb b/test/ut3_tester/core/test_ut_test.pkb index 183f9f9c9..2a85a323f 100644 --- a/test/ut3_tester/core/test_ut_test.pkb +++ b/test/ut3_tester/core/test_ut_test.pkb @@ -404,6 +404,16 @@ create or replace package body test_ut_test is ut.expect(l_test.result).to_equal(ut3.ut_utils.gc_error); end; + procedure create_synonym is + begin + ut3_tester_helper.ut_example_tests.create_synonym; + end; + + procedure drop_synonym is + begin + ut3_tester_helper.ut_example_tests.drop_synonym; + end; + procedure owner_name_null is --Arrange l_test ut3.ut_test := ut3.ut_test( diff --git a/test/ut3_tester/core/test_ut_test.pks b/test/ut3_tester/core/test_ut_test.pks index 3f10d5a6f..a2b0fd4f5 100644 --- a/test/ut3_tester/core/test_ut_test.pks +++ b/test/ut3_tester/core/test_ut_test.pks @@ -50,9 +50,13 @@ create or replace package test_ut_test is --%test(Fails when owner name invalid) procedure owner_name_invalid; - --TODO: FIX that + + procedure create_synonym; + procedure drop_synonym; + --%test(Runs test as current schema when owner name null) - --%disabled + --%beforetest(create_synonym) + --%aftertest(drop_synonym) procedure owner_name_null; procedure create_invalid_package; diff --git a/test/ut3_tester_helper/ut_example_tests.pkb b/test/ut3_tester_helper/ut_example_tests.pkb index d4954fff3..7e795d184 100644 --- a/test/ut3_tester_helper/ut_example_tests.pkb +++ b/test/ut3_tester_helper/ut_example_tests.pkb @@ -1,6 +1,17 @@ create or replace package body ut_example_tests as - + procedure create_synonym is + pragma autonomous_transaction; + begin + execute immediate 'create or replace synonym ut3_tester.ut_example_tests for ut3_tester_helper.ut_example_tests'; + end; + + procedure drop_synonym is + pragma autonomous_transaction; + begin + execute immediate 'drop synonym ut3_tester.ut_example_tests'; + end; + procedure set_g_number_0 as begin g_number := 0; diff --git a/test/ut3_tester_helper/ut_example_tests.pks b/test/ut3_tester_helper/ut_example_tests.pks index a7077a8a8..a62c02332 100644 --- a/test/ut3_tester_helper/ut_example_tests.pks +++ b/test/ut3_tester_helper/ut_example_tests.pks @@ -1,5 +1,9 @@ create or replace package ut_example_tests is g_number number; + + procedure create_synonym; + procedure drop_synonym; + procedure set_g_number_0; procedure add_1_to_g_number; procedure failing_procedure; diff --git a/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pkb b/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pkb index 36a6be015..02b275020 100644 --- a/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pkb +++ b/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pkb @@ -13,7 +13,7 @@ create or replace package body test_html_extended_reporter is bulk collect into l_results from table( ut3.ut.run( - a_path => 'ut3.test_dummy_coverage', + a_path => 'ut3.test_block_dummy_coverage', a_reporter=> ut3.ut_coverage_html_reporter(), a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage_package_with_an_amazingly_long_name_that_you_would_not_think_of_in_real_life_project_because_its_simply_too_long.pkb' ), a_test_files => ut3.ut_varchar2_list( ), diff --git a/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pks b/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pks index 3158b3777..dbe31b83d 100644 --- a/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pks +++ b/test/ut3_user/reporters/test_coverage/test_html_extended_reporter.pks @@ -1,7 +1,7 @@ create or replace package test_html_extended_reporter is --%suite(ut_html_extended_reporter) - --%suitepath(utplsql.test_user.reporters.test_coverage.test_extended_coverage) + --%suitepath(utplsql.test_user.reporters.test_extended_coverage) --%test(reports on a project file mapped to database object in extended profiler coverage) procedure report_on_file; diff --git a/test/ut3_user/reporters/test_extended_coverage.pks b/test/ut3_user/reporters/test_extended_coverage.pks index fe4a2ecc5..aaef20877 100644 --- a/test/ut3_user/reporters/test_extended_coverage.pks +++ b/test/ut3_user/reporters/test_extended_coverage.pks @@ -1,7 +1,7 @@ create or replace package test_extended_coverage is --%suite - --%suitepath(utplsql.test_user.reporters.test_coverage) + --%suitepath(utplsql.test_user.reporters) --%beforeall procedure setup_dummy_coverage; From 1642f478e2be5abcfd065df1e37874f3b085bf3c Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 1 Apr 2019 17:11:59 +0100 Subject: [PATCH 048/181] Adding test: unary/test_expect_to_be_not_null --- test/install_ut3_user_tests.sql | 2 + .../unary/test_expect_to_be_not_null.pkb | 264 ++++++++++++++++++ .../unary/test_expect_to_be_not_null.pks | 97 +++++++ 3 files changed, 363 insertions(+) create mode 100644 test/ut3_user/expectations/unary/test_expect_to_be_not_null.pkb create mode 100644 test/ut3_user/expectations/unary/test_expect_to_be_not_null.pks diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index 3f499a494..015c1573e 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -10,6 +10,7 @@ prompt Install user tests @@ut3_user/expectations/unary/test_expect_to_be_empty.pks @@ut3_user/expectations/unary/test_expect_to_have_count.pks @@ut3_user/expectations/unary/test_expect_to_be_true_false.pks +@@ut3_user/expectations/unary/test_expect_to_be_not_null.pks @@ut3_user/expectations/binary/test_equal.pks @@ut3_user/expectations/binary/test_expect_to_be_less_than.pks @@ut3_user/expectations/binary/test_be_less_or_equal.pks @@ -47,6 +48,7 @@ set define off @@ut3_user/expectations/unary/test_expect_to_be_empty.pkb @@ut3_user/expectations/unary/test_expect_to_have_count.pkb @@ut3_user/expectations/unary/test_expect_to_be_true_false.pkb +@@ut3_user/expectations/unary/test_expect_to_be_not_null.pkb @@ut3_user/expectations/binary/test_equal.pkb @@ut3_user/expectations/binary/test_expect_to_be_less_than.pkb @@ut3_user/expectations/binary/test_be_less_or_equal.pkb diff --git a/test/ut3_user/expectations/unary/test_expect_to_be_not_null.pkb b/test/ut3_user/expectations/unary/test_expect_to_be_not_null.pkb new file mode 100644 index 000000000..0e747eb85 --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_to_be_not_null.pkb @@ -0,0 +1,264 @@ +create or replace package body test_expect_to_be_not_null +is + gc_object_name constant varchar2(30) := 't_to_be_not_null_test'; + gc_nested_table_name constant varchar2(30) := 'tt_to_be_not_null_test'; + gc_varray_name constant varchar2(30) := 'tv_to_be_not_null_test'; + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + procedure create_types is + pragma autonomous_transaction; + begin + execute immediate 'create type '||gc_object_name||' is object (dummy number)'; + execute immediate 'create type '||gc_nested_table_name||' is table of number'; + execute immediate 'create type '||gc_varray_name||' is varray(1) of number'; + end; + + procedure drop_types is + pragma autonomous_transaction; + begin + execute immediate 'drop type '||gc_object_name; + execute immediate 'drop type '||gc_nested_table_name; + execute immediate 'drop type '||gc_varray_name; + end; + + procedure blob_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'blob', 'to_blob(''abc'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure empty_blob is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'blob', 'empty_blob()'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure boolean_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'boolean', 'true'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure clob_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'clob', 'to_clob(''abc'')'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure empty_clob is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'clob', 'empty_clob()'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure date_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'date', 'sysdate'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure number_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'number', '1234'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure timestamp_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'timestamp', 'systimestamp'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure timestamp_with_ltz_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'timestamp with local time zone', 'systimestamp'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure timestamp_with_tz_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'timestamp with time zone', 'systimestamp'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure varchar2_not_null is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'varchar2(4000)', '''abc'''); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure initialized_object is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'to_be_not_null', gc_object_name, gc_object_name||'(1)', 'object' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure initialized_nested_table is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'to_be_not_null', gc_nested_table_name, gc_nested_table_name||'()', 'collection' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure initialized_varray is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'to_be_not_null', gc_varray_name, gc_varray_name||'()', 'collection' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure null_blob is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'blob', 'null'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure null_boolean is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'boolean', 'null'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + + procedure null_clob is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'clob', 'null'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + + procedure null_date is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'date', 'null'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + + procedure null_number is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'number', 'null'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + + procedure null_timestamp is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'timestamp', 'null'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + + procedure null_timestamp_with_ltz is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'timestamp with local time zone', 'null'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + + procedure null_timestamp_with_tz is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'timestamp with time zone', 'null'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + + procedure null_varchar2 is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'varchar2(4000)', 'null'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure null_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_block('to_be_not_null', 'anydata', 'null'); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure uninit_object_in_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'to_be_not_null', gc_object_name, 'null', 'object' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure uninit_nested_table_in_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'to_be_not_null', gc_nested_table_name, 'null', 'collection' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + + procedure uninit_varray_in_anydata is + begin + --Act + execute immediate ut3_tester_helper.expectations_helper.unary_expectation_object_block( + 'to_be_not_null', gc_varray_name, 'null', 'collection' + ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); + end; + +end test_expect_to_be_not_null; +/ diff --git a/test/ut3_user/expectations/unary/test_expect_to_be_not_null.pks b/test/ut3_user/expectations/unary/test_expect_to_be_not_null.pks new file mode 100644 index 000000000..7cb7cc265 --- /dev/null +++ b/test/ut3_user/expectations/unary/test_expect_to_be_not_null.pks @@ -0,0 +1,97 @@ +create or replace package test_expect_to_be_not_null +is + --%suite(to_be_not_null) + --%suitepath(utplsql.test_user.expectations.unary) + + --%aftereach + procedure cleanup_expectations; + + --%beforeall + procedure create_types; + + --%afterall + procedure drop_types; + + --%test(Gives success for not null blob) + procedure blob_not_null; + + --%test(Gives success for empty blob) + procedure empty_blob; + + --%test(Gives success for not null boolean) + procedure boolean_not_null; + + --%test(Gives success for not null clob) + procedure clob_not_null; + + --%test(Gives success for empty clob) + procedure empty_clob; + + --%test(Gives success for not null date) + procedure date_not_null; + + --%test(Gives success for not null number) + procedure number_not_null; + + --%test(Gives success for not null timestamp) + procedure timestamp_not_null; + + --%test(Gives success for not null timestamp with local time zone) + procedure timestamp_with_ltz_not_null; + + --%test(Gives success for not null timestamp with time zone) + procedure timestamp_with_tz_not_null; + + --%test(Gives success for not null varchar2) + procedure varchar2_not_null; + + --%test(Gives success for initialized object within anydata) + procedure initialized_object; + + --%test(Gives success for initialized nested table within anydata) + procedure initialized_nested_table; + + --%test(Gives success for initialized varray within anydata) + procedure initialized_varray; + + --%test(Gives failure with null blob) + procedure null_blob; + + --%test(Gives failure with null boolean) + procedure null_boolean; + + --%test(Gives failure with null clob) + procedure null_clob; + + --%test(Gives failure with null date) + procedure null_date; + + --%test(Gives failure with null number) + procedure null_number; + + --%test(Gives failure null timestamp) + procedure null_timestamp; + + --%test(Gives failure with null timestamp with local time zone) + procedure null_timestamp_with_ltz; + + --%test(Gives failure with null timestamp with time zone) + procedure null_timestamp_with_tz; + + --%test(Gives failure with null varchar2) + procedure null_varchar2; + + --%test(Gives failure with null anydata) + procedure null_anydata; + + --%test(Gives failure with uninitialized object within anydata) + procedure uninit_object_in_anydata; + + --%test(Gives failure with uninitialized nested table within anydata) + procedure uninit_nested_table_in_anydata; + + --%test(Gives failure with uninitialized varray within anydata) + procedure uninit_varray_in_anydata; + +end test_expect_to_be_not_null; +/ From 30d27fedef6428c1a7d17752f2f82a3e54ef46b4 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 1 Apr 2019 19:23:27 +0100 Subject: [PATCH 049/181] Adding global setup --- test/install_and_run_tests.sh | 3 ++- test/install_ut3_user_tests.sql | 3 ++- test/ut3_tester/core.pkb | 2 +- test/ut3_tester_helper/main_helper.pkb | 4 ++++ test/ut3_tester_helper/main_helper.pks | 2 ++ test/ut3_user/test_user.pkb | 12 ++++++++++++ test/ut3_user/test_user.pks | 10 ++++++++++ 7 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 test/ut3_user/test_user.pkb create mode 100644 test/ut3_user/test_user.pks diff --git a/test/install_and_run_tests.sh b/test/install_and_run_tests.sh index 9f5752b5e..4359934ab 100755 --- a/test/install_and_run_tests.sh +++ b/test/install_and_run_tests.sh @@ -27,4 +27,5 @@ time utPLSQL-cli/bin/utplsql run ${UT3_TESTER_HELPER}/${UT3_TESTER_HELPER_PASSWO -f=ut_junit_reporter -o=junit_test_results.xml \ -f=ut_tfs_junit_reporter -o=tfs_test_results.xml \ -f=ut_documentation_reporter -o=test_results.log -s \ --scc +-scc \ +-q diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index 015c1573e..547fc2762 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -5,6 +5,7 @@ whenever oserror exit failure rollback alter session set plsql_optimize_level=0; prompt Install user tests +@@ut3_user/test_user.pks @@ut3_user/expectations/unary/test_expect_not_to_be_null.pks @@ut3_user/expectations/unary/test_expect_to_be_null.pks @@ut3_user/expectations/unary/test_expect_to_be_empty.pks @@ -42,7 +43,7 @@ set define on @@install_below_12_2.sql 'ut3_user/reporters/test_coverage/test_html_proftab_reporter.pks' set define off - +@@ut3_user/test_user.pkb @@ut3_user/expectations/unary/test_expect_not_to_be_null.pkb @@ut3_user/expectations/unary/test_expect_to_be_null.pkb @@ut3_user/expectations/unary/test_expect_to_be_empty.pkb diff --git a/test/ut3_tester/core.pkb b/test/ut3_tester/core.pkb index 8843c129f..64ebc0093 100644 --- a/test/ut3_tester/core.pkb +++ b/test/ut3_tester/core.pkb @@ -5,7 +5,7 @@ create or replace package body core is ut3.ut_coverage.set_develop_mode(true); --improve performance of test execution by disabling all compiler optimizations ut3_tester_helper.main_helper.execute_autonomous('ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=0'); - dbms_output.enable(null); + --dbms_output.enable(null); end; end; diff --git a/test/ut3_tester_helper/main_helper.pkb b/test/ut3_tester_helper/main_helper.pkb index ffccc3185..64dc24e8d 100644 --- a/test/ut3_tester_helper/main_helper.pkb +++ b/test/ut3_tester_helper/main_helper.pkb @@ -154,5 +154,9 @@ create or replace package body main_helper is ut3.ut_utils.append_to_list(a_list,a_items); end; + procedure output_null is + begin + dbms_output.enable(null); + end; end; / diff --git a/test/ut3_tester_helper/main_helper.pks b/test/ut3_tester_helper/main_helper.pks index 7d349151c..e3b9f11bf 100644 --- a/test/ut3_tester_helper/main_helper.pks +++ b/test/ut3_tester_helper/main_helper.pks @@ -45,5 +45,7 @@ create or replace package main_helper is procedure append_to_list(a_list in out nocopy ut3.ut_varchar2_rows, a_items ut3.ut_varchar2_rows); + procedure output_null; + end; / diff --git a/test/ut3_user/test_user.pkb b/test/ut3_user/test_user.pkb new file mode 100644 index 000000000..36ed8e898 --- /dev/null +++ b/test/ut3_user/test_user.pkb @@ -0,0 +1,12 @@ +create or replace package body test_user is + + procedure global_setup is + begin + ut3.ut_coverage.set_develop_mode(true); + --improve performance of test execution by disabling all compiler optimizations + ut3_tester_helper.main_helper.execute_autonomous('ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=0'); + --dbms_output.enable(null); + end; + +end; +/ diff --git a/test/ut3_user/test_user.pks b/test/ut3_user/test_user.pks new file mode 100644 index 000000000..ea0435efd --- /dev/null +++ b/test/ut3_user/test_user.pks @@ -0,0 +1,10 @@ +create or replace package test_user is + + --%suite + --%suitepath(utplsql) + + --%beforeall + procedure global_setup; + +end; +/ From 4643b14a80bf1788bb5e990484efe50901980e7d Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 2 Apr 2019 11:46:50 +0200 Subject: [PATCH 050/181] document how to avoid Oracle Bug 14402514 (see #891) --- docs/userguide/expectations.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index a459454f2..5b8a3b08f 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -272,7 +272,9 @@ begin end; ``` -Parameters `a_mask` and `a_escape_char` represent valid parameters of the [Oracle LIKE condition](https://docs.oracle.com/database/121/SQLRF/conditions007.htm#SQLRF52142) +Parameters `a_mask` and `a_escape_char` represent valid parameters of the [Oracle LIKE condition](https://docs.oracle.com/database/121/SQLRF/conditions007.htm#SQLRF52142). + +If you use Oracle Database version 11.2.0.4, you may run into Oracle Bug 14402514: WRONG RESULTS WITH LIKE ON CLOB USING ESCAPE CHARACTER. In this case we recommend to use `match` instead of `be_like`. ## be_not_null From 675ba70f05ebd9ff367f85d6a27bf9459a628130 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 2 Apr 2019 11:49:33 +0200 Subject: [PATCH 051/181] Fixes #891 - use to_match instead of to_be_like to avoid Oracle bug 14402514 on some 11.2.0.4 instances --- test/core/test_suite_builder.pkb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/core/test_suite_builder.pkb b/test/core/test_suite_builder.pkb index bd76e88d8..e6d21d969 100644 --- a/test/core/test_suite_builder.pkb +++ b/test/core/test_suite_builder.pkb @@ -608,11 +608,11 @@ create or replace package body test_suite_builder is --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); --Assert - ut.expect(l_actual).to_be_like('%%Annotation "--\%beforeall"%line 2%%', '\'); - ut.expect(l_actual).to_be_like('%%Annotation "--\%beforeeach"%line 3%%', '\'); - ut.expect(l_actual).to_be_like('%%Annotation "--\%aftereach"%line 4%%', '\'); - ut.expect(l_actual).to_be_like('%%Annotation "--\%afterall" cannot be used with "--\%test". Annotation ignored.' - ||'%at "UT3_TESTER.SOME_PACKAGE.DO_STUFF", line 5%%', '\'); + ut.expect(l_actual).to_match('(.*)()(.*)(Annotation "--%beforeall")(.*)(line 2)(.*)()(.*)', 'n'); + ut.expect(l_actual).to_match('(.*)()(.*)(Annotation "--%beforeeach")(.*)(line 3)(.*)()(.*)', 'n'); + ut.expect(l_actual).to_match('(.*)()(.*)(Annotation "--%aftereach")(.*)(line 4)(.*)()(.*)', 'n'); + ut.expect(l_actual).to_match('(.*)()(.*)(Annotation "--%afterall" cannot be used with "--%test". Annotation ignored.)' + ||'(.*)(at "UT3_TESTER.SOME_PACKAGE.DO_STUFF", line 5)(.*)()(.*)', 'n'); ut.expect(l_actual).not_to_be_like('%%'); ut.expect(l_actual).not_to_be_like('%%'); ut.expect(l_actual).not_to_be_like('%%'); @@ -1095,7 +1095,7 @@ create or replace package body test_suite_builder is --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); --Assert - ut.expect(l_actual).to_be_like('%Unsupported annotation "--\%bad_procedure_annotation". Annotation ignored.% line 2%', '\'); + ut.expect(l_actual).to_match('(.*)(Unsupported annotation "--%bad_procedure_annotation"\. Annotation ignored\.)(.*)( line 2)(.*)', 'n'); end; procedure test_bad_package_annotation is @@ -1111,7 +1111,7 @@ create or replace package body test_suite_builder is --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); --Assert - ut.expect(l_actual).to_be_like('%Unsupported annotation "--\%bad_package_annotation". Annotation ignored.% line 17%', '\'); + ut.expect(l_actual).to_match('(.*)(Unsupported annotation "--%bad_package_annotation"\. Annotation ignored\.)(.*)( line 17)(.*)', 'n'); end; end test_suite_builder; From 2381ee8723d5b21bae2d173475ed5fedb85873ea Mon Sep 17 00:00:00 2001 From: Travis CI Date: Tue, 2 Apr 2019 12:14:27 +0000 Subject: [PATCH 052/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 03f149495..9613c0ccb 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index e1fe1c15a..38898c478 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 8ac4f4486..c1f13d055 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 1e9f3680f..f9241b331 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 5d7d5f7b2..7f545ebde 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 9a3392eff..736d81696 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 803234e70..bd0e2383b 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index f6324861d..298ca67b6 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index c0f5feeea..bd72c4451 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index e7ea43f26..da2f06335 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 5b8a3b08f..81f7c86af 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 95c362c4d..83764eab3 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index bbe6603ab..799807d0a 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 4ea2e541e..b6e5d6024 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index d14ccc24d..d0bf7606b 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index d7b82ee17..d12f81294 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index cc5b920ec..4cff7f4b5 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2795--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index aecebc93f..35cdbd07c 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2795-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2803-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 5d3b18c35238eb38a8c468bc7d209076254276a2 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Tue, 2 Apr 2019 17:25:42 +0100 Subject: [PATCH 053/181] Update cleanup script after branching from random order branch --- development/cleanup.sh | 4 ++-- development/template.env.sh | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/development/cleanup.sh b/development/cleanup.sh index fb0415ed1..313e382ca 100755 --- a/development/cleanup.sh +++ b/development/cleanup.sh @@ -26,12 +26,12 @@ drop user ${UT3_USER} cascade; begin for i in ( - select decode(owner,'PUBLIC','drop public synonym "','drop synonym "'||owner||'"."')|| synonym_name ||'"' drop_orphaned_synonym from dba_synonyms a + select decode(owner,'PUBLIC','drop public synonym "','drop synonym "'||owner||'"."')|| synonym_name ||'"' drop_orphaned_synonym, owner||'.'||synonym_name syn from dba_synonyms a where not exists (select 1 from dba_objects b where (a.table_name=b.object_name and a.table_owner=b.owner or b.owner='SYS' and a.table_owner=b.object_name) ) and a.table_owner not in ('SYS','SYSTEM') ) loop - dbms_output.put_line(i.drop_orphaned_synonym); execute immediate i.drop_orphaned_synonym; + dbms_output.put_line('synonym '||i.syn||' dropped'); end loop; end; / diff --git a/development/template.env.sh b/development/template.env.sh index 285b60577..54497cc30 100755 --- a/development/template.env.sh +++ b/development/template.env.sh @@ -18,5 +18,3 @@ export UT3_TESTER_HELPER_PASSWORD=ut3 export UT3_TABLESPACE=users export UT3_USER="UT3\$USER#" export UT3_USER_PASSWORD=ut3 -export UT3_TESTER_HELPER=ut3_tester_helper -export UT3_TESTER_HELPER_PASSWORD=ut3 From b56d27adfcd2ecae307665727a35c3ee9ef41171 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Wed, 3 Apr 2019 09:45:47 +0100 Subject: [PATCH 054/181] Fixed invalid suitepath in `core` package. Updated cli version to 3.1.6 Added top package `utplsql` with dbms_output.enable for both test users. Renamed suitepath to match username (ut3_tester) --- .travis.yml | 2 +- development/template.env.sh | 2 +- test/common_helper/utplsql.pkb | 11 +++++++++++ test/common_helper/utplsql.pks | 9 +++++++++ test/install_and_run_tests.sh | 3 +-- test/install_ut3_tester_tests.sql | 2 ++ test/install_ut3_user_tests.sql | 3 +++ test/ut3_tester/core.pkb | 6 +----- test/ut3_tester/core.pks | 2 +- .../core/annotations/test_annot_throws_exception.pks | 2 +- .../core/annotations/test_annotation_manager.pks | 2 +- .../core/annotations/test_annotation_parser.pks | 2 +- .../annotations/test_before_after_annotations.pks | 2 +- .../core/expectations/test_expectation_processor.pks | 2 +- test/ut3_tester/core/test_file_mapper.pks | 2 +- test/ut3_tester/core/test_output_buffer.pks | 2 +- test/ut3_tester/core/test_suite_builder.pks | 2 +- test/ut3_tester/core/test_suite_manager.pks | 2 +- test/ut3_tester/core/test_ut_executable.pks | 2 +- test/ut3_tester/core/test_ut_suite.pks | 2 +- test/ut3_tester/core/test_ut_test.pks | 2 +- test/ut3_tester/core/test_ut_utils.pks | 2 +- test/ut3_tester_helper/main_helper.pkb | 4 ---- test/ut3_tester_helper/main_helper.pks | 2 -- test/ut3_user/api/test_ut_runner.pkb | 11 +++++++---- test/ut3_user/test_user.pkb | 1 - 26 files changed, 50 insertions(+), 34 deletions(-) create mode 100644 test/common_helper/utplsql.pkb create mode 100644 test/common_helper/utplsql.pks diff --git a/.travis.yml b/.travis.yml index f23501e05..af8a07cee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,7 +47,7 @@ env: #utPLSQL released version directory - UTPLSQL_DIR="utPLSQL_latest_release" - SELFTESTING_BRANCH=${TRAVIS_BRANCH} - - UTPLSQL_CLI_VERSION="3.1.0" + - UTPLSQL_CLI_VERSION="3.1.6" # Maven - MAVEN_HOME=/usr/local/maven - MAVEN_CFG=$HOME/.m2 diff --git a/development/template.env.sh b/development/template.env.sh index 54497cc30..ab4f4efa2 100755 --- a/development/template.env.sh +++ b/development/template.env.sh @@ -4,7 +4,7 @@ export SQLCLI=sql # For sqlcl client #export SQLCLI=sqlplus # For sqlplus client export CONNECTION_STR=127.0.0.1:1521/xe # Adjust the connect string export ORACLE_PWD=oracle # Adjust your local SYS password -export UTPLSQL_CLI_VERSION="3.1.0" +export UTPLSQL_CLI_VERSION="3.1.6" export SELFTESTING_BRANCH=develop export UTPLSQL_DIR="utPLSQL_latest_release" diff --git a/test/common_helper/utplsql.pkb b/test/common_helper/utplsql.pkb new file mode 100644 index 000000000..c752caa41 --- /dev/null +++ b/test/common_helper/utplsql.pkb @@ -0,0 +1,11 @@ +create or replace package body utplsql is + + procedure global_setup is + begin + --we need to have dbms_output enable for our tests + --TODO - move this to utPLSQL-cli once cli has support for it. + dbms_output.enable(null); + end; + +end; +/ diff --git a/test/common_helper/utplsql.pks b/test/common_helper/utplsql.pks new file mode 100644 index 000000000..51adbb117 --- /dev/null +++ b/test/common_helper/utplsql.pks @@ -0,0 +1,9 @@ +create or replace package utplsql is + + --%suite + + --%beforeall + procedure global_setup; + +end; +/ diff --git a/test/install_and_run_tests.sh b/test/install_and_run_tests.sh index 983b20b96..be7857346 100755 --- a/test/install_and_run_tests.sh +++ b/test/install_and_run_tests.sh @@ -26,5 +26,4 @@ time utPLSQL-cli/bin/utplsql run ${UT3_TESTER_HELPER}/${UT3_TESTER_HELPER_PASSWO -f=ut_sonar_test_reporter -o=test_results.xml \ -f=ut_junit_reporter -o=junit_test_results.xml \ -f=ut_tfs_junit_reporter -o=tfs_test_results.xml \ --f=ut_documentation_reporter -o=test_results.log -s \ --scc +-f=ut_documentation_reporter -o=test_results.log -s diff --git a/test/install_ut3_tester_tests.sql b/test/install_ut3_tester_tests.sql index 1d4155c3d..6b3a5356c 100644 --- a/test/install_ut3_tester_tests.sql +++ b/test/install_ut3_tester_tests.sql @@ -4,6 +4,8 @@ whenever oserror exit failure rollback alter session set plsql_optimize_level=0; +@@common_helper/utplsql.pks +@@common_helper/utplsql.pkb --Install tests @@ut3_tester/core.pks diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index 547fc2762..67014f815 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -4,6 +4,9 @@ whenever oserror exit failure rollback alter session set plsql_optimize_level=0; +@@common_helper/utplsql.pks +@@common_helper/utplsql.pkb + prompt Install user tests @@ut3_user/test_user.pks @@ut3_user/expectations/unary/test_expect_not_to_be_null.pks diff --git a/test/ut3_tester/core.pkb b/test/ut3_tester/core.pkb index 8038bf236..505388a8f 100644 --- a/test/ut3_tester/core.pkb +++ b/test/ut3_tester/core.pkb @@ -1,14 +1,10 @@ create or replace package body core is - procedure global_setup is + procedure global_setup is begin ut3.ut_coverage.set_develop_mode(true); --improve performance of test execution by disabling all compiler optimizations ut3_tester_helper.main_helper.execute_autonomous('ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=0'); - dbms_output.enable(null); - - --trn on helper output - ut3_tester_helper.main_helper.output_null; end; end; diff --git a/test/ut3_tester/core.pks b/test/ut3_tester/core.pks index 0edf2ae54..4565c47f3 100644 --- a/test/ut3_tester/core.pks +++ b/test/ut3_tester/core.pks @@ -1,7 +1,7 @@ create or replace package core is --%suite - --%suitepath(utplsql) + --%suitepath(utplsql.ut3_tester) --%beforeall procedure global_setup; diff --git a/test/ut3_tester/core/annotations/test_annot_throws_exception.pks b/test/ut3_tester/core/annotations/test_annot_throws_exception.pks index 6c2df63b1..ce2e6ba7a 100644 --- a/test/ut3_tester/core/annotations/test_annot_throws_exception.pks +++ b/test/ut3_tester/core/annotations/test_annot_throws_exception.pks @@ -1,7 +1,7 @@ create or replace package test_annot_throws_exception is --%suite(annotations - throws) - --%suitepath(utplsql.framework_tester.core.annotations) + --%suitepath(utplsql.ut3_tester.core.annotations) --%beforeall procedure recollect_tests_results; diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pks b/test/ut3_tester/core/annotations/test_annotation_manager.pks index b40965c74..b2f351a6f 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pks +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pks @@ -1,7 +1,7 @@ create or replace package test_annotation_manager is --%suite(ut_annotation_manager) - --%suitepath(utplsql.framework_tester.core.annotations) + --%suitepath(utplsql.ut3_tester.core.annotations) --%aftereach procedure cleanup_annotation_cache; diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pks b/test/ut3_tester/core/annotations/test_annotation_parser.pks index bfd06c7b9..a4fe3ed70 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pks +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pks @@ -1,7 +1,7 @@ create or replace package test_annotation_parser is --%suite(ut_annotation_parser) - --%suitepath(utplsql.framework_tester.core.annotations) + --%suitepath(utplsql.ut3_tester.core.annotations) --%test(Treats procedure level annotations as package level, if mixed with comments) procedure test_proc_comments; diff --git a/test/ut3_tester/core/annotations/test_before_after_annotations.pks b/test/ut3_tester/core/annotations/test_before_after_annotations.pks index 1a0a2ebaf..062efff48 100644 --- a/test/ut3_tester/core/annotations/test_before_after_annotations.pks +++ b/test/ut3_tester/core/annotations/test_before_after_annotations.pks @@ -1,7 +1,7 @@ create or replace package test_before_after_annotations is --%suite(annotations - beforetest and aftertest) - --%suitepath(utplsql.framework_tester.core.annotations) + --%suitepath(utplsql.ut3_tester.core.annotations) subtype t_procedure_name is varchar2(250) not null; type t_procedures is table of t_procedure_name; diff --git a/test/ut3_tester/core/expectations/test_expectation_processor.pks b/test/ut3_tester/core/expectations/test_expectation_processor.pks index c6f80f20d..5b63c8938 100644 --- a/test/ut3_tester/core/expectations/test_expectation_processor.pks +++ b/test/ut3_tester/core/expectations/test_expectation_processor.pks @@ -1,7 +1,7 @@ create or replace package test_expectation_processor is --%suite(expectation_processor) - --%suitepath(utplsql.framework_tester.core.expectations) + --%suitepath(utplsql.ut3_tester.core.expectations) --%context(who_called_expectation) diff --git a/test/ut3_tester/core/test_file_mapper.pks b/test/ut3_tester/core/test_file_mapper.pks index 4f9c41bd0..b2443766c 100644 --- a/test/ut3_tester/core/test_file_mapper.pks +++ b/test/ut3_tester/core/test_file_mapper.pks @@ -1,7 +1,7 @@ create or replace package test_file_mapper is --%suite(file_mapper) - --%suitepath(utplsql.framework_tester.core) + --%suitepath(utplsql.ut3_tester.core) --%test(Maps file paths into database objects using default mappings) procedure default_mappings; diff --git a/test/ut3_tester/core/test_output_buffer.pks b/test/ut3_tester/core/test_output_buffer.pks index cf069427d..9a4cfa68a 100644 --- a/test/ut3_tester/core/test_output_buffer.pks +++ b/test/ut3_tester/core/test_output_buffer.pks @@ -1,7 +1,7 @@ create or replace package test_output_buffer is --%suite(output_buffer) - --%suitepath(utplsql.framework_tester.core) + --%suitepath(utplsql.ut3_tester.core) --%test(Receives a line from buffer table and deletes) procedure test_receive; diff --git a/test/ut3_tester/core/test_suite_builder.pks b/test/ut3_tester/core/test_suite_builder.pks index bae124e3e..5715cfd85 100644 --- a/test/ut3_tester/core/test_suite_builder.pks +++ b/test/ut3_tester/core/test_suite_builder.pks @@ -1,6 +1,6 @@ create or replace package test_suite_builder is --%suite(suite_builder) - --%suitepath(utplsql.framework_tester.core) + --%suitepath(utplsql.ut3_tester.core) --%context(suite) --%displayname(--%suite annotation) diff --git a/test/ut3_tester/core/test_suite_manager.pks b/test/ut3_tester/core/test_suite_manager.pks index 43f288224..ed318b890 100644 --- a/test/ut3_tester/core/test_suite_manager.pks +++ b/test/ut3_tester/core/test_suite_manager.pks @@ -1,7 +1,7 @@ create or replace package test_suite_manager is --%suite(suite_manager) - --%suitepath(utplsql.framework_tester.core) + --%suitepath(utplsql.ut3_tester.core) procedure create_dummy_long_test_package; diff --git a/test/ut3_tester/core/test_ut_executable.pks b/test/ut3_tester/core/test_ut_executable.pks index acb91d1be..882f0f209 100644 --- a/test/ut3_tester/core/test_ut_executable.pks +++ b/test/ut3_tester/core/test_ut_executable.pks @@ -1,7 +1,7 @@ create or replace package test_ut_executable is --%suite(ut_executable) - --%suitepath(utplsql.framework_tester.core) + --%suitepath(utplsql.ut3_tester.core) --%context(do_execute) diff --git a/test/ut3_tester/core/test_ut_suite.pks b/test/ut3_tester/core/test_ut_suite.pks index fd351d87f..385d00fc7 100644 --- a/test/ut3_tester/core/test_ut_suite.pks +++ b/test/ut3_tester/core/test_ut_suite.pks @@ -1,7 +1,7 @@ create or replace package test_ut_suite is --%suite(ut_suite) - --%suitepath(utplsql.core.framework_tester) + --%suitepath(utplsql.ut3_tester.core) --%beforeeach procedure cleanup_package_state; diff --git a/test/ut3_tester/core/test_ut_test.pks b/test/ut3_tester/core/test_ut_test.pks index a2b0fd4f5..18ea6613f 100644 --- a/test/ut3_tester/core/test_ut_test.pks +++ b/test/ut3_tester/core/test_ut_test.pks @@ -1,7 +1,7 @@ create or replace package test_ut_test is --%suite(ut_test) - --%suitepath(utplsql.framework_tester.core) + --%suitepath(utplsql.ut3_tester.core) --%beforeeach procedure cleanup_package_state; diff --git a/test/ut3_tester/core/test_ut_utils.pks b/test/ut3_tester/core/test_ut_utils.pks index ecc2596c5..d8fca3b60 100644 --- a/test/ut3_tester/core/test_ut_utils.pks +++ b/test/ut3_tester/core/test_ut_utils.pks @@ -1,7 +1,7 @@ create or replace package test_ut_utils is --%suite(ut_utils) - --%suitepath(utplsql.framework_tester.core) + --%suitepath(utplsql.ut3_tester.core) function get_numeric_delimiter return varchar2; diff --git a/test/ut3_tester_helper/main_helper.pkb b/test/ut3_tester_helper/main_helper.pkb index 64dc24e8d..ffccc3185 100644 --- a/test/ut3_tester_helper/main_helper.pkb +++ b/test/ut3_tester_helper/main_helper.pkb @@ -154,9 +154,5 @@ create or replace package body main_helper is ut3.ut_utils.append_to_list(a_list,a_items); end; - procedure output_null is - begin - dbms_output.enable(null); - end; end; / diff --git a/test/ut3_tester_helper/main_helper.pks b/test/ut3_tester_helper/main_helper.pks index e3b9f11bf..7d349151c 100644 --- a/test/ut3_tester_helper/main_helper.pks +++ b/test/ut3_tester_helper/main_helper.pks @@ -45,7 +45,5 @@ create or replace package main_helper is procedure append_to_list(a_list in out nocopy ut3.ut_varchar2_rows, a_items ut3.ut_varchar2_rows); - procedure output_null; - end; / diff --git a/test/ut3_user/api/test_ut_runner.pkb b/test/ut3_user/api/test_ut_runner.pkb index 0c47248bd..298c15c2a 100644 --- a/test/ut3_user/api/test_ut_runner.pkb +++ b/test/ut3_user/api/test_ut_runner.pkb @@ -69,6 +69,7 @@ end;'; procedure close_newly_opened_transaction is l_output_data dbms_output.chararr; l_num_lines integer := 100000; + pragma autonomous_transaction; begin --Arrange create_test_spec(); @@ -285,12 +286,13 @@ end;'; end; procedure db_link_cleanup is - begin - ut3_tester_helper.run_helper.db_link_cleanup(); - end; + pragma autonomous_transaction; + begin + ut3_tester_helper.run_helper.db_link_cleanup(); + end; procedure db_link_setup is - l_service_name varchar2(100); + pragma autonomous_transaction; begin ut3_tester_helper.run_helper.db_link_setup(); end; @@ -298,6 +300,7 @@ end;'; procedure raises_20213_on_fail_link is l_reporter ut3.ut_documentation_reporter := ut3.ut_documentation_reporter(); l_lines ut3.ut_varchar2_list; + pragma autonomous_transaction; begin --Arrange --Act diff --git a/test/ut3_user/test_user.pkb b/test/ut3_user/test_user.pkb index 07db53ede..ca84a1c69 100644 --- a/test/ut3_user/test_user.pkb +++ b/test/ut3_user/test_user.pkb @@ -5,7 +5,6 @@ create or replace package body test_user is ut3.ut_coverage.set_develop_mode(true); --improve performance of test execution by disabling all compiler optimizations ut3_tester_helper.main_helper.execute_autonomous('ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=0'); - --dbms_output.enable(null); end; end; From 67be0f46753d141dc74c2447bec34775bf24795f Mon Sep 17 00:00:00 2001 From: Travis CI Date: Wed, 3 Apr 2019 09:39:39 +0000 Subject: [PATCH 055/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 9613c0ccb..40700d995 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 38898c478..534a12ddf 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index c1f13d055..9d003f57b 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index f9241b331..e3787fa89 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 7f545ebde..8cee8860a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 736d81696..c2e24a6d5 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index bd0e2383b..15e5394c7 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 298ca67b6..b5a5a4dcd 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index bd72c4451..7793b7b73 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index da2f06335..5ff9eca9c 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 81f7c86af..d6508f9d0 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 83764eab3..79fc7caf8 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 799807d0a..7a982043c 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index b6e5d6024..f55cbce7d 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index d0bf7606b..b46a97080 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index d12f81294..951fdfa82 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 4cff7f4b5..7aff312bf 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2803--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 35cdbd07c..1e5588f7d 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2803-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2808-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 90eb8c9109e471a6cf4ade7da30b511d2472537d Mon Sep 17 00:00:00 2001 From: lwasylow Date: Thu, 4 Apr 2019 08:37:06 +0100 Subject: [PATCH 056/181] Cursor error handling --- source/core/ut_utils.pkb | 8 ++++ source/core/ut_utils.pks | 5 +++ .../data_values/ut_data_value_refcursor.tpb | 3 +- .../expectations/test_expectations_cursor.pkb | 43 +++---------------- .../expectations/test_expectations_cursor.pks | 5 +-- 5 files changed, 22 insertions(+), 42 deletions(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 830369349..dce71a1cb 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -750,5 +750,13 @@ create or replace package body ut_utils is return l_caller_stack_line; end; + function create_err_cursor_msg(a_error_stack varchar2) return varchar2 is + begin + return 'SQL exception thrown when fetching data from cursor: '|| + remove_error_from_stack(sqlerrm,-19202)||chr(10)|| + ut_expectation_processor.who_called_expectation(a_error_stack)||chr(10)|| + 'Check the query and data for errors.'; + end; + end ut_utils; / diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 45b49e965..f47fdcca1 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -113,6 +113,10 @@ create or replace package ut_utils authid definer is gc_xml_processing constant pls_integer := -19202; pragma exception_init (ex_xml_processing, -19202); + ex_failed_open_cur exception; + gc_failed_open_cur constant pls_integer := -20218; + pragma exception_init (ex_failed_open_cur, -20218); + gc_max_storage_varchar2_len constant integer := 4000; gc_max_output_string_length constant integer := 4000; gc_more_data_string constant varchar2(5) := '[...]'; @@ -378,6 +382,7 @@ create or replace package ut_utils authid definer is */ function remove_error_from_stack(a_error_stack varchar2, a_ora_code number) return varchar2; + function create_err_cursor_msg(a_error_stack varchar2) return varchar2; end ut_utils; / diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index 26a820fb7..5c40e49d5 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -100,8 +100,7 @@ create or replace type body ut_data_value_refcursor as if l_cursor%isopen then close l_cursor; end if; - ut_expectation_processor.report_failure_no_caller('SQL exception thrown when fetching data from cursor: '|| - ut_utils.remove_error_from_stack(sqlerrm,-19202)||chr(10)||'Check the query and data for errors.'); + raise_application_error(ut_utils.gc_failed_open_cur,ut_utils.create_err_cursor_msg(dbms_utility.format_call_stack())); when others then if l_cursor%isopen then close l_cursor; diff --git a/test/core/expectations/test_expectations_cursor.pkb b/test/core/expectations/test_expectations_cursor.pkb index ed7dd5479..bd3fbe78e 100644 --- a/test/core/expectations/test_expectations_cursor.pkb +++ b/test/core/expectations/test_expectations_cursor.pkb @@ -2484,9 +2484,9 @@ Diff:% ut3.ut.expect(v_actual).to_equal(v_expected); --Assert - l_expected_message := q'[%SQL exception thrown when fetching data from cursor:% + l_expected_message := q'[%ORA-20218: SQL exception thrown when fetching data from cursor: %ORA-01722: invalid number% -%Check the query and data for errors.]'; +at%ut.expect(v_actual).to_equal(v_expected)%]'; l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; --Assert @@ -2494,50 +2494,21 @@ Diff:% end; procedure xml_error_expected is - c_price CONSTANT NUMBER(20,4):= 1357; - c_user CONSTANT varchar2(30):= 'TEST_USER'; v_actual sys_refcursor; v_expected sys_refcursor; l_expected_message varchar2(32767); l_actual_message varchar2(32767); begin open v_expected for - select cast(null as number(10)) as usd_price_amt, c_user as update_id - from dual where dummy = 1; - open v_actual for - select c_price as usd_price_amt, c_user as update_id from dual; - - ut3.ut.expect(v_actual).to_equal(v_expected); - --Assert - l_expected_message := q'[%SQL exception thrown when fetching data from cursor:% -%ORA-01722: invalid number% -%Check the query and data for errors.]'; - - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); - end; - - procedure xml_error_both is - c_price CONSTANT NUMBER(20,4):= 1357; - c_user CONSTANT varchar2(30):= 'TEST_USER'; - v_actual sys_refcursor; - v_expected sys_refcursor; - l_expected_message varchar2(32767); - l_actual_message varchar2(32767); - begin + select 1/0 as test from dual; open v_actual for - select cast(null as number(10)) as usd_price_amt, c_user as update_id - from dual where dummy = 1; - open v_expected for - select cast(null as number(10)) as usd_price_amt, c_user as update_id - from dual where dummy = 1; + select 1 as test from dual; ut3.ut.expect(v_actual).to_equal(v_expected); --Assert - l_expected_message := q'[%SQL exception thrown when fetching data from cursor:% -%ORA-01722: invalid number% -%Check the query and data for errors.]'; + l_expected_message := q'[%ORA-20218: SQL exception thrown when fetching data from cursor: +%ORA-01476: divisor is equal to zero% +%at % ut.expect(v_actual).to_equal(v_expected)%]'; l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; --Assert diff --git a/test/core/expectations/test_expectations_cursor.pks b/test/core/expectations/test_expectations_cursor.pks index 26605addd..b6f1345a8 100644 --- a/test/core/expectations/test_expectations_cursor.pks +++ b/test/core/expectations/test_expectations_cursor.pks @@ -396,9 +396,6 @@ create or replace package test_expectations_cursor is --%test(Fail to process a cursor for expected) procedure xml_error_expected; - - --%test(Fail to process a cursor for both) - procedure xml_error_both; - + end; / From b56b8efd81a2ee731822cec13f0ad882f5f8b550 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Thu, 4 Apr 2019 13:37:19 +0100 Subject: [PATCH 057/181] Update tests for handling usr friendly error --- source/core/ut_utils.pkb | 8 +--- source/core/ut_utils.pks | 4 +- .../data_values/ut_compound_data_helper.pkb | 8 ++++ .../data_values/ut_compound_data_helper.pks | 2 + .../data_values/ut_data_value_refcursor.tpb | 3 +- .../expectations/test_expectations_cursor.pkb | 43 +++++++------------ 6 files changed, 29 insertions(+), 39 deletions(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index dce71a1cb..25ef3fb3f 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -750,13 +750,7 @@ create or replace package body ut_utils is return l_caller_stack_line; end; - function create_err_cursor_msg(a_error_stack varchar2) return varchar2 is - begin - return 'SQL exception thrown when fetching data from cursor: '|| - remove_error_from_stack(sqlerrm,-19202)||chr(10)|| - ut_expectation_processor.who_called_expectation(a_error_stack)||chr(10)|| - 'Check the query and data for errors.'; - end; + end ut_utils; / diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 8fb232a1b..a7a5718ed 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -381,8 +381,6 @@ create or replace package ut_utils authid definer is * Remove given ORA error from stack */ function remove_error_from_stack(a_error_stack varchar2, a_ora_code number) return varchar2; - - function create_err_cursor_msg(a_error_stack varchar2) return varchar2; - + end ut_utils; / diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 5ac8a4546..859213722 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -595,6 +595,14 @@ create or replace package body ut_compound_data_helper is open l_diff_cursor for a_diff_cursor_text using a_self_id, a_other_id; return l_diff_cursor; end; + + function create_err_cursor_msg(a_error_stack varchar2) return varchar2 is + begin + return 'SQL exception thrown when fetching data from cursor: '|| + ut_utils.remove_error_from_stack(sqlerrm,-19202)||chr(10)|| + ut_expectation_processor.who_called_expectation(a_error_stack)|| + 'Check the query and data for errors.'; + end; begin g_anytype_name_map(dbms_types.typecode_date) := 'DATE'; diff --git a/source/expectations/data_values/ut_compound_data_helper.pks b/source/expectations/data_values/ut_compound_data_helper.pks index bf3182500..62d5c8a27 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pks +++ b/source/expectations/data_values/ut_compound_data_helper.pks @@ -92,5 +92,7 @@ create or replace package ut_compound_data_helper authid definer is function get_compare_cursor(a_diff_cursor_text in clob,a_self_id raw, a_other_id raw) return sys_refcursor; + function create_err_cursor_msg(a_error_stack varchar2) return varchar2; + end; / diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index 7f157b5ad..23dca3dcf 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -100,7 +100,8 @@ create or replace type body ut_data_value_refcursor as if l_cursor%isopen then close l_cursor; end if; - raise_application_error(ut_utils.gc_failed_open_cur,ut_utils.create_err_cursor_msg(dbms_utility.format_call_stack())); + 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; diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 29d9b7819..0cf37e63a 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -972,21 +972,16 @@ Rows: [ 4 differences ] procedure reports_on_exception_in_cursor as l_actual sys_refcursor; - l_expected_message varchar2(32767); - l_actual_message varchar2(32767); begin --Act open l_actual for select 1/0 as error_column from dual connect by level < 10; ut3.ut.expect(l_actual).to_be_empty(); - --Assert - --Assert - l_expected_message := q'[%SQL exception thrown when fetching data from cursor:% -%ORA-01476: divisor is equal to zero% -%Check the query and data for errors.]'; - l_actual_message := ut3.ut_expectation_processor.get_failed_expectations()(1).message; - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); + ut.fail('Expected exception on cursor fetch'); + exception + when others then + ut.expect(sqlerrm).to_be_like('%ORA-20218: SQL exception thrown when fetching data from cursor:% +%ORA-01476: divisor is equal to zero%Check the query and data for errors%'); end; procedure exception_when_closed_cursor @@ -2531,8 +2526,6 @@ Diff:% c_user CONSTANT varchar2(30):= 'TEST_USER'; v_actual sys_refcursor; v_expected sys_refcursor; - l_expected_message varchar2(32767); - l_actual_message varchar2(32767); begin open v_actual for select cast(null as number(10)) as usd_price_amt, c_user as update_id @@ -2541,21 +2534,17 @@ Diff:% select c_price as usd_price_amt, c_user as update_id from dual; ut3.ut.expect(v_actual).to_equal(v_expected); - --Assert - l_expected_message := q'[%ORA-20218: SQL exception thrown when fetching data from cursor: -%ORA-01722: invalid number% -at%ut.expect(v_actual).to_equal(v_expected)%]'; - l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); + ut.fail('Expected exception on cursor fetch'); + exception + when others then + ut.expect(sqlerrm).to_be_like('%ORA-20218: SQL exception thrown when fetching data from cursor:% +%ORA-01722: invalid number%%Check the query and data for errors%'); end; procedure xml_error_expected is v_actual sys_refcursor; v_expected sys_refcursor; - l_expected_message varchar2(32767); - l_actual_message varchar2(32767); begin open v_expected for select 1/0 as test from dual; @@ -2563,14 +2552,12 @@ at%ut.expect(v_actual).to_equal(v_expected)%]'; select 1 as test from dual; ut3.ut.expect(v_actual).to_equal(v_expected); - --Assert - l_expected_message := q'[%ORA-20218: SQL exception thrown when fetching data from cursor: -%ORA-01476: divisor is equal to zero% -%at % ut.expect(v_actual).to_equal(v_expected)%]'; - l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); - --Assert - ut.expect(l_actual_message).to_be_like(l_expected_message); + ut.fail('Expected exception on cursor fetch'); + exception + when others then + ut.expect(sqlerrm).to_be_like('%ORA-20218: SQL exception thrown when fetching data from cursor:% +%ORA-01476: divisor is equal to zero%Check the query and data for errors%'); end; end; From 8c64d78153e01920942c9e565b499e85f9b46b43 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 5 Apr 2019 09:13:40 +0100 Subject: [PATCH 058/181] Applying fixes as per PR review. Removal of unused procedure from expactation_processor Switch to use constant in error message creation Update tests to match full message. --- source/core/ut_expectation_processor.pkb | 5 --- source/core/ut_expectation_processor.pks | 2 - .../data_values/ut_compound_data_helper.pkb | 2 +- .../expectations/test_expectations_cursor.pkb | 42 ++++++++++++------- 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/source/core/ut_expectation_processor.pkb b/source/core/ut_expectation_processor.pkb index 22dc9000f..e961ca908 100644 --- a/source/core/ut_expectation_processor.pkb +++ b/source/core/ut_expectation_processor.pkb @@ -89,11 +89,6 @@ create or replace package body ut_expectation_processor as add_expectation_result(ut_expectation_result(ut_utils.gc_failure, null, a_message)); end; - procedure report_failure_no_caller(a_message in varchar2) is - begin - add_expectation_result(ut_expectation_result(ut_utils.gc_failure, null, a_message,false)); - end; - function get_session_parameters return tt_nls_params is l_session_params tt_nls_params; begin diff --git a/source/core/ut_expectation_processor.pks b/source/core/ut_expectation_processor.pks index 017b6aaba..ab3b70f76 100644 --- a/source/core/ut_expectation_processor.pks +++ b/source/core/ut_expectation_processor.pks @@ -36,8 +36,6 @@ create or replace package ut_expectation_processor authid current_user as procedure report_failure(a_message in varchar2); - procedure report_failure_no_caller(a_message in varchar2); - procedure set_xml_nls_params; procedure reset_nls_params; diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 859213722..d69cb0c3d 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -599,7 +599,7 @@ create or replace package body ut_compound_data_helper is function create_err_cursor_msg(a_error_stack varchar2) return varchar2 is begin return 'SQL exception thrown when fetching data from cursor: '|| - ut_utils.remove_error_from_stack(sqlerrm,-19202)||chr(10)|| + ut_utils.remove_error_from_stack(sqlerrm,ut_utils.gc_xml_processing)||chr(10)|| ut_expectation_processor.who_called_expectation(a_error_stack)|| 'Check the query and data for errors.'; end; diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 0cf37e63a..099a694cf 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2522,42 +2522,54 @@ Diff:% end; procedure xml_error_actual is - c_price CONSTANT NUMBER(20,4):= 1357; + c_price CONSTANT NUMBER(20,4):= 1357; c_user CONSTANT varchar2(30):= 'TEST_USER'; - v_actual sys_refcursor; - v_expected sys_refcursor; + l_actual sys_refcursor; + l_expected sys_refcursor; + l_exp_message varchar2(32000); begin - open v_actual for + l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: +ORA-01722: invalid number +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR.XML_ERROR_ACTUAL", line 2542 ut3.ut.expect(l_actual).to_equal(l_expected); +Check the query and data for errors.'; + + open l_actual for select cast(null as number(10)) as usd_price_amt, c_user as update_id from dual where dummy = 1; - open v_expected for + open l_expected for select c_price as usd_price_amt, c_user as update_id from dual; - ut3.ut.expect(v_actual).to_equal(v_expected); + ut3.ut.expect(l_actual).to_equal(l_expected); + --Line that error relates to in expected messag ut.fail('Expected exception on cursor fetch'); exception when others then - ut.expect(sqlerrm).to_be_like('%ORA-20218: SQL exception thrown when fetching data from cursor:% -%ORA-01722: invalid number%%Check the query and data for errors%'); + ut.expect(sqlerrm).to_equal(l_exp_message); end; procedure xml_error_expected is - v_actual sys_refcursor; - v_expected sys_refcursor; + l_actual sys_refcursor; + l_expected sys_refcursor; + l_exp_message varchar2(32000); begin - open v_expected for + + l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: +ORA-01476: divisor is equal to zero +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR.XML_ERROR_EXPECTED", line 2567 ut3.ut.expect(l_actual).to_equal(l_expected); +Check the query and data for errors.'; + + open l_expected for select 1/0 as test from dual; - open v_actual for + open l_actual for select 1 as test from dual; - ut3.ut.expect(v_actual).to_equal(v_expected); + ut3.ut.expect(l_actual).to_equal(l_expected); ut.fail('Expected exception on cursor fetch'); exception when others then - ut.expect(sqlerrm).to_be_like('%ORA-20218: SQL exception thrown when fetching data from cursor:% -%ORA-01476: divisor is equal to zero%Check the query and data for errors%'); + ut.expect(sqlerrm).to_equal(l_exp_message); end; end; From 05efc5e1e71648830791c2c3d4e5e07e256e9b38 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 5 Apr 2019 09:32:48 +0100 Subject: [PATCH 059/181] Cleanup whitespaces --- source/expectations/data_values/ut_compound_data_helper.pkb | 6 +++--- test/ut3_user/expectations/test_expectations_cursor.pkb | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index d69cb0c3d..6a9489274 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -598,9 +598,9 @@ create or replace package body ut_compound_data_helper is function create_err_cursor_msg(a_error_stack varchar2) return varchar2 is begin - 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)|| + return 'SQL exception thrown when fetching data from cursor:'|| + trim(ut_utils.remove_error_from_stack(sqlerrm,ut_utils.gc_xml_processing))||chr(10)|| + trim(ut_expectation_processor.who_called_expectation(a_error_stack))|| 'Check the query and data for errors.'; end; diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 099a694cf..757c3dd26 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2528,9 +2528,9 @@ Diff:% l_expected sys_refcursor; l_exp_message varchar2(32000); begin - l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: + l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01722: invalid number -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR.XML_ERROR_ACTUAL", line 2542 ut3.ut.expect(l_actual).to_equal(l_expected); +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR.XML_ERROR_ACTUAL", line 2542 ut3.ut.expect(l_actual).to_equal(l_expected); Check the query and data for errors.'; open l_actual for @@ -2554,7 +2554,7 @@ Check the query and data for errors.'; l_exp_message varchar2(32000); begin - l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: + l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero at "UT3$USER#.TEST_EXPECTATIONS_CURSOR.XML_ERROR_EXPECTED", line 2567 ut3.ut.expect(l_actual).to_equal(l_expected); Check the query and data for errors.'; From 3f97b9e94cba7ee0351d860a50734f126ca7ea81 Mon Sep 17 00:00:00 2001 From: Edgars Cupits Date: Sat, 6 Apr 2019 14:17:55 +0300 Subject: [PATCH 060/181] fixing ORA-00907 when comparing ref cursors with BINARY_DOUBLE/BINRAY_FLOAT columns fixing ORA-00907: missing right parenthesis when comparing ref cursors with BINARY_DOUBLE/BINARY_FLOAT columns, because these column types do not support type length --- source/expectations/data_values/ut_compound_data_helper.pkb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 5ac8a4546..d8367e8c4 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -231,7 +231,8 @@ create or replace package body ut_compound_data_helper is elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('DATE','TIMESTAMP','TIMESTAMP WITH TIME ZONE', 'TIMESTAMP WITH LOCAL TIME ZONE') then l_col_type := 'VARCHAR2(50)'; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('INTERVAL DAY TO SECOND','INTERVAL YEAR TO MONTH') then + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('INTERVAL DAY TO SECOND', + 'INTERVAL YEAR TO MONTH', 'BINARY_FLOAT', 'BINARY_DOUBLE') then l_col_type := a_data_info.column_type; else l_col_type := a_data_info.column_type From 5ab8cb9ecf01cd2760dd815e6dc079980100a195 Mon Sep 17 00:00:00 2001 From: Edgars Cupits Date: Sat, 6 Apr 2019 18:33:28 +0300 Subject: [PATCH 061/181] fix/ORA-00907: adding simple testcase --- .../expectations/test_expectations_cursor.pkb | 22 +++++++++++++++++++ .../expectations/test_expectations_cursor.pks | 3 +++ 2 files changed, 25 insertions(+) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index a83fb0ae9..5f2d58f5b 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -82,6 +82,28 @@ create or replace package body test_expectations_cursor is ut3.ut.reset_nls; end; + procedure success_on_same_data_with_float + as + l_expected sys_refcursor; + l_actual sys_refcursor; + begin + -- Arrange + ut3.ut.set_nls; + open l_expected for + select cast(3.14 as binary_double) as pi_double, + cast(3.14 as binary_float) as pi_float + from dual; + open l_actual for + select cast(3.14 as binary_double) as pi_double, + cast(3.14 as binary_float) as pi_float + from dual; + --Act + ut3.ut.expect( l_actual ).to_equal( l_expected ); + --Assert + ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut3.ut.reset_nls; + end; + procedure success_on_empty as l_expected sys_refcursor; diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index ae37b37d3..d9773affc 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -17,6 +17,9 @@ create or replace package test_expectations_cursor is --%test(Gives success for identical data) procedure success_on_same_data; + --%test(Gives success for identical data with floats) + procedure success_on_same_data_with_float; + --%test(Gives success when both cursors are empty) procedure success_on_empty; From be2196450007dace14829c13e9252079cc9c0f53 Mon Sep 17 00:00:00 2001 From: Edgars Cupits Date: Sat, 6 Apr 2019 18:42:40 +0300 Subject: [PATCH 062/181] fix/ORA-00907: shortening test case name --- test/ut3_user/expectations/test_expectations_cursor.pkb | 2 +- test/ut3_user/expectations/test_expectations_cursor.pks | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 5f2d58f5b..0f6ad0ecc 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -82,7 +82,7 @@ create or replace package body test_expectations_cursor is ut3.ut.reset_nls; end; - procedure success_on_same_data_with_float + procedure success_on_same_data_float as l_expected sys_refcursor; l_actual sys_refcursor; diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index d9773affc..d0b9a6e54 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -18,7 +18,7 @@ create or replace package test_expectations_cursor is procedure success_on_same_data; --%test(Gives success for identical data with floats) - procedure success_on_same_data_with_float; + procedure success_on_same_data_float; --%test(Gives success when both cursors are empty) procedure success_on_empty; From 65380635e2c655f3a1acc7b6e325fb6155cd579a Mon Sep 17 00:00:00 2001 From: Edgars Cupits Date: Sat, 6 Apr 2019 18:56:40 +0300 Subject: [PATCH 063/181] fix/ORA-00907: wrong schema name in test case check --- test/ut3_user/expectations/test_expectations_cursor.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 0f6ad0ecc..f8bb92878 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -100,7 +100,7 @@ create or replace package body test_expectations_cursor is --Act ut3.ut.expect( l_actual ).to_equal( l_expected ); --Assert - ut.expect(expectations.failed_expectations_data()).to_be_empty(); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); ut3.ut.reset_nls; end; From 977c579c9ab114c04fca5a053ddeaca580d2a996 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 7 Apr 2019 07:54:42 +0000 Subject: [PATCH 064/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 40700d995..2b057b93d 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 534a12ddf..46051611c 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 9d003f57b..14ba3dfc2 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index e3787fa89..f82becc51 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 8cee8860a..8413ad1a6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index c2e24a6d5..4b0dee565 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 15e5394c7..5abbade94 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index b5a5a4dcd..bd8afc899 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 7793b7b73..284fc4d2a 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 5ff9eca9c..5a20b1c05 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index d6508f9d0..4f94f540d 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 79fc7caf8..ff43f1c40 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 7a982043c..2f97efe65 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index f55cbce7d..6ff606fc5 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index b46a97080..2687cff90 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 951fdfa82..14b901860 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 7aff312bf..db5dacaa5 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2808--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 1e5588f7d..4bf155ce7 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2808-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2825-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 45d6e7a8c84be6f0fe1bab3ac86420a11cb8c6cc Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 8 Apr 2019 15:19:35 +0100 Subject: [PATCH 065/181] Call stack differs based on version --- test/ut3_user/expectations/test_expectations_cursor.pkb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 757c3dd26..98e0ad5c7 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2530,7 +2530,7 @@ Diff:% begin l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01722: invalid number -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR.XML_ERROR_ACTUAL", line 2542 ut3.ut.expect(l_actual).to_equal(l_expected); +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2542 ut3.ut.expect(l_actual).to_equal(l_expected); Check the query and data for errors.'; open l_actual for @@ -2539,7 +2539,7 @@ Check the query and data for errors.'; open l_expected for select c_price as usd_price_amt, c_user as update_id from dual; - ut3.ut.expect(l_actual).to_equal(l_expected); + ut3.ut.expect(l_actual).to_be_like(l_expected); --Line that error relates to in expected messag ut.fail('Expected exception on cursor fetch'); @@ -2556,7 +2556,7 @@ Check the query and data for errors.'; l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR.XML_ERROR_EXPECTED", line 2567 ut3.ut.expect(l_actual).to_equal(l_expected); +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2567 ut3.ut.expect(l_actual).to_equal(l_expected); Check the query and data for errors.'; open l_expected for @@ -2564,7 +2564,7 @@ Check the query and data for errors.'; open l_actual for select 1 as test from dual; - ut3.ut.expect(l_actual).to_equal(l_expected); + ut3.ut.expect(l_actual).to_be_like(l_expected); ut.fail('Expected exception on cursor fetch'); exception From 0025dd9327c060a63e733c6d719ec88f5b48f4af Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 8 Apr 2019 15:31:22 +0100 Subject: [PATCH 066/181] Fix typo --- test/ut3_user/expectations/test_expectations_cursor.pkb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 901beafc6..d5bf100f5 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2561,13 +2561,13 @@ Check the query and data for errors.'; open l_expected for select c_price as usd_price_amt, c_user as update_id from dual; - ut3.ut.expect(l_actual).to_be_like(l_expected); + ut3.ut.expect(l_actual).to_equal(l_expected); --Line that error relates to in expected messag ut.fail('Expected exception on cursor fetch'); exception when others then - ut.expect(sqlerrm).to_equal(l_exp_message); + ut.expect(sqlerrm).to_be_like(l_exp_message); end; procedure xml_error_expected is @@ -2586,12 +2586,12 @@ Check the query and data for errors.'; open l_actual for select 1 as test from dual; - ut3.ut.expect(l_actual).to_be_like(l_expected); + ut3.ut.expect(l_actual).to_equal(l_expected); ut.fail('Expected exception on cursor fetch'); exception when others then - ut.expect(sqlerrm).to_equal(l_exp_message); + ut.expect(sqlerrm).to_be_like(l_exp_message); end; end; From 3428fa8b1f9c1811e8038569d103e4284cbcef6e Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 8 Apr 2019 15:41:47 +0100 Subject: [PATCH 067/181] Update error lines --- test/ut3_user/expectations/test_expectations_cursor.pkb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index d5bf100f5..5d59c75d9 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2552,7 +2552,7 @@ Diff:% begin l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01722: invalid number -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2542 ut3.ut.expect(l_actual).to_equal(l_expected); +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2564 ut3.ut.expect(l_actual).to_equal(l_expected); Check the query and data for errors.'; open l_actual for @@ -2578,7 +2578,7 @@ Check the query and data for errors.'; l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2567 ut3.ut.expect(l_actual).to_equal(l_expected); +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2589 ut3.ut.expect(l_actual).to_equal(l_expected); Check the query and data for errors.'; open l_expected for From 80a46d0a903b453c64afae73f51de7ecc26f3a3e Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 8 Apr 2019 16:01:14 +0100 Subject: [PATCH 068/181] Adding ROWID to list of types that do not provide a length. --- .../data_values/ut_compound_data_helper.pkb | 15 +++++++++++++-- .../data_values/ut_compound_data_helper.pks | 5 +++++ .../expectations/test_expectations_cursor.pkb | 12 ++++++++++++ .../expectations/test_expectations_cursor.pks | 3 +++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index f68ee2a6f..a9ded7932 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -231,8 +231,7 @@ create or replace package body ut_compound_data_helper is elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('DATE','TIMESTAMP','TIMESTAMP WITH TIME ZONE', 'TIMESTAMP WITH LOCAL TIME ZONE') then l_col_type := 'VARCHAR2(50)'; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('INTERVAL DAY TO SECOND', - 'INTERVAL YEAR TO MONTH', 'BINARY_FLOAT', 'BINARY_DOUBLE') then + elsif a_data_info.is_sql_diffable = 1 and type_no_length(a_data_info.column_type) then l_col_type := a_data_info.column_type; else l_col_type := a_data_info.column_type @@ -570,6 +569,8 @@ create or replace package body ut_compound_data_helper is --clob/blob/xmltype/object/nestedcursor/nestedtable if a_type_name IN (g_type_name_map(dbms_sql.blob_type), g_type_name_map(dbms_sql.clob_type), + g_type_name_map(dbms_sql.long_type), + g_type_name_map(dbms_sql.long_raw_type), g_type_name_map(dbms_sql.bfile_type), g_anytype_name_map(dbms_types.typecode_namedcollection)) then @@ -605,6 +606,16 @@ create or replace package body ut_compound_data_helper is 'Check the query and data for errors.'; end; + function type_no_length ( a_type_name varchar2) return boolean is + begin + return case + when a_type_name in ('INTERVAL DAY TO SECOND','INTERVAL YEAR TO MONTH', 'BINARY_FLOAT', 'BINARY_DOUBLE','ROWID') then + true + else + false + end; + end; + begin g_anytype_name_map(dbms_types.typecode_date) := 'DATE'; g_anytype_name_map(dbms_types.typecode_number) := 'NUMBER'; diff --git a/source/expectations/data_values/ut_compound_data_helper.pks b/source/expectations/data_values/ut_compound_data_helper.pks index 62d5c8a27..1c00d2263 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pks +++ b/source/expectations/data_values/ut_compound_data_helper.pks @@ -94,5 +94,10 @@ create or replace package ut_compound_data_helper authid definer is function create_err_cursor_msg(a_error_stack varchar2) return varchar2; + /* + * Function to return true or false if the type dont have an length + */ + function type_no_length ( a_type_name varchar2) return boolean; + end; / diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 5d59c75d9..4713d14e0 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2594,5 +2594,17 @@ Check the query and data for errors.'; ut.expect(sqlerrm).to_be_like(l_exp_message); end; + procedure rowid_refcursor is + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + open l_expected for + select rowid as test from dual; + open l_actual for + select rowid as test from dual; + + ut3.ut.expect(l_actual).to_equal(l_expected); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; end; / diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index b41ff005e..a2a74aeb2 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -405,6 +405,9 @@ create or replace package test_expectations_cursor is --%test(Fail to process a cursor for expected) procedure xml_error_expected; + + --%test(Check that cursor correctly handles ROWID dataype) + procedure rowid_refcursor; end; / From 296102aedcdfbe05c5d31051f5dcd2d74332da65 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 8 Apr 2019 16:19:49 +0100 Subject: [PATCH 069/181] cleaning up tests --- test/ut3_user/expectations/test_expectations_cursor.pkb | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 4713d14e0..09ad973bd 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2544,22 +2544,19 @@ Diff:% end; procedure xml_error_actual is - c_price CONSTANT NUMBER(20,4):= 1357; - c_user CONSTANT varchar2(30):= 'TEST_USER'; l_actual sys_refcursor; l_expected sys_refcursor; l_exp_message varchar2(32000); begin l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01722: invalid number -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2564 ut3.ut.expect(l_actual).to_equal(l_expected); +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2561 ut3.ut.expect(l_actual).to_equal(l_expected); Check the query and data for errors.'; open l_actual for - select cast(null as number(10)) as usd_price_amt, c_user as update_id - from dual where dummy = 1; + select cast(null as number(10)) as usd_price_amt from dual where dummy = 1; open l_expected for - select c_price as usd_price_amt, c_user as update_id from dual; + select 1357 as usd_price_amt from dual; ut3.ut.expect(l_actual).to_equal(l_expected); --Line that error relates to in expected messag From b399115f248252baad62c63c47a92072c176d2fd Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 8 Apr 2019 16:28:38 +0100 Subject: [PATCH 070/181] Update tests --- test/ut3_user/expectations/test_expectations_cursor.pkb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 09ad973bd..016c0c3db 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2549,14 +2549,14 @@ Diff:% l_exp_message varchar2(32000); begin l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: -ORA-01722: invalid number +ORA-01476: divisor is equal to zero at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2561 ut3.ut.expect(l_actual).to_equal(l_expected); Check the query and data for errors.'; open l_actual for - select cast(null as number(10)) as usd_price_amt from dual where dummy = 1; + select 1 as test from dual; open l_expected for - select 1357 as usd_price_amt from dual; + select 1/0 as test from dual; ut3.ut.expect(l_actual).to_equal(l_expected); --Line that error relates to in expected messag @@ -2575,7 +2575,7 @@ Check the query and data for errors.'; l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2589 ut3.ut.expect(l_actual).to_equal(l_expected); +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2586 ut3.ut.expect(l_actual).to_equal(l_expected); Check the query and data for errors.'; open l_expected for From b051324c64fb0d4944265f005ae986bca57fbd31 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 8 Apr 2019 17:34:26 +0100 Subject: [PATCH 071/181] testing wildcard, there is some unexpected white space that is not appearing on local tests or other similar for expected. --- test/ut3_user/expectations/test_expectations_cursor.pkb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 016c0c3db..21ea9a697 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2550,7 +2550,7 @@ Diff:% begin l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2561 ut3.ut.expect(l_actual).to_equal(l_expected); +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2561 ut3.ut.expect(l_actual).to_equal(l_expected);% Check the query and data for errors.'; open l_actual for @@ -2575,7 +2575,7 @@ Check the query and data for errors.'; l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2586 ut3.ut.expect(l_actual).to_equal(l_expected); +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2586 ut3.ut.expect(l_actual).to_equal(l_expected);% Check the query and data for errors.'; open l_expected for From 10e651f247ec4279a4c64ddb102b74e579f6a0fd Mon Sep 17 00:00:00 2001 From: lwasylow Date: Tue, 9 Apr 2019 08:57:51 +0100 Subject: [PATCH 072/181] Fix : No length datatypes mapping. This is to address issue when Oracle dont expect a length value against data type but cursor description return a max_len not being null. --- .../data_values/ut_compound_data_helper.pkb | 15 +++++++++-- .../expectations/test_expectations_cursor.pkb | 25 +++++++++++++++---- .../expectations/test_expectations_cursor.pks | 4 +-- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index a9ded7932..3c1a743cb 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -18,8 +18,10 @@ create or replace package body ut_compound_data_helper is 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; g_compare_sql_template varchar2(4000) := q'[ @@ -609,7 +611,7 @@ create or replace package body ut_compound_data_helper is function type_no_length ( a_type_name varchar2) return boolean is begin return case - when a_type_name in ('INTERVAL DAY TO SECOND','INTERVAL YEAR TO MONTH', 'BINARY_FLOAT', 'BINARY_DOUBLE','ROWID') then + when g_type_no_length_map.exists(a_type_name) then true else false @@ -661,6 +663,15 @@ begin g_type_name_map( dbms_sql.urowid_type ) := 'UROWID'; g_type_name_map( dbms_sql.user_defined_type ) := 'USER_DEFINED_TYPE'; 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. + */ + g_type_no_length_map('ROWID') := 'ROWID'; + g_type_no_length_map('INTERVAL DAY TO SECOND') := 'INTERVAL DAY TO SECOND'; + g_type_no_length_map('INTERVAL YEAR TO MONTH') := 'INTERVAL YEAR TO MONTH'; + g_type_no_length_map('BINARY_DOUBLE') := 'BINARY_DOUBLE'; + g_type_no_length_map('BINARY_FLOAT') := 'BINARY_FLOAT'; end; / diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 21ea9a697..9b41a259c 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2591,17 +2591,32 @@ Check the query and data for errors.'; ut.expect(sqlerrm).to_be_like(l_exp_message); end; - procedure rowid_refcursor is + procedure no_length_datatypes is l_actual sys_refcursor; l_expected sys_refcursor; begin + ut3.ut.set_nls; open l_expected for - select rowid as test from dual; + select cast(3.14 as binary_double) as pi_double, + cast(3.14 as binary_float) as pi_float, + rowid as row_rowid, + numtodsinterval(1.12345678912, 'day') row_ds_interval, + numtoyminterval(1.1, 'year') row_ym_interval + from dual; + open l_actual for - select rowid as test from dual; - - ut3.ut.expect(l_actual).to_equal(l_expected); + select cast(3.14 as binary_double) as pi_double, + cast(3.14 as binary_float) as pi_float, + rowid as row_rowid, + numtodsinterval(1.12345678912, 'day') row_ds_interval, + numtoyminterval(1.1, 'year') row_ym_interval + from dual; + --Act + ut3.ut.expect( l_actual ).to_equal( l_expected ); + --Assert ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + ut3.ut.reset_nls; + end; end; / diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index a2a74aeb2..b662ba61b 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -406,8 +406,8 @@ create or replace package test_expectations_cursor is --%test(Fail to process a cursor for expected) procedure xml_error_expected; - --%test(Check that cursor correctly handles ROWID dataype) - procedure rowid_refcursor; + --%test(Check that cursor correctly handles no length dataypes) + procedure no_length_datatypes; end; / From a4a33fb0e9e22fd624747d10627ee5a8a2242505 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Wed, 10 Apr 2019 09:13:38 +0100 Subject: [PATCH 073/181] Update test --- source/expectations/data_values/ut_compound_data_helper.pkb | 4 ++-- test/ut3_user/expectations/test_expectations_cursor.pkb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 3c1a743cb..dd55036bb 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -603,8 +603,8 @@ create or replace package body ut_compound_data_helper is function create_err_cursor_msg(a_error_stack varchar2) return varchar2 is begin return 'SQL exception thrown when fetching data from cursor:'|| - trim(ut_utils.remove_error_from_stack(sqlerrm,ut_utils.gc_xml_processing))||chr(10)|| - trim(ut_expectation_processor.who_called_expectation(a_error_stack))|| + ut_utils.remove_error_from_stack(sqlerrm,ut_utils.gc_xml_processing)||chr(10)|| + ut_expectation_processor.who_called_expectation(a_error_stack)|| 'Check the query and data for errors.'; end; diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 9b41a259c..8e7bb24c3 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2550,7 +2550,7 @@ Diff:% begin l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2561 ut3.ut.expect(l_actual).to_equal(l_expected);% +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2561 ut3.ut.expect(l_actual).to_equal(l_expected); Check the query and data for errors.'; open l_actual for @@ -2575,7 +2575,7 @@ Check the query and data for errors.'; l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2586 ut3.ut.expect(l_actual).to_equal(l_expected);% +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2586 ut3.ut.expect(l_actual).to_equal(l_expected); Check the query and data for errors.'; open l_expected for From f5331aca8cacc1745a4c7b308c053bd75c373474 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 12 Apr 2019 08:16:27 +0100 Subject: [PATCH 074/181] Mysterious whitespace appears from time to time. TODO --- test/ut3_user/expectations/test_expectations_cursor.pkb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 8e7bb24c3..9b41a259c 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2550,7 +2550,7 @@ Diff:% begin l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2561 ut3.ut.expect(l_actual).to_equal(l_expected); +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2561 ut3.ut.expect(l_actual).to_equal(l_expected);% Check the query and data for errors.'; open l_actual for @@ -2575,7 +2575,7 @@ Check the query and data for errors.'; l_exp_message :='ORA-20218: SQL exception thrown when fetching data from cursor: ORA-01476: divisor is equal to zero -at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2586 ut3.ut.expect(l_actual).to_equal(l_expected); +at "UT3$USER#.TEST_EXPECTATIONS_CURSOR%", line 2586 ut3.ut.expect(l_actual).to_equal(l_expected);% Check the query and data for errors.'; open l_expected for From 0e2eaa50625594794281706b96186badc500f691 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Fri, 12 Apr 2019 14:00:13 +0000 Subject: [PATCH 075/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pks | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 2b057b93d..b58f18e59 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 46051611c..0c021ca52 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 14ba3dfc2..7e9b0b993 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index f82becc51..5e5d494e8 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 8413ad1a6..c1eadea30 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 4b0dee565..b4965fcdf 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 5abbade94..2ffaf169b 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index bd8afc899..9d4887a53 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 284fc4d2a..05eb7080b 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 5a20b1c05..647a2703c 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 4f94f540d..9132aa28f 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index ff43f1c40..801199bc4 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 2f97efe65..d8c3aaed8 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 6ff606fc5..799602e44 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 2687cff90..fb4832b4b 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 14b901860..386ff08f1 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index db5dacaa5..769d0ebbb 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2825--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index abe3b2d90..ebb9780ad 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2825-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2844-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 3bdd5406fdb34fea81f9be89a9c1cf5e9006b31c Mon Sep 17 00:00:00 2001 From: Lukasz Date: Sun, 14 Apr 2019 13:08:04 +0100 Subject: [PATCH 076/181] Fixing issue with a special column names non XML compliant (#903) * Fixing issue with a special column names that do not adhere to XML rules. * removing unused global constant. * Modification after PR comments. Inline call to function. Remove constants to be private. Expose only one function rest to be private --- source/core/ut_utils.pkb | 50 +++++++++++++++- source/core/ut_utils.pks | 9 ++- .../data_values/ut_compound_data_helper.pkb | 4 +- .../data_values/ut_cursor_column.tpb | 23 +++++--- .../data_values/ut_cursor_column.tps | 7 ++- .../expectations/test_expectations_cursor.pkb | 59 +++++++++++++++++++ .../expectations/test_expectations_cursor.pks | 9 +++ 7 files changed, 144 insertions(+), 17 deletions(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 25ef3fb3f..c77a233ae 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -16,6 +16,13 @@ create or replace package body ut_utils is limitations under the License. */ + /** + * Constants regex used to validate XML name + */ + gc_invalid_first_xml_char constant varchar2(50) := '[^_a-zA-Z]'; + gc_invalid_xml_char constant varchar2(50) := '[^_a-zA-Z0-9\.-]'; + 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 return case when a_quote_char is not null then a_quote_char||a_value||a_quote_char else a_value end; @@ -749,8 +756,47 @@ create or replace package body ut_utils is ,modifier => 'm'); return l_caller_stack_line; end; - - + + /** + * Change string into unicode to match xmlgen format _00_ + * 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 8.2.1.1 + */ + function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is + begin + 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 + 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 + if i.level_no = 1 and regexp_like(i.string_char,gc_invalid_first_xml_char) then + l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char); + elsif regexp_like(i.string_char,gc_invalid_xml_char) then + l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char); + else + l_post_processed := l_post_processed || i.string_char; + end if; + end loop; + return l_post_processed; + end; + + function get_valid_xml_name(a_name varchar2) return varchar2 is + l_valid_name varchar2(4000); + begin + if regexp_like(a_name,gc_full_valid_xml_name) then + l_valid_name := a_name; + else + l_valid_name := build_valid_xml_name(a_name); + end if; + return l_valid_name; + end; end ut_utils; / diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index ebb9780ad..63c5fbe18 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -22,7 +22,7 @@ create or replace package ut_utils authid definer is */ gc_version constant varchar2(50) := 'v3.1.7.2844-develop'; - + subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; gc_before_each constant t_executable_type := 'beforeeach'; @@ -381,6 +381,11 @@ create or replace package ut_utils authid definer is * Remove given ORA error from stack */ function remove_error_from_stack(a_error_stack varchar2, a_ora_code number) return varchar2; - + + /** + * Check if xml name is valid if not build a valid name + */ + function get_valid_xml_name(a_name varchar2) return varchar2; + end ut_utils; / diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index dd55036bb..322b9b215 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -80,13 +80,13 @@ create or replace package body ut_compound_data_helper is begin execute immediate q'[with expected_cols as ( - select access_path exp_column_name,column_position exp_col_pos, + 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 access_path act_column_name,column_position act_col_pos, + 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 diff --git a/source/expectations/data_values/ut_cursor_column.tpb b/source/expectations/data_values/ut_cursor_column.tpb index 5f6f18c56..8f26f58aa 100644 --- a/source/expectations/data_values/ut_cursor_column.tpb +++ b/source/expectations/data_values/ut_cursor_column.tpb @@ -13,17 +13,24 @@ create or replace type body ut_cursor_column as self.column_len := a_col_max_len; --length of column self.column_name := TRIM( BOTH '''' FROM a_col_name); --name of the column self.column_type_name := coalesce(a_col_type_name,a_col_type); --type name e.g. test_dummy_object or varchar2 - self.access_path := case when a_access_path is null then + self.xml_valid_name := ut_utils.get_valid_xml_name(self.column_name); + 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 - self.xml_valid_name := '"'||self.column_name||'"'; --User friendly column name - self.transformed_name := case when self.parent_name is null then - self.xml_valid_name - else - '"'||ut_compound_data_helper.get_fixed_size_hash(self.parent_name||self.column_name)||'"' - end; --when is nestd we need to hash name to make sure we dont exceed 30 char + end; --Access path used for incldue exclude eg/ TEST_DUMMY_OBJECT/VARCHAR2 + 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 incldue exclude eg/ TEST_DUMMY_OBJECT/VARCHAR2 + 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)||'"' + 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 self.column_type := a_col_type; --column type e.g. user_defined , varchar2 self.column_schema := a_col_schema_name; -- schema name self.is_sql_diffable := case diff --git a/source/expectations/data_values/ut_cursor_column.tps b/source/expectations/data_values/ut_cursor_column.tps index 4b436051a..f55973e16 100644 --- a/source/expectations/data_values/ut_cursor_column.tps +++ b/source/expectations/data_values/ut_cursor_column.tps @@ -17,12 +17,13 @@ create or replace type ut_cursor_column force authid current_user as object ( */ parent_name varchar2(4000), access_path varchar2(4000), + display_path varchar2(4000), has_nested_col number(1,0), - transformed_name varchar2(32), + transformed_name varchar2(2000), hierarchy_level number, column_position number, - xml_valid_name varchar2(128), - column_name varchar2(128), + xml_valid_name varchar2(2000), + column_name varchar2(2000), column_type varchar2(128), column_type_name varchar2(128), column_schema varchar2(128), diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 9b41a259c..4a490349b 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2618,5 +2618,64 @@ Check the query and data for errors.'; ut3.ut.reset_nls; end; + + procedure colon_part_of_columnname is + type t_key_val_rec is record( + key varchar2(100), + value varchar2(100)); + + l_act t_key_val_rec; + l_exp t_key_val_rec; + l_act_cur sys_refcursor; + l_exp_cur sys_refcursor; + begin + l_act.key := 'NAME'; + l_act.value := 'TEST'; + l_exp.key := 'NAME'; + l_exp.value := 'TEST'; + + OPEN l_act_cur FOR SELECT l_act.key, l_act.value + FROM dual; + + OPEN l_exp_cur FOR SELECT l_exp.key, l_exp.value + FROM dual; + + ut3.ut.expect(l_act_cur).to_equal(l_exp_cur); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + + end; + + procedure specialchar_part_of_colname is + l_act_cur sys_refcursor; + l_exp_cur sys_refcursor; + begin + + OPEN l_act_cur FOR SELECT 1 as "$Test", 2 as "&Test" + FROM dual; + + OPEN l_exp_cur FOR SELECT 1 as "$Test", 2 as "&Test" + FROM dual; + + ut3.ut.expect(l_act_cur).to_equal(l_exp_cur); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + + end; + + procedure nonxmlchar_part_of_colname is + l_act_cur sys_refcursor; + l_exp_cur sys_refcursor; + begin + + OPEN l_act_cur FOR SELECT 1 as "", 2 as "_Test", 3 as ".Test>" + FROM dual; + + OPEN l_exp_cur FOR SELECT 1 as "", 2 as "_Test", 3 as ".Test>" + FROM dual; + + ut3.ut.expect(l_act_cur).to_equal(l_exp_cur); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + + end; + end; / diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index b662ba61b..dd088cff8 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -408,6 +408,15 @@ create or replace package test_expectations_cursor is --%test(Check that cursor correctly handles no length dataypes) procedure no_length_datatypes; + + --%test(Check that colon is converted properly fix #902) + procedure colon_part_of_columnname; + + --%test(Check that column name accept special characters fix #902) + procedure specialchar_part_of_colname; + + --%test(Check that column name accept non xml characters fix #902) + procedure nonxmlchar_part_of_colname; end; / From 421888e07336277f9b91c855adaefb20ebab0fb3 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 14 Apr 2019 12:18:36 +0000 Subject: [PATCH 077/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index b58f18e59..ec79d645c 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 0c021ca52..3f6cffed3 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 7e9b0b993..497d20418 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 5e5d494e8..f1f3615b3 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index c1eadea30..d448537b9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index b4965fcdf..556d97129 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 2ffaf169b..922ab5227 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 9d4887a53..cc41a86a5 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 05eb7080b..8de2fdb27 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 647a2703c..be73ccf6d 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 9132aa28f..2e030665b 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 801199bc4..babf5a51b 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index d8c3aaed8..060974505 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 799602e44..488db9204 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index fb4832b4b..494f9ef6a 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 386ff08f1..4cdc4fb7c 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 769d0ebbb..fa03c5a19 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2844--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index c77a233ae..dcf24f2e4 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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 8.2.1.1 + * secion v3.1.7.2851-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 63c5fbe18..bfb3bc219 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2844-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2851-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 96b8480190931defc7752d42e7155055ec893e2e Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Fri, 15 Mar 2019 20:04:15 +0000 Subject: [PATCH 078/181] Adding trigger solution for annotation parsing. --- docs/userguide/install.md | 2 + source/check_sys_grants.sql | 6 +- .../annotations/ut_annotation_cache_info.sql | 2 +- .../ut_annotation_cache_manager.pkb | 73 ++++++++++---- .../ut_annotation_cache_manager.pks | 4 +- .../ut_annotation_cache_schema.sql | 21 ++++ .../annotations/ut_annotation_manager.pkb | 99 +++++++++++++++---- .../annotations/ut_annotation_manager.pks | 5 + .../ut_trigger_annotation_parsing.trg | 15 +++ source/core/annotations/ut_trigger_check.pkb | 40 ++++++++ source/core/annotations/ut_trigger_check.pks | 28 ++++++ source/create_utplsql_owner.sql | 2 +- source/install.sql | 4 + source/uninstall_objects.sql | 6 ++ 14 files changed, 264 insertions(+), 43 deletions(-) create mode 100644 source/core/annotations/ut_annotation_cache_schema.sql create mode 100644 source/core/annotations/ut_trigger_annotation_parsing.trg create mode 100644 source/core/annotations/ut_trigger_check.pkb create mode 100644 source/core/annotations/ut_trigger_check.pks diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 060974505..f3acc6292 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -121,6 +121,8 @@ The uninstall process will **not** drop profiler tables, as they can potentially It is up to DBA to maintain the storage of the profiler tables. +Additionally the user performing the installation must have a `ADMINISTER DATABASE TRIGGER` privilege. This is required for installation of trigger that is responsible for parsing annotations at at compile-time of a package. + # Manual installation procedure ### Creating schema for utPLSQL diff --git a/source/check_sys_grants.sql b/source/check_sys_grants.sql index e16869e54..ae861ed33 100644 --- a/source/check_sys_grants.sql +++ b/source/check_sys_grants.sql @@ -1,7 +1,7 @@ declare c_expected_grants constant dbmsoutput_linesarray := dbmsoutput_linesarray( - 'CREATE TYPE','CREATE VIEW','CREATE SYNONYM','CREATE SEQUENCE','CREATE PROCEDURE','CREATE TABLE' + 'CREATE TYPE','CREATE VIEW','CREATE SYNONYM','CREATE SEQUENCE','CREATE PROCEDURE','CREATE TABLE', 'ADMINISTER DATABASE TRIGGER' ); l_expected_grants dbmsoutput_linesarray := c_expected_grants; @@ -9,7 +9,9 @@ declare begin if user != SYS_CONTEXT('userenv','current_schema') then for i in 1 .. l_expected_grants.count loop - l_expected_grants(i) := replace(l_expected_grants(i),' ',' ANY '); + if l_expected_grants(i) != 'ADMINISTER DATABASE TRIGGER' then + l_expected_grants(i) := replace(l_expected_grants(i),' ',' ANY '); + end if; end loop; end if; select listagg(' - '||privilege,CHR(10)) within group(order by privilege) diff --git a/source/core/annotations/ut_annotation_cache_info.sql b/source/core/annotations/ut_annotation_cache_info.sql index fa7eabeec..811f105a5 100644 --- a/source/core/annotations/ut_annotation_cache_info.sql +++ b/source/core/annotations/ut_annotation_cache_info.sql @@ -18,6 +18,6 @@ create table ut_annotation_cache_info ( object_type varchar2(250) not null, parse_time timestamp not null, constraint ut_annotation_cache_info_pk primary key(cache_id), - constraint ut_annotation_cache_info_uk unique (object_owner, object_name, object_type) + constraint ut_annotation_cache_info_uk unique (object_owner, object_type, object_name) ) organization index; diff --git a/source/core/annotations/ut_annotation_cache_manager.pkb b/source/core/annotations/ut_annotation_cache_manager.pkb index 5c40be5b7..bf6d5e112 100644 --- a/source/core/annotations/ut_annotation_cache_manager.pkb +++ b/source/core/annotations/ut_annotation_cache_manager.pkb @@ -18,22 +18,40 @@ create or replace package body ut_annotation_cache_manager as procedure update_cache(a_object ut_annotated_object) is l_cache_id integer; + l_new_objects_count integer := 0; pragma autonomous_transaction; begin - update ut_annotation_cache_info i - set i.parse_time = systimestamp - 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; - if sql%rowcount = 0 then - insert into ut_annotation_cache_info - (cache_id, object_owner, object_name, object_type, parse_time) - values (ut_annotation_cache_seq.nextval, a_object.object_owner, a_object.object_name, a_object.object_type, systimestamp) + -- if not in trigger, or object has annotations + if ora_sysevent is null or a_object.annotations is not null and a_object.annotations.count > 0 then + + update ut_annotation_cache_info i + set i.parse_time = systimestamp + 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; + + if sql%rowcount = 0 then + + insert into ut_annotation_cache_info + (cache_id, object_owner, object_name, object_type, parse_time) + values (ut_annotation_cache_seq.nextval, a_object.object_owner, a_object.object_name, a_object.object_type, systimestamp) + returning cache_id into l_cache_id; + l_new_objects_count := 1; + end if; + end if; - delete from ut_annotation_cache c - where cache_id = l_cache_id; + update ut_annotation_cache_schema s + set s.object_count = s.object_count + l_new_objects_count, s.max_parse_time = systimestamp + where s.object_type = a_object.object_type and s.object_owner = a_object.object_owner; + + if sql%rowcount = 0 then + insert into ut_annotation_cache_schema s + (object_owner, object_type, object_count, max_parse_time) + values (a_object.object_owner, a_object.object_type, l_new_objects_count, systimestamp); + end if; + + delete from ut_annotation_cache c where cache_id = l_cache_id; if a_object.annotations is not null and a_object.annotations.count > 0 then insert into ut_annotation_cache @@ -73,17 +91,32 @@ create or replace package body ut_annotation_cache_manager as commit; 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 + 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 + when no_data_found then + null; + end; + return l_result; + end; + procedure remove_from_cache(a_objects ut_annotation_objs_cache_info) is pragma autonomous_transaction; begin 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 - ); + 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 + ); commit; end; @@ -139,6 +172,12 @@ create or replace package body ut_annotation_cache_manager as delete from ut_annotation_cache_info i where ' || l_filter using a_object_owner, a_object_type; + + execute immediate ' + delete from ut_annotation_cache_schema s + where ' || l_filter + using a_object_owner, a_object_type; + commit; end; diff --git a/source/core/annotations/ut_annotation_cache_manager.pks b/source/core/annotations/ut_annotation_cache_manager.pks index 1279c8cc3..ab794ceb1 100644 --- a/source/core/annotations/ut_annotation_cache_manager.pks +++ b/source/core/annotations/ut_annotation_cache_manager.pks @@ -15,7 +15,7 @@ create or replace package ut_annotation_cache_manager authid definer as See the License for the specific language governing permissions and limitations under the License. */ - + subtype t_cache_schema_info is ut_annotation_cache_schema%rowtype; /** * Populates cache with information about object and it's annotations * Cache information for individual object is modified by this code @@ -34,6 +34,8 @@ create or replace package ut_annotation_cache_manager authid definer as */ function get_annotations_for_objects(a_cached_objects ut_annotation_objs_cache_info, a_parse_time timestamp) return sys_refcursor; + function get_cache_schema_info(a_object_owner varchar2, a_object_type varchar2) return t_cache_schema_info; + /** * Removes cached information about annotations for objects on the list and updates parse_time in cache info table. * diff --git a/source/core/annotations/ut_annotation_cache_schema.sql b/source/core/annotations/ut_annotation_cache_schema.sql new file mode 100644 index 000000000..77b45fe3e --- /dev/null +++ b/source/core/annotations/ut_annotation_cache_schema.sql @@ -0,0 +1,21 @@ +create table ut_annotation_cache_schema ( + /* + utPLSQL - Version 3 + Copyright 2016 - 2017 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. + */ + object_owner varchar2(250) not null, + object_type varchar2(250) not null, + object_count integer not null, + max_parse_time date not null, + constraint ut_annotation_cache_schema_pk primary key(object_owner, object_type) +) organization index; + diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 87ad51475..f5daaa95a 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -58,26 +58,39 @@ create or replace package body ut_annotation_manager as l_cursor_text varchar2(32767); l_result ut_annotation_objs_cache_info; begin - l_cursor_text := - q'[select ]'||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 => case when o.last_ddl_time < cast(i.parse_time as date) then 'N' else 'Y' end - ) - from ]'||l_objects_view||q'[ o - left join ]'||l_ut_owner||q'[.ut_annotation_cache_info i - on o.owner = i.object_owner - and o.object_name = i.object_name - and o.object_type = i.object_type - where o.owner = ']'||a_object_owner||q'[' - and o.object_type = ']'||a_object_type||q'[' - and ]' - || case - when a_parse_date is null - then ':a_parse_date is null' - else 'o.last_ddl_time >= cast(:a_parse_date as date)' - end; + if ut_trigger_check.is_alive() then + l_cursor_text := + q'[select ]'||l_ut_owner||q'[.ut_annotation_obj_cache_info( + object_owner => i.object_owner, + object_name => i.object_name, + object_type => i.object_type, + needs_refresh => 'N' + ) + from ]'||l_ut_owner||q'[.ut_annotation_cache_info i + where i.object_owner = :a_object_owner + and i.object_type = :a_object_type]'; + else + l_cursor_text := + q'[select ]'||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 => case when o.last_ddl_time < cast(i.parse_time as date) then 'N' else 'Y' end + ) + from ]'||l_objects_view||q'[ o + left join ]'||l_ut_owner||q'[.ut_annotation_cache_info i + on o.owner = i.object_owner + and o.object_name = i.object_name + and o.object_type = i.object_type + where o.owner = ']'||a_object_owner||q'[' + and o.object_type = ']'||a_object_type||q'[' + and ]' + || case + when a_parse_date is null + then ':a_parse_date is null' + else 'o.last_ddl_time >= cast(:a_parse_date as date)' + end; + end if; open l_rows for l_cursor_text using a_parse_date; fetch l_rows bulk collect into l_result limit 1000000; close l_rows; @@ -222,11 +235,55 @@ create or replace package body ut_annotation_manager as ); end; + procedure trigger_obj_annotation_rebuild is + l_sql_text ora_name_list_t; + l_parts binary_integer; + l_object_to_parse ut_annotation_obj_cache_info; + + 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; + l_sql_lines ut_varchar2_rows := ut_varchar2_rows(); + l_result sys_refcursor; + l_sql_text ora_name_list_t := a_sql_text; + begin + if a_parts > 0 then + l_sql_text(1) := regexp_replace(l_sql_text(1),'^\s*create(\s+or\s+replace)?\s+', modifier => 'i'); + for i in 1..a_parts loop + ut_utils.append_to_clob(l_sql_clob, l_sql_text(i)); + end loop; + l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) ); + end if; + open l_result for + select a_object_name as name, column_value||chr(10) as text from table(l_sql_lines); + return l_result; + end; + begin + ut_trigger_check.is_alive(); + + if ora_dict_obj_type = 'PACKAGE' then + + l_object_to_parse := ut_annotation_obj_cache_info(ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type, 'Y'); + + if ora_sysevent = 'CREATE' then + l_parts := ORA_SQL_TXT(l_sql_text); + 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) + ); + elsif ora_sysevent = 'ALTER' then + null; + --update parse_time + elsif ora_sysevent = 'DROP' then + ut_annotation_cache_manager.remove_from_cache(ut_annotation_objs_cache_info(l_object_to_parse)); + end if; + end if; + end; + function get_annotated_objects(a_object_owner varchar2, a_object_type varchar2, a_parse_date timestamp := null) return ut_annotated_objects pipelined is l_info_rows ut_annotation_objs_cache_info; l_cursor sys_refcursor; l_results ut_annotated_objects; - c_object_fetch_limit constant integer := 10; + c_object_fetch_limit constant integer := 10; begin l_info_rows := get_annotation_objs_info(a_object_owner, a_object_type, a_parse_date); diff --git a/source/core/annotations/ut_annotation_manager.pks b/source/core/annotations/ut_annotation_manager.pks index 25de25d58..729d2d4ee 100644 --- a/source/core/annotations/ut_annotation_manager.pks +++ b/source/core/annotations/ut_annotation_manager.pks @@ -43,6 +43,11 @@ create or replace package ut_annotation_manager authid current_user as */ procedure rebuild_annotation_cache(a_object_owner varchar2, a_object_type varchar2); + /** + * Rebuilds annotation cache for a specified object. + */ + procedure trigger_obj_annotation_rebuild; + /** * Removes cached information about annotations for objects of specified type and specified owner * diff --git a/source/core/annotations/ut_trigger_annotation_parsing.trg b/source/core/annotations/ut_trigger_annotation_parsing.trg new file mode 100644 index 000000000..f01820437 --- /dev/null +++ b/source/core/annotations/ut_trigger_annotation_parsing.trg @@ -0,0 +1,15 @@ +create or replace trigger ut_trigger_annotation_parsing + after create or alter or drop +on database +begin + if ora_dict_obj_type = 'PACKAGE' + or (ora_dict_obj_owner = UPPER('&&UT3_OWNER') + and ora_dict_obj_name = 'UT3_TRIGGER_ALIVE' + and ora_dict_obj_type = 'SYNONYM') + then + execute immediate 'begin ut_annotation_manager.trigger_obj_annotation_rebuild; end;'; + end if; +exception + when others then null; +end; +/ diff --git a/source/core/annotations/ut_trigger_check.pkb b/source/core/annotations/ut_trigger_check.pkb new file mode 100644 index 000000000..542a8b63c --- /dev/null +++ b/source/core/annotations/ut_trigger_check.pkb @@ -0,0 +1,40 @@ +create or replace package body ut_trigger_check is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + g_is_trigger_live boolean := false; + + function is_alive return boolean is + pragma autonomous_transaction; + l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_is_trigger_live boolean; + begin + execute immediate 'create or replace synonym '||l_ut_owner||'.ut3_trigger_alive for no_object'; + l_is_trigger_live := g_is_trigger_live; + g_is_trigger_live := false; + return l_is_trigger_live; + end; + + procedure is_alive is + begin + if ora_dict_obj_owner = 'UT3' and ora_dict_obj_name = 'UT3_TRIGGER_TEST' and ora_dict_obj_type = 'SYNONYM' then + g_is_trigger_live := true; + end if; + end; + +end; +/ diff --git a/source/core/annotations/ut_trigger_check.pks b/source/core/annotations/ut_trigger_check.pks new file mode 100644 index 000000000..b82692082 --- /dev/null +++ b/source/core/annotations/ut_trigger_check.pks @@ -0,0 +1,28 @@ +create or replace package ut_trigger_check authid definer is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * checks if the trigger &&UT3_OWNER._PARSE is enabled and operational. + */ + + function is_alive return boolean; + + procedure is_alive; + +end; +/ diff --git a/source/create_utplsql_owner.sql b/source/create_utplsql_owner.sql index a74ee6c44..2df63f27f 100644 --- a/source/create_utplsql_owner.sql +++ b/source/create_utplsql_owner.sql @@ -29,7 +29,7 @@ prompt Creating utPLSQL user &&ut3_user create user &ut3_user identified by "&ut3_password" default tablespace &ut3_tablespace quota unlimited on &ut3_tablespace; -grant create session, create sequence, create procedure, create type, create table, create view, create synonym to &ut3_user; +grant create session, create sequence, create procedure, create type, create table, create view, create synonym, administer database trigger to &ut3_user; begin $if dbms_db_version.version < 18 $then diff --git a/source/install.sql b/source/install.sql index 728f4349f..ffd8f189b 100644 --- a/source/install.sql +++ b/source/install.sql @@ -109,6 +109,8 @@ alter session set current_schema = &&ut3_owner; @@install_component.sql 'core/types/ut_output_reporter_base.tps' --annotations +@@install_component.sql 'core/annotations/ut_trigger_check.pks' +@@install_component.sql 'core/annotations/ut_trigger_check.pkb' @@install_component.sql 'core/annotations/ut_annotation.tps' @@install_component.sql 'core/annotations/ut_annotations.tps' @@install_component.sql 'core/annotations/ut_annotated_object.tps' @@ -116,6 +118,7 @@ alter session set current_schema = &&ut3_owner; @@install_component.sql 'core/annotations/ut_annotation_obj_cache_info.tps' @@install_component.sql 'core/annotations/ut_annotation_objs_cache_info.tps' @@install_component.sql 'core/annotations/ut_annotation_cache_seq.sql' +@@install_component.sql 'core/annotations/ut_annotation_cache_schema.sql' @@install_component.sql 'core/annotations/ut_annotation_cache_info.sql' @@install_component.sql 'core/annotations/ut_annotation_cache.sql' @@install_component.sql 'core/annotations/ut_annotation_cache_manager.pks' @@ -124,6 +127,7 @@ alter session set current_schema = &&ut3_owner; @@install_component.sql 'core/annotations/ut_annotation_parser.pkb' @@install_component.sql 'core/annotations/ut_annotation_manager.pks' @@install_component.sql 'core/annotations/ut_annotation_manager.pkb' +@@install_component.sql 'core/annotations/ut_trigger_annotation_parsing.trg' --suite builder @@install_component.sql 'core/ut_suite_cache_schema.sql' diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index e2295f34d..e8f7b596f 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -157,6 +157,8 @@ drop table ut_compound_data_tmp; drop table ut_compound_data_diff_tmp; +drop trigger ut_trigger_annotation_parsing; + drop package ut_annotation_manager; drop package ut_annotation_parser; @@ -167,6 +169,8 @@ drop table ut_annotation_cache cascade constraints; drop table ut_annotation_cache_info cascade constraints; +drop table ut_annotation_cache_schema cascade constraints; + drop sequence ut_annotation_cache_seq; drop type ut_annotation_objs_cache_info force; @@ -181,6 +185,8 @@ drop type ut_annotations force; drop type ut_annotation force; +drop package ut_trigger_check; + drop package ut_file_mapper; drop package ut_metadata; From 7a56fe7c7fc06f828f9c5d1ae228c651855fd31a Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Fri, 29 Mar 2019 02:01:19 +0000 Subject: [PATCH 079/181] Fixed some issues with trigger Some tests need to be fixed to disable trigger before testing Some tests need to be added to prove trigger is working --- .../annotations/ut_annotation_manager.pkb | 14 ++++++-- .../core/annotations/ut_annotation_parser.pkb | 3 +- .../ut_trigger_annotation_parsing.trg | 8 ++++- source/core/annotations/ut_trigger_check.pkb | 13 ++++--- source/core/ut_suite_manager.pkb | 36 +++++++++---------- source/core/ut_utils.pkb | 2 +- source/install.sql | 3 +- .../annotations/test_annotation_manager.pks | 3 ++ .../annotations/test_annotation_parser.pks | 1 + test/ut3_user/api/test_ut_runner.pkb | 4 +-- test/ut3_user/api/test_ut_runner.pks | 1 + 11 files changed, 55 insertions(+), 33 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index f5daaa95a..2b35128a4 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -58,6 +58,10 @@ create or replace package body ut_annotation_manager as l_cursor_text varchar2(32767); l_result ut_annotation_objs_cache_info; begin + ut_event_manager.trigger_event( + 'get_annotation_objs_info - start ( ut_trigger_check.is_alive = ' + || case when ut_trigger_check.is_alive() then 'Y' else 'N' end || ' )' + ); if ut_trigger_check.is_alive() then l_cursor_text := q'[select ]'||l_ut_owner||q'[.ut_annotation_obj_cache_info( @@ -69,6 +73,7 @@ create or replace package body ut_annotation_manager as from ]'||l_ut_owner||q'[.ut_annotation_cache_info i where i.object_owner = :a_object_owner and i.object_type = :a_object_type]'; + open l_rows for l_cursor_text using a_object_owner, a_object_type; else l_cursor_text := q'[select ]'||l_ut_owner||q'[.ut_annotation_obj_cache_info( @@ -90,10 +95,11 @@ create or replace package body ut_annotation_manager as then ':a_parse_date is null' else 'o.last_ddl_time >= cast(:a_parse_date as date)' end; + open l_rows for l_cursor_text using a_parse_date; end if; - open l_rows for l_cursor_text using a_parse_date; fetch l_rows bulk collect into l_result limit 1000000; close l_rows; + ut_event_manager.trigger_event('get_annotation_objs_info - end (count='||l_result.count||')'); return l_result; end; @@ -203,6 +209,7 @@ create or replace package body ut_annotation_manager as select value(x)bulk collect into l_objects_to_parse from table(a_info_rows) x where x.needs_refresh = 'Y'; + ut_event_manager.trigger_event('rebuild_annotation_cache - start (l_objects_to_parse.count = '||l_objects_to_parse.count||')'); ut_annotation_cache_manager.cleanup_cache(l_objects_to_parse); if sys_context('userenv','current_schema') = a_object_owner @@ -221,6 +228,7 @@ create or replace package body ut_annotation_manager as get_sources_to_annotate(a_object_owner, a_object_type, l_objects_to_parse) ); end if; + ut_event_manager.trigger_event('rebuild_annotation_cache - end'); end; ------------------------------------------------------------ @@ -260,7 +268,7 @@ create or replace package body ut_annotation_manager as begin ut_trigger_check.is_alive(); - if ora_dict_obj_type = 'PACKAGE' then + if ora_dict_obj_type in ('PACKAGE','PROCEDURE','FUNCTION','TYPE') then l_object_to_parse := ut_annotation_obj_cache_info(ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type, 'Y'); @@ -285,6 +293,7 @@ create or replace package body ut_annotation_manager as l_results ut_annotated_objects; c_object_fetch_limit constant integer := 10; begin + ut_event_manager.trigger_event('get_annotated_objects - start'); l_info_rows := get_annotation_objs_info(a_object_owner, a_object_type, a_parse_date); rebuild_annotation_cache(a_object_owner, a_object_type, l_info_rows); @@ -299,6 +308,7 @@ create or replace package body ut_annotation_manager as exit when l_cursor%notfound; end loop; close l_cursor; + ut_event_manager.trigger_event('get_annotated_objects - end'); end; procedure purge_cache(a_object_owner varchar2, a_object_type varchar2) is diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 8d3cee3ad..49882845d 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -234,8 +234,9 @@ create or replace package body ut_annotation_parser as if a_source_lines.count > 0 then --convert to post-processed source clob begin + l_processed_lines := a_source_lines; --get post-processed source - l_processed_lines := sys.dbms_preprocessor.get_post_processed_source(a_source_lines); +-- l_processed_lines := sys.dbms_preprocessor.get_post_processed_source(a_source_lines); --convert to clob for i in 1..l_processed_lines.count loop ut_utils.append_to_clob(l_source, replace(l_processed_lines(i), chr(13)||chr(10), chr(10))); diff --git a/source/core/annotations/ut_trigger_annotation_parsing.trg b/source/core/annotations/ut_trigger_annotation_parsing.trg index f01820437..46703d69a 100644 --- a/source/core/annotations/ut_trigger_annotation_parsing.trg +++ b/source/core/annotations/ut_trigger_annotation_parsing.trg @@ -2,7 +2,13 @@ create or replace trigger ut_trigger_annotation_parsing after create or alter or drop on database begin - if ora_dict_obj_type = 'PACKAGE' + if ( ora_dict_obj_type in ('PACKAGE','PROCEDURE','FUNCTION','TYPE') + and ora_dict_obj_owner + not in ( + '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') + ) or (ora_dict_obj_owner = UPPER('&&UT3_OWNER') and ora_dict_obj_name = 'UT3_TRIGGER_ALIVE' and ora_dict_obj_type = 'SYNONYM') diff --git a/source/core/annotations/ut_trigger_check.pkb b/source/core/annotations/ut_trigger_check.pkb index 542a8b63c..7849cd5de 100644 --- a/source/core/annotations/ut_trigger_check.pkb +++ b/source/core/annotations/ut_trigger_check.pkb @@ -17,21 +17,20 @@ create or replace package body ut_trigger_check is */ g_is_trigger_live boolean := false; + gc_check_object_name varchar2(128) := 'UT3_TRIGGER_ALIVE'; function is_alive return boolean is pragma autonomous_transaction; - l_ut_owner varchar2(250) := ut_utils.ut_owner; - l_is_trigger_live boolean; begin - execute immediate 'create or replace synonym '||l_ut_owner||'.ut3_trigger_alive for no_object'; - l_is_trigger_live := g_is_trigger_live; - g_is_trigger_live := false; - return l_is_trigger_live; + if not g_is_trigger_live then + execute immediate 'create or replace synonym '||ut_utils.ut_owner||'.'||gc_check_object_name||' for no_object'; + end if; + return g_is_trigger_live; end; procedure is_alive is begin - if ora_dict_obj_owner = 'UT3' and ora_dict_obj_name = 'UT3_TRIGGER_TEST' and ora_dict_obj_type = 'SYNONYM' then + if ora_dict_obj_owner = ut_utils.ut_owner and ora_dict_obj_name = gc_check_object_name and ora_dict_obj_type = 'SYNONYM' then g_is_trigger_live := true; end if; end; diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 51d3fa1e4..8f711991c 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -341,11 +341,10 @@ create or replace package body ut_suite_manager is from ]'||l_ut_owner||q'[.ut_suite_cache_package i where not exists ( - select 1 from ]'||l_objects_view||q'[ o - where o.owner = i.object_owner + select 1 from ]'||l_ut_owner||q'[.ut_annotation_cache_info o + where o.object_owner = i.object_owner and o.object_name = i.object_name and o.object_type = 'PACKAGE' - and o.owner = ']'||a_object_owner||q'[' ) and i.object_owner = ']'||a_object_owner||q'[']'; open l_rows for l_cursor_text; @@ -479,7 +478,7 @@ create or replace package body ut_suite_manager is a_owner_name varchar2 ) return boolean is begin - return sys_context( 'userenv', 'current_schema' ) = a_owner_name or ut_metadata.user_has_execute_any_proc(); + 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( @@ -493,6 +492,7 @@ create or replace package body ut_suite_manager is ex_string_too_small exception; pragma exception_init (ex_string_too_small,-06502); begin + ut_event_manager.trigger_event('build_and_cache_suites - start'); loop fetch a_annotated_objects bulk collect into l_annotated_objects limit 10; @@ -521,28 +521,25 @@ create or replace package body ut_suite_manager is ut_utils.to_string(gc_suitpath_error_message||ut_utils.table_to_clob(l_bad_suitepath_obj,',')) ); end if; + ut_event_manager.trigger_event('build_and_cache_suites - end'); end; procedure refresh_cache( - a_owner_name varchar2, - a_annotations_cursor sys_refcursor := null + a_owner_name varchar2 ) is l_annotations_cursor sys_refcursor; l_suite_cache_time timestamp; begin + ut_event_manager.trigger_event('refresh_cache - start'); l_suite_cache_time := ut_suite_cache_manager.get_schema_parse_time(a_owner_name); - if a_annotations_cursor is not null then - l_annotations_cursor := a_annotations_cursor; - else - open l_annotations_cursor for - q'[select value(x) - from table( - ]' || ut_utils.ut_owner || q'[.ut_annotation_manager.get_annotated_objects( - :a_owner_name, 'PACKAGE', :a_suite_cache_parse_time - ) - )x ]' - using a_owner_name, l_suite_cache_time; - end if; + open l_annotations_cursor for + q'[select value(x) + from table( + ]' || ut_utils.ut_owner || q'[.ut_annotation_manager.get_annotated_objects( + :a_owner_name, 'PACKAGE', :a_suite_cache_parse_time + ) + )x ]' + using a_owner_name, l_suite_cache_time; build_and_cache_suites(a_owner_name, l_annotations_cursor); @@ -550,6 +547,7 @@ create or replace package body ut_suite_manager is ut_suite_cache_manager.remove_from_cache( a_owner_name, get_missing_objects(a_owner_name) ); end if; + ut_event_manager.trigger_event('refresh_cache - end'); end; procedure add_suites_for_path( @@ -672,6 +670,7 @@ create or replace package body ut_suite_manager is l_index varchar2(4000 char); l_schema_paths t_schema_paths; begin + ut_event_manager.trigger_event('configure_execution_by_path - start'); a_suites := ut_suite_items(); --resolve schema names from paths and group paths by schema name resolve_schema_names(l_paths); @@ -711,6 +710,7 @@ create or replace package body ut_suite_manager is a_suites(i).set_rollback_type( a_suites(i).get_rollback_type() ); end loop; + ut_event_manager.trigger_event('configure_execution_by_path - start'); end configure_execution_by_path; function get_suites_info( diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index dcf24f2e4..b66c99c48 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -552,7 +552,7 @@ create or replace package body ut_utils is function scale_cardinality(a_cardinality natural) return natural is begin - return nvl(trunc(power(10,(floor(log(10,a_cardinality))+1))/3),0); + 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 diff --git a/source/install.sql b/source/install.sql index ffd8f189b..a7dd53aaa 100644 --- a/source/install.sql +++ b/source/install.sql @@ -127,7 +127,6 @@ alter session set current_schema = &&ut3_owner; @@install_component.sql 'core/annotations/ut_annotation_parser.pkb' @@install_component.sql 'core/annotations/ut_annotation_manager.pks' @@install_component.sql 'core/annotations/ut_annotation_manager.pkb' -@@install_component.sql 'core/annotations/ut_trigger_annotation_parsing.trg' --suite builder @@install_component.sql 'core/ut_suite_cache_schema.sql' @@ -336,6 +335,8 @@ prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema @@install_component.sql 'api/match.syn' @@install_component.sql 'api/contain.syn' +@@install_component.sql 'core/annotations/ut_trigger_annotation_parsing.trg' + set linesize 200 set define on column text format a100 diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pks b/test/ut3_tester/core/annotations/test_annotation_manager.pks index b2f351a6f..e71a92904 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pks +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pks @@ -21,11 +21,13 @@ create or replace package test_annotation_manager is --%test(Adds new package to annotation cache info) --%beforetest(create_dummy_package) --%aftertest(drop_dummy_package) + --%disabled(TODO - make it run with triger disabled) procedure add_new_package; --%test(Updates annotation cache info for modified package) --%beforetest(create_dummy_package) --%aftertest(drop_dummy_package) + --%disabled(TODO - make it run with triger disabled) procedure update_modified_package; --%test(Adds annotations to cache for unit test package) @@ -41,6 +43,7 @@ create or replace package test_annotation_manager is --%test(Keeps annotations in cache when object was removed but user can't see whole schema) --%beforetest(create_dummy_test_package,create_parse_proc_as_ut3$user#) --%aftertest(drop_parse_proc_as_ut3$user#) + --%disabled(no longer true with trigger enabled) procedure keep_dropped_data_in_cache; --%test(Does not return data for dropped object) diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pks b/test/ut3_tester/core/annotations/test_annotation_parser.pks index a4fe3ed70..7e649caf9 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pks +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pks @@ -21,6 +21,7 @@ create or replace package test_annotation_parser is procedure ignore_annotations_in_comments; --%test(Ignores wrapped package and does not raise exception) + --%disabled(TODO - causes issues on 18c with install when trigger enabled) procedure ignore_wrapped_package; --%test(Parses package level annotations with annotation params containing brackets) diff --git a/test/ut3_user/api/test_ut_runner.pkb b/test/ut3_user/api/test_ut_runner.pkb index 298c15c2a..966611dae 100644 --- a/test/ut3_user/api/test_ut_runner.pkb +++ b/test/ut3_user/api/test_ut_runner.pkb @@ -188,7 +188,7 @@ end;'; procedure test_purge_cache_schema_type is l_actual sys_refcursor; begin - + open l_actual for select * from ut3.ut_annotation_cache_info where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PROCEDURE'; @@ -220,7 +220,7 @@ end;'; l_actual integer; begin --Act - ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + ut3.ut_runner.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); --Assert select count(1) into l_actual from ut3.ut_annotation_cache_info i diff --git a/test/ut3_user/api/test_ut_runner.pks b/test/ut3_user/api/test_ut_runner.pks index 70eed747f..87a932f4f 100644 --- a/test/ut3_user/api/test_ut_runner.pks +++ b/test/ut3_user/api/test_ut_runner.pks @@ -45,6 +45,7 @@ create or replace package test_ut_runner is --%test(Rebuilds cache for a given schema and object type) --%beforetest(setup_cache_objects) --%aftertest(cleanup_cache) + --%DISABLED(TODO -disable trigger for this test to pass) procedure test_rebuild_cache_schema_type; --%test(get_suites_info returns a cursor containing records for a newly created test) From 71b50f798916a4c5cb1847d5510e0f9df2e1cb7d Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Fri, 29 Mar 2019 18:17:22 +0000 Subject: [PATCH 080/181] Fixed uninstall script and constant. Disabled `-scc` flag in tests --- source/core/annotations/ut_trigger_check.pkb | 4 ++-- source/uninstall_objects.sql | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/source/core/annotations/ut_trigger_check.pkb b/source/core/annotations/ut_trigger_check.pkb index 7849cd5de..508e50e0f 100644 --- a/source/core/annotations/ut_trigger_check.pkb +++ b/source/core/annotations/ut_trigger_check.pkb @@ -16,8 +16,8 @@ create or replace package body ut_trigger_check is limitations under the License. */ - g_is_trigger_live boolean := false; - gc_check_object_name varchar2(128) := 'UT3_TRIGGER_ALIVE'; + g_is_trigger_live boolean := false; + gc_check_object_name constant varchar2(128) := 'UT3_TRIGGER_ALIVE'; function is_alive return boolean is pragma autonomous_transaction; diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index e8f7b596f..45c17fbab 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -1,4 +1,9 @@ set echo on + +drop trigger ut_trigger_annotation_parsing; + +drop synonym ut3_trigger_alive; + drop synonym be_between; drop synonym have_count; From db8ef50f2fe784bc74dd6cbadcae459a6c998811 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Wed, 17 Apr 2019 23:55:53 +0100 Subject: [PATCH 081/181] Removed commented code. --- source/core/output_buffers/ut_output_buffer_tmp.sql | 9 --------- 1 file changed, 9 deletions(-) diff --git a/source/core/output_buffers/ut_output_buffer_tmp.sql b/source/core/output_buffers/ut_output_buffer_tmp.sql index d596a4908..e78a71c15 100644 --- a/source/core/output_buffers/ut_output_buffer_tmp.sql +++ b/source/core/output_buffers/ut_output_buffer_tmp.sql @@ -36,15 +36,6 @@ begin overflow nologging initrans 100 '; execute immediate v_table_sql; --- begin --- execute immediate --- v_table_sql || 'lob(text) store as securefile ut_output_text(retention none enable storage in row)'; --- exception --- when e_non_assm then --- execute immediate --- v_table_sql || 'lob(text) store as basicfile ut_output_text(pctversion 0 enable storage in row)'; --- --- end; end; / From 30586106dfc06bee8f6ce6e34ef3a9419e78f488 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sun, 14 Apr 2019 12:22:49 +0100 Subject: [PATCH 082/181] Added tags for tests and tags for suite. --- source/api/ut.pkb | 88 ++++++++++++++------- source/api/ut.pks | 36 ++++++--- source/api/ut_runner.pkb | 16 +++- source/api/ut_runner.pks | 3 +- source/core/types/ut_run.tpb | 4 +- source/core/types/ut_run.tps | 4 +- source/core/types/ut_suite.tpb | 4 +- source/core/types/ut_suite.tps | 7 +- source/core/types/ut_test.tpb | 3 +- source/core/types/ut_test.tps | 8 +- source/core/ut_suite_builder.pkb | 66 +++++++++++++++- source/core/ut_suite_cache.sql | 5 +- source/core/ut_suite_cache_manager.pkb | 12 ++- source/core/ut_suite_manager.pkb | 88 +++++++++++++++------ source/core/ut_suite_manager.pks | 3 +- source/core/ut_utils.pkb | 14 ++++ source/core/ut_utils.pks | 4 +- test/ut3_tester/core/test_suite_builder.pkb | 7 ++ 18 files changed, 286 insertions(+), 86 deletions(-) diff --git a/source/api/ut.pkb b/source/api/ut.pkb index 5e13dcc62..96cf51102 100644 --- a/source/api/ut.pkb +++ b/source/api/ut.pkb @@ -120,7 +120,8 @@ create or replace package body ut is a_exclude_objects ut_varchar2_list, a_client_character_set varchar2, a_random_test_order integer, - a_random_test_order_seed positive + a_random_test_order_seed positive, + a_tags ut_varchar2_rows := null ) is pragma autonomous_transaction; begin @@ -138,7 +139,8 @@ create or replace package body ut is a_client_character_set, false, ut_utils.int_to_boolean(a_random_test_order), - a_random_test_order_seed + a_random_test_order_seed, + a_tags ); rollback; end; @@ -154,7 +156,8 @@ create or replace package body ut is a_exclude_objects ut_varchar2_list, a_client_character_set varchar2, a_random_test_order integer, - a_random_test_order_seed positive + a_random_test_order_seed positive, + a_tags ut_varchar2_rows := null ) is pragma autonomous_transaction; begin @@ -172,7 +175,8 @@ create or replace package body ut is a_client_character_set, false, ut_utils.int_to_boolean(a_random_test_order), - a_random_test_order_seed + a_random_test_order_seed, + a_tags ); rollback; end; @@ -212,7 +216,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -228,7 +233,8 @@ create or replace package body ut is a_exclude_objects, a_client_character_set, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + ut_varchar2_rows(a_tags) ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -249,7 +255,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -265,7 +272,8 @@ create or replace package body ut is a_exclude_objects, a_client_character_set, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + ut_varchar2_rows(a_tags) ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -287,7 +295,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -303,7 +312,8 @@ create or replace package body ut is a_exclude_objects, a_client_character_set, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + ut_varchar2_rows(a_tags) ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -325,7 +335,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -341,7 +352,8 @@ create or replace package body ut is a_exclude_objects, a_client_character_set, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + ut_varchar2_rows(a_tags) ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -363,7 +375,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -379,7 +392,8 @@ create or replace package body ut is a_exclude_objects, a_client_character_set, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + ut_varchar2_rows(a_tags) ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -401,7 +415,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined is l_reporter ut_reporter_base := a_reporter; l_results sys_refcursor; @@ -417,7 +432,8 @@ create or replace package body ut is a_exclude_objects, a_client_character_set, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + ut_varchar2_rows(a_tags) ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -440,7 +456,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags ut_varchar2_rows := null ) is l_reporter ut_reporter_base := a_reporter; begin @@ -459,7 +476,8 @@ create or replace package body ut is a_client_character_set, a_force_manual_rollback, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + a_tags ); else run_autonomous( @@ -473,7 +491,8 @@ create or replace package body ut is a_exclude_objects, a_client_character_set, ut_utils.boolean_to_int(a_random_test_order), - a_random_test_order_seed + a_random_test_order_seed, + a_tags ); end if; if l_reporter is of (ut_output_reporter_base) then @@ -494,7 +513,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags ut_varchar2_rows := null ) is l_reporter ut_reporter_base := a_reporter; begin @@ -510,7 +530,8 @@ create or replace package body ut is a_client_character_set, a_force_manual_rollback, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + a_tags ); end; @@ -525,7 +546,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) is begin ut.run( @@ -540,7 +562,8 @@ create or replace package body ut is a_client_character_set, a_force_manual_rollback, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + ut_varchar2_rows(a_tags) ); end; @@ -555,7 +578,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) is begin ut.run( @@ -570,7 +594,8 @@ create or replace package body ut is a_client_character_set, a_force_manual_rollback, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + ut_varchar2_rows(a_tags) ); end; @@ -586,7 +611,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) is begin ut.run( @@ -601,7 +627,8 @@ create or replace package body ut is a_client_character_set, a_force_manual_rollback, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + ut_varchar2_rows(a_tags) ); end; @@ -617,7 +644,8 @@ create or replace package body ut is 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) is begin ut.run( @@ -632,10 +660,12 @@ create or replace package body ut is a_client_character_set, a_force_manual_rollback, a_random_test_order, - a_random_test_order_seed + a_random_test_order_seed, + ut_varchar2_rows(a_tags) ); end; + procedure set_nls is begin if g_nls_date_format is null then diff --git a/source/api/ut.pks b/source/api/ut.pks index 7d3b191b3..e6065d85b 100644 --- a/source/api/ut.pks +++ b/source/api/ut.pks @@ -57,7 +57,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined; function run( @@ -70,7 +71,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined; function run( @@ -84,7 +86,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined; function run( @@ -98,7 +101,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined; function run( @@ -112,7 +116,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined; function run( @@ -126,7 +131,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags varchar2 := null ) return ut_varchar2_rows pipelined; procedure run( @@ -140,7 +146,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags varchar2 := null ); procedure run( @@ -154,7 +161,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags varchar2 := null ); procedure run( @@ -169,7 +177,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags ut_varchar2_rows := null ); procedure run( @@ -184,7 +193,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags ut_varchar2_rows := null ); procedure run( @@ -199,7 +209,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags varchar2 := null ); procedure run( @@ -214,7 +225,8 @@ create or replace package ut authid current_user as 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_random_test_order_seed positive := null, + a_tags varchar2 := null ); /** diff --git a/source/api/ut_runner.pkb b/source/api/ut_runner.pkb index 28ec1a610..3d262abe3 100644 --- a/source/api/ut_runner.pkb +++ b/source/api/ut_runner.pkb @@ -90,7 +90,8 @@ create or replace package body ut_runner is 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_random_test_order_seed positive := null, + a_tags ut_varchar2_rows := null ) is l_run ut_run; l_coverage_schema_names ut_varchar2_rows; @@ -98,6 +99,7 @@ create or replace package body ut_runner is l_include_object_names ut_object_names; l_paths ut_varchar2_list := ut_varchar2_list(); l_random_test_order_seed positive; + l_tags ut_varchar2_rows := ut_varchar2_rows(); begin ut_event_manager.initialize(); if a_reporters is not empty then @@ -124,12 +126,17 @@ create or replace package body ut_runner is end loop; end if; + if (a_tags is not null) or not(a_tags is empty) then + for i in 1..a_tags.count loop + l_tags := l_tags multiset union ut_utils.convert_collection(ut_utils.string_to_table(a_string => a_tags(i),a_delimiter => ',')); + end loop; + end if; + begin ut_expectation_processor.reset_invalidation_exception(); ut_utils.save_dbms_output_to_cache(); ut_console_reporter_base.set_color_enabled(a_color_console); - if a_coverage_schemes is not empty then l_coverage_schema_names := ut_utils.convert_collection(a_coverage_schemes); else @@ -153,10 +160,11 @@ create or replace package body ut_runner is set(a_source_file_mappings), set(a_test_file_mappings), a_client_character_set, - l_random_test_order_seed + l_random_test_order_seed, + l_tags ); - ut_suite_manager.configure_execution_by_path(l_paths, l_run.items, l_random_test_order_seed); + ut_suite_manager.configure_execution_by_path(l_paths, l_run.items, l_random_test_order_seed, l_tags); if a_force_manual_rollback then l_run.set_rollback_type( a_rollback_type => ut_utils.gc_rollback_manual, a_force => true ); end if; diff --git a/source/api/ut_runner.pks b/source/api/ut_runner.pks index ab2e1f6bb..895de3bb7 100644 --- a/source/api/ut_runner.pks +++ b/source/api/ut_runner.pks @@ -70,7 +70,8 @@ create or replace package ut_runner authid current_user is 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_random_test_order_seed positive := null, + a_tags ut_varchar2_rows := null ); /** diff --git a/source/core/types/ut_run.tpb b/source/core/types/ut_run.tpb index d5ace34a7..c8f2778ff 100644 --- a/source/core/types/ut_run.tpb +++ b/source/core/types/ut_run.tpb @@ -26,10 +26,12 @@ create or replace type body ut_run as 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_random_test_order_seed positive := null, + a_run_tags ut_varchar2_rows := null ) return self as result is begin self.run_paths := a_run_paths; + self.run_tags := a_run_tags; self.self_type := $$plsql_unit; self.items := a_items; self.client_character_set := lower(a_client_character_set); diff --git a/source/core/types/ut_run.tps b/source/core/types/ut_run.tps index 5d5e65367..b5a1d18ac 100644 --- a/source/core/types/ut_run.tps +++ b/source/core/types/ut_run.tps @@ -21,6 +21,7 @@ create or replace type ut_run under ut_suite_item ( project_name varchar2(4000), items ut_suite_items, run_paths ut_varchar2_list, + run_tags ut_varchar2_rows, coverage_options ut_coverage_options, test_file_mappings ut_file_mappings, client_character_set varchar2(100), @@ -35,7 +36,8 @@ create or replace type ut_run under ut_suite_item ( 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_random_test_order_seed positive := null, + a_run_tags ut_varchar2_rows := null ) return self as result, overriding member procedure mark_as_skipped(self in out nocopy ut_run), overriding member function do_execute(self in out nocopy ut_run) return boolean, diff --git a/source/core/types/ut_suite.tpb b/source/core/types/ut_suite.tpb index 14a457623..bf683d8aa 100644 --- a/source/core/types/ut_suite.tpb +++ b/source/core/types/ut_suite.tpb @@ -17,7 +17,8 @@ create or replace type body ut_suite as */ constructor function ut_suite ( - self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer + self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer, + a_suite_tags ut_varchar2_rows := null ) return self as result is begin self.self_type := $$plsql_unit; @@ -25,6 +26,7 @@ create or replace type body ut_suite as self.items := ut_suite_items(); before_all_list := ut_executables(); after_all_list := ut_executables(); + self.suite_tags := a_suite_tags; return; end; diff --git a/source/core/types/ut_suite.tps b/source/core/types/ut_suite.tps index 7057e4911..0da911b4f 100644 --- a/source/core/types/ut_suite.tps +++ b/source/core/types/ut_suite.tps @@ -26,8 +26,13 @@ create or replace type ut_suite under ut_logical_suite ( * Procedure exists within the package of the suite */ after_all_list ut_executables, + /** + * Hold list of tags assign to suite + */ + suite_tags ut_varchar2_rows, constructor function ut_suite ( - self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer + self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer, + a_suite_tags ut_varchar2_rows := null ) return self as result, overriding member function do_execute(self in out nocopy ut_suite) return boolean, overriding member function get_error_stack_traces(self ut_suite) return ut_varchar2_list, diff --git a/source/core/types/ut_test.tpb b/source/core/types/ut_test.tpb index 14620b24b..f09a51162 100644 --- a/source/core/types/ut_test.tpb +++ b/source/core/types/ut_test.tpb @@ -18,7 +18,7 @@ create or replace type body ut_test as 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_line_no integer, a_expected_error_codes ut_integer_list := null, a_test_tags ut_varchar2_rows := null ) return self as result is begin self.self_type := $$plsql_unit; @@ -31,6 +31,7 @@ create or replace type body ut_test as self.all_expectations := ut_expectation_results(); self.failed_expectations := ut_expectation_results(); self.expected_error_codes := a_expected_error_codes; + self.test_tags := a_test_tags; return; end; diff --git a/source/core/types/ut_test.tps b/source/core/types/ut_test.tps index 752ef3ef7..caabdf1b1 100644 --- a/source/core/types/ut_test.tps +++ b/source/core/types/ut_test.tps @@ -1,4 +1,4 @@ -create or replace type ut_test under ut_suite_item ( +create or replace type ut_test force under ut_suite_item ( /* utPLSQL - Version 3 Copyright 2016 - 2018 utPLSQL Project @@ -55,9 +55,13 @@ create or replace type ut_test under ut_suite_item ( *Holds the expected error codes list when the user use the annotation throws */ expected_error_codes ut_integer_list, + /** + * Hold list of tags assign to test + */ + test_tags ut_varchar2_rows, 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_line_no integer, a_expected_error_codes ut_integer_list := null, a_test_tags ut_varchar2_rows := null ) return self as result, overriding member procedure mark_as_skipped(self in out nocopy ut_test), overriding member function do_execute(self in out nocopy ut_test) return boolean, diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index b9e5b1b22..2a6a810e3 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -23,6 +23,7 @@ create or replace package body ut_suite_builder is gc_suite constant t_annotation_name := 'suite'; gc_suitepath constant t_annotation_name := 'suitepath'; + gc_tag constant t_annotation_name := 'tag'; gc_test constant t_annotation_name := ut_utils.gc_test_execute; gc_disabled constant t_annotation_name := 'disabled'; gc_displayname constant t_annotation_name := 'displayname'; @@ -43,6 +44,7 @@ create or replace package body ut_suite_builder is := tt_annotations( gc_suite, gc_suitepath, + gc_tag, gc_test, gc_disabled, gc_displayname, @@ -305,6 +307,33 @@ create or replace package body ut_suite_builder is end loop; end; + procedure add_tags_to_test( + a_suite in out nocopy ut_suite, + a_list in out nocopy ut_varchar2_rows, + a_procedure_name t_object_name, + a_tags_ann_text tt_annotation_texts + ) is + l_annotation_pos binary_integer; + begin + a_list := ut_varchar2_rows(); + l_annotation_pos := a_tags_ann_text.first; + while l_annotation_pos is not null loop + if a_tags_ann_text(l_annotation_pos) is null then + a_suite.put_warning( + '"--%tag" annotation requires a tag value populated. Annotation ignored.' + || chr( 10 ) || 'at "' || get_qualified_object_name(a_suite, a_procedure_name) || '", line ' || l_annotation_pos + ); + else + a_list := + a_list multiset union + ut_utils.convert_collection(ut_utils.trim_list_elements(ut_utils.string_to_table(a_tags_ann_text(l_annotation_pos), ',', 'Y'))); + end if; + l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); + end loop; + + end; + + procedure set_seq_no( a_list in out nocopy ut_executables ) is @@ -483,13 +512,19 @@ create or replace package body ut_suite_builder is ); set_seq_no(l_test.after_test_list); end if; + + if l_proc_annotations.exists( gc_tag) then + add_tags_to_test(a_suite, l_test.test_tags, a_procedure_name, l_proc_annotations( gc_tag)); + end if; + if l_proc_annotations.exists( gc_throws) then add_to_throws_numbers_list(a_suite, l_test.expected_error_codes, a_procedure_name, l_proc_annotations( gc_throws)); end if; l_test.disabled_flag := ut_utils.boolean_to_int( l_proc_annotations.exists( gc_disabled)); - + a_suite_items.extend; a_suite_items( a_suite_items.last ) := l_test; + end; procedure propagate_before_after_each( @@ -583,6 +618,29 @@ create or replace package body ut_suite_builder is a_suite.path := lower(coalesce(a_suite.path, a_suite.object_name)); end; + procedure add_tags_to_suite( + a_suite in out nocopy ut_suite, + a_tags_ann_text tt_annotation_texts + ) is + l_annotation_pos binary_integer; + l_tags ut_varchar2_rows := ut_varchar2_rows(); + begin + l_annotation_pos := a_tags_ann_text.first; + while l_annotation_pos is not null loop + if a_tags_ann_text(l_annotation_pos) is null then + a_suite.put_warning( + '"--%tag" annotation requires a tag value populated. Annotation ignored, line ' || l_annotation_pos + ); + else + l_tags := + l_tags multiset union + ut_utils.convert_collection(ut_utils.trim_list_elements(ut_utils.string_to_table(a_tags_ann_text(l_annotation_pos), ',', 'Y'))); + end if; + l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); + end loop; + a_suite.suite_tags := l_tags; + end; + procedure add_suite_tests( a_suite in out nocopy ut_suite, a_annotations t_annotations_info, @@ -594,6 +652,7 @@ create or replace package body ut_suite_builder is l_after_all_list tt_executables; l_rollback_type ut_utils.t_rollback_type; l_annotation_text t_annotation_text; + l_suite_tags ut_varchar2_rows; begin if a_annotations.by_name.exists(gc_displayname) then l_annotation_text := trim(a_annotations.by_name(gc_displayname)(a_annotations.by_name(gc_displayname).first)); @@ -631,7 +690,10 @@ create or replace package body ut_suite_builder is if a_annotations.by_name.exists(gc_aftereach) then l_after_each_list := add_executables( a_suite.object_owner, a_suite.object_name, a_annotations.by_name(gc_aftereach), gc_aftereach ); end if; - + + if a_annotations.by_name.exists(gc_tag) then + add_tags_to_suite(a_suite, a_annotations.by_name(gc_tag)); + end if; a_suite.disabled_flag := ut_utils.boolean_to_int(a_annotations.by_name.exists(gc_disabled)); --process procedure annotations for suite diff --git a/source/core/ut_suite_cache.sql b/source/core/ut_suite_cache.sql index adbdf1734..e41af9607 100644 --- a/source/core/ut_suite_cache.sql +++ b/source/core/ut_suite_cache.sql @@ -36,6 +36,7 @@ create table ut_suite_cache ( after_each_list, after_test_list, expected_error_codes, + tags, item ) nested table warnings store as ut_suite_cache_warnings @@ -45,7 +46,8 @@ create table ut_suite_cache ( nested table after_each_list store as ut_suite_cache_after_each nested table before_test_list store as ut_suite_cache_before_test nested table after_test_list store as ut_suite_cache_after_test - nested table expected_error_codes store as ut_suite_cache_trhows + nested table expected_error_codes store as ut_suite_cache_throws + nested table tags store as ut_suite_cache_tags return as locator as select cast(null as number(22)) id, @@ -67,6 +69,7 @@ create table ut_suite_cache ( t.after_each_list, t.after_test_list, t.expected_error_codes, + t.test_tags, t.item from table(ut_suite_contexts(ut_suite_context(user,'package_name','ctx_name',1))) c cross join table(ut_tests(ut_test(user,'package_name','test_name',1))) t diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index ce7f018e0..55a6816e0 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -90,7 +90,8 @@ create or replace package body ut_suite_cache_manager is before_all_list, after_all_list, before_each_list, after_each_list, before_test_list, after_test_list, - expected_error_codes, item + expected_error_codes, tags, + item ) with suites as ( select treat(value(x) as ut_suite) i @@ -103,7 +104,8 @@ create or replace package body ut_suite_cache_manager is 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, null item + null expected_error_codes, s.i.suite_tags tags, + null item from suites s; insert into ut_suite_cache t @@ -114,7 +116,8 @@ create or replace package body ut_suite_cache_manager is before_all_list, after_all_list, before_each_list, after_each_list, before_test_list, after_test_list, - expected_error_codes, item + expected_error_codes, tags, + item ) with tests as ( select treat(value(x) as ut_test) t @@ -127,7 +130,8 @@ create or replace package body ut_suite_cache_manager is 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.item as item + s.t.expected_error_codes as expected_error_codes, s.t.test_tags as test_tags, + s.t.item as item from tests s; end if; diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 51d3fa1e4..ad433b8da 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -57,7 +57,7 @@ create or replace package body ut_suite_manager is end loop; 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); @@ -100,6 +100,7 @@ create or replace package body ut_suite_manager is l_schema_names.extend; l_schema_names(l_schema_names.last) := l_schema; end loop; + return l_schema_names; end; @@ -192,7 +193,7 @@ create or replace package body ut_suite_manager is 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) + a_rows( a_idx ).after_all_list), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate ) else ut_suite( @@ -205,7 +206,7 @@ create or replace package body ut_suite_manager is 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) + a_rows( a_idx ).after_all_list), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate ) end; when 'UT_SUITE_CONTEXT' then @@ -221,7 +222,7 @@ create or replace package body ut_suite_manager is 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) + a_rows( a_idx ).after_all_list), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate ) else ut_suite_context( @@ -234,7 +235,7 @@ create or replace package body ut_suite_manager is 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) + a_rows( a_idx ).after_all_list), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate ) end; when 'UT_LOGICAL_SUITE' then @@ -276,7 +277,8 @@ create or replace package body ut_suite_manager is 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 + parent_error_stack_trace => null, expected_error_codes => a_rows(a_idx).expected_error_codes, + test_tags => a_rows(a_idx).tags ); end case; l_result.results_count.warnings_count := l_result.warnings.count; @@ -360,13 +362,17 @@ create or replace package body ut_suite_manager is a_object_name varchar2 := null, a_procedure_name varchar2 := null, a_skip_all_objects boolean := false, - a_random_seed positive + a_random_seed positive, + a_tags ut_varchar2_rows := null ) return t_cached_suites_cursor is l_path varchar2( 4000 ); l_result sys_refcursor; l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_sql varchar2(32767); + l_tags ut_varchar2_rows := coalesce(a_tags,ut_varchar2_rows()); + l_suite_item_name varchar2(20); begin - if a_path is null and a_object_name is not null then + if a_path is null and a_object_name is not null then execute immediate 'select min(path) from '||l_ut_owner||q'[.ut_suite_cache where object_owner = :a_object_owner @@ -376,12 +382,15 @@ create or replace package body ut_suite_manager is else l_path := lower( a_path ); end if; - - open l_result for + + l_suite_item_name := case when l_tags.count > 0 then 'suite_items_tags' else 'suite_items' end; + + /* Rewrite that as tags should be put on whats left not on full suite item cache */ + l_sql := q'[with suite_items as ( - select /*+ cardinality(c 100) */ c.* - from ]'||l_ut_owner||q'[.ut_suite_cache c + select /*+ cardinality(c 100) */ c.* + from ]'||l_ut_owner||q'[.ut_suite_cache c where 1 = 1 ]'||case when not a_skip_all_objects then q'[ and exists ( select 1 @@ -405,12 +414,30 @@ create or replace package body ut_suite_manager is else 'and :a_procedure_name is null' end ||q'[ ) ) - ), - suitepaths as ( + ),]' + ||case when l_tags.count > 0 then + q'[ filter_tags as ( + select s.* from suite_items s + where exists + ( select 1 + from table(s.tags) ct,table(:l_tags) tag + where ct.column_value = tag.column_value) + ), + suite_items_tags as ( + select c.* from suite_items c + where exists (select 1 from filter_tags t where + t.path||'.' like c.path || '.%' /*all children and self*/ + or c.path||'.' like t.path || '.%' --all parents + ) + ),]' + else + q'[dummy as (select 1 from table(:l_tags) where 1 = 2 ),]' + end|| + q'[ suitepaths as ( select distinct substr(path,1,instr(path,'.',-1)-1) as suitepath, path, object_owner - from suite_items + from ]'||l_suite_item_name||q'[ where self_type = 'UT_SUITE' ), gen as ( @@ -430,6 +457,7 @@ create or replace package body ut_suite_manager is upper( substr(p.path, instr( p.path, '.', -1 ) + 1 ) ) as object_name, cast(null as ]'||l_ut_owner||q'[.ut_executables) as x, cast(null as ]'||l_ut_owner||q'[.ut_integer_list) as y, + cast(null as ]'||l_ut_owner||q'[.ut_varchar2_rows) as q, cast(null as ]'||l_ut_owner||q'[.ut_executable_test) as z from suitepath_part p where p.path @@ -443,11 +471,12 @@ create or replace package body ut_suite_manager is s.x as before_all_list, s.x as after_all_list, s.x as before_each_list, s.x as before_test_list, s.x as after_each_list, s.x as after_test_list, - s.y as expected_error_codes, s.z as item + s.y as expected_error_codes, s.q as test_tags, + s.z as item from logical_suite_data s ), items as ( - select * from suite_items + select * from ]'||l_suite_item_name||q'[ union all select * from logical_suites ) @@ -470,8 +499,8 @@ create or replace package body ut_suite_manager is l_ut_owner||'.ut_annotation_manager.hash_suite_path( c.path, :a_random_seed ) desc nulls last' - end - using l_path, l_path, upper(a_object_name), upper(a_procedure_name), a_random_seed; + end; + open l_result for l_sql using l_path, l_path, upper(a_object_name), upper(a_procedure_name), l_tags, a_random_seed; return l_result; end; @@ -558,7 +587,8 @@ create or replace package body ut_suite_manager is a_object_name varchar2 := null, a_procedure_name varchar2 := null, a_suites in out nocopy ut_suite_items, - a_random_seed positive + a_random_seed positive, + a_tags ut_varchar2_rows := null ) is begin refresh_cache(a_owner_name); @@ -571,7 +601,8 @@ create or replace package body ut_suite_manager is a_object_name, a_procedure_name, can_skip_all_objects_scan(a_owner_name), - a_random_seed + a_random_seed, + a_tags ) ); @@ -601,6 +632,7 @@ create or replace package body ut_suite_manager is a_object_name, a_procedure_name, a_skip_all_objects, + null, null ) ); @@ -662,7 +694,8 @@ create or replace package body ut_suite_manager is procedure configure_execution_by_path( a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, - a_random_seed in positive := null + a_random_seed in positive := null, + a_tags ut_varchar2_rows := null ) is l_paths ut_varchar2_list := a_paths; l_path_items t_path_items; @@ -677,7 +710,11 @@ create or replace package body ut_suite_manager is resolve_schema_names(l_paths); l_schema_paths := group_paths_by_schema(l_paths); - + + -- TODO : use a_tags to filter out path. Should we do it before ? we dont know suites, if we do it after + -- we running into danger of filtering out to null value and raising wrong message. I reckon we should resolve that + -- before loop and l_th_items is set or after filter it out. + l_schema := l_schema_paths.first; while l_schema is not null loop l_path_items := l_schema_paths(l_schema); @@ -689,7 +726,8 @@ create or replace package body ut_suite_manager is l_path_item.object_name, l_path_item.procedure_name, a_suites, - a_random_seed + a_random_seed, + a_tags ); if a_suites.count = l_suites_count then if l_path_item.suite_path is not null then @@ -698,6 +736,8 @@ create or replace package body ut_suite_manager is 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'); elsif l_path_item.object_name is not null then raise_application_error(ut_utils.gc_suite_package_not_found,'Suite package '||l_schema||'.'||l_path_item.object_name|| ' does not exist'); + elsif a_tags.count > 0 then + raise_application_error(ut_utils.gc_suite_package_not_found,'No suite packages found for tags: '||ut_utils.to_string(ut_utils.table_to_clob(a_tags,','),a_max_output_len => 450)); end if; end if; l_index := a_suites.first; diff --git a/source/core/ut_suite_manager.pks b/source/core/ut_suite_manager.pks index debfd4ac1..9b214a6c2 100644 --- a/source/core/ut_suite_manager.pks +++ b/source/core/ut_suite_manager.pks @@ -49,7 +49,8 @@ create or replace package ut_suite_manager authid current_user is procedure configure_execution_by_path( a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, - a_random_seed in positive := null + a_random_seed in positive := null, + a_tags ut_varchar2_rows := null ); /** diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 25ef3fb3f..be8da247e 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -278,6 +278,20 @@ create or replace package body ut_utils is 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; + l_table_rows integer := coalesce(cardinality(a_text_table),0); + begin + for i in 1 .. l_table_rows loop + if i < l_table_rows then + append_to_clob(l_result, a_text_table(i)||a_delimiter); + else + append_to_clob(l_result, a_text_table(i)); + end if; + end loop; + 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; l_table_rows integer := coalesce(cardinality(a_integer_table),0); diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index ebb9780ad..6832e0ceb 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -234,7 +234,9 @@ create or replace package ut_utils authid definer is function clob_to_table(a_clob clob, a_max_amount integer := 8191, a_delimiter varchar2:= chr(10)) return ut_varchar2_list; function table_to_clob(a_text_table ut_varchar2_list, a_delimiter varchar2:= chr(10)) return clob; - + + function table_to_clob(a_text_table ut_varchar2_rows, a_delimiter varchar2:= chr(10)) return clob; + function table_to_clob(a_integer_table ut_integer_list, a_delimiter varchar2:= chr(10)) return clob; /** diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index e6d21d969..7ef85a53a 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -652,6 +652,7 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || + '' || '' || '' || '%suite_level_testIn suitesome_package.suite_level_test' || @@ -661,6 +662,7 @@ create or replace package body test_suite_builder is '%some_packagesuite_level_beforeall' || '%' || '' || + '' || '' ); end; @@ -796,6 +798,7 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || + ''|| '' ); end; @@ -837,6 +840,7 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || + '' || '' || '' || '%suite_level_testIn suitesome_package.suite_level_test' || @@ -846,6 +850,7 @@ create or replace package body test_suite_builder is '%some_packagesuite_level_beforeall' || '%' || '' || + '' || '' ); end; @@ -892,6 +897,7 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || + '' || '' || '' || '%suite_level_testIn suitesome_package.suite_level_test' || @@ -901,6 +907,7 @@ create or replace package body test_suite_builder is '%some_packagesuite_level_beforeall' || '%' || '' || + '' || '' ); end; From 3495490a1567ed8013c95ff550d27204a3dac5e4 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 19 Apr 2019 21:04:55 +0100 Subject: [PATCH 083/181] Switch to use VARCHAR2 instead of UT_VARCHAR2_ROWS() Signed-off-by: lwasylow --- source/api/ut.pkb | 28 ++++++------- source/api/ut.pks | 4 +- source/api/ut_runner.pkb | 13 ++---- source/api/ut_runner.pks | 2 +- source/core/types/ut_run.tpb | 2 +- source/core/types/ut_run.tps | 4 +- source/core/types/ut_suite.tpb | 4 +- source/core/types/ut_suite.tps | 4 +- source/core/types/ut_test.tpb | 4 +- source/core/types/ut_test.tps | 4 +- source/core/ut_suite_builder.pkb | 15 +++---- source/core/ut_suite_cache.sql | 3 +- source/core/ut_suite_cache_manager.pkb | 17 +++++++- source/core/ut_suite_cache_tag.sql | 7 ++++ source/core/ut_suite_manager.pkb | 40 +++++++++---------- source/core/ut_suite_manager.pks | 2 +- .../create_synonyms_and_grants_for_public.sql | 1 + source/create_user_grants.sql | 1 + source/install.sql | 1 + source/uninstall_objects.sql | 2 + test/ut3_tester/core/test_suite_builder.pkb | 4 +- 21 files changed, 87 insertions(+), 75 deletions(-) create mode 100644 source/core/ut_suite_cache_tag.sql diff --git a/source/api/ut.pkb b/source/api/ut.pkb index 96cf51102..1a95f0725 100644 --- a/source/api/ut.pkb +++ b/source/api/ut.pkb @@ -121,7 +121,7 @@ create or replace package body ut is a_client_character_set varchar2, a_random_test_order integer, a_random_test_order_seed positive, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is pragma autonomous_transaction; begin @@ -157,7 +157,7 @@ create or replace package body ut is a_client_character_set varchar2, a_random_test_order integer, a_random_test_order_seed positive, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is pragma autonomous_transaction; begin @@ -234,7 +234,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -273,7 +273,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -313,7 +313,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -353,7 +353,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -393,7 +393,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -433,7 +433,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -457,7 +457,7 @@ create or replace package body ut is a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is l_reporter ut_reporter_base := a_reporter; begin @@ -514,7 +514,7 @@ create or replace package body ut is a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is l_reporter ut_reporter_base := a_reporter; begin @@ -563,7 +563,7 @@ create or replace package body ut is a_force_manual_rollback, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); end; @@ -595,7 +595,7 @@ create or replace package body ut is a_force_manual_rollback, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); end; @@ -628,7 +628,7 @@ create or replace package body ut is a_force_manual_rollback, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); end; @@ -661,7 +661,7 @@ create or replace package body ut is a_force_manual_rollback, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); end; diff --git a/source/api/ut.pks b/source/api/ut.pks index e6065d85b..17b4a845e 100644 --- a/source/api/ut.pks +++ b/source/api/ut.pks @@ -178,7 +178,7 @@ create or replace package ut authid current_user as a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ); procedure run( @@ -194,7 +194,7 @@ create or replace package ut authid current_user as a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ); procedure run( diff --git a/source/api/ut_runner.pkb b/source/api/ut_runner.pkb index 3d262abe3..30cdf2691 100644 --- a/source/api/ut_runner.pkb +++ b/source/api/ut_runner.pkb @@ -91,7 +91,7 @@ create or replace package body ut_runner is a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is l_run ut_run; l_coverage_schema_names ut_varchar2_rows; @@ -99,7 +99,6 @@ create or replace package body ut_runner is l_include_object_names ut_object_names; l_paths ut_varchar2_list := ut_varchar2_list(); l_random_test_order_seed positive; - l_tags ut_varchar2_rows := ut_varchar2_rows(); begin ut_event_manager.initialize(); if a_reporters is not empty then @@ -126,12 +125,6 @@ create or replace package body ut_runner is end loop; end if; - if (a_tags is not null) or not(a_tags is empty) then - for i in 1..a_tags.count loop - l_tags := l_tags multiset union ut_utils.convert_collection(ut_utils.string_to_table(a_string => a_tags(i),a_delimiter => ',')); - end loop; - end if; - begin ut_expectation_processor.reset_invalidation_exception(); ut_utils.save_dbms_output_to_cache(); @@ -161,10 +154,10 @@ create or replace package body ut_runner is set(a_test_file_mappings), a_client_character_set, l_random_test_order_seed, - l_tags + a_tags ); - ut_suite_manager.configure_execution_by_path(l_paths, l_run.items, l_random_test_order_seed, l_tags); + ut_suite_manager.configure_execution_by_path(l_paths, l_run.items, l_random_test_order_seed, a_tags); if a_force_manual_rollback then l_run.set_rollback_type( a_rollback_type => ut_utils.gc_rollback_manual, a_force => true ); end if; diff --git a/source/api/ut_runner.pks b/source/api/ut_runner.pks index 895de3bb7..0434790f5 100644 --- a/source/api/ut_runner.pks +++ b/source/api/ut_runner.pks @@ -71,7 +71,7 @@ create or replace package ut_runner authid current_user is a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ); /** diff --git a/source/core/types/ut_run.tpb b/source/core/types/ut_run.tpb index c8f2778ff..d26c6fcb4 100644 --- a/source/core/types/ut_run.tpb +++ b/source/core/types/ut_run.tpb @@ -27,7 +27,7 @@ create or replace type body ut_run as 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 + a_run_tags varchar2 := null ) return self as result is begin self.run_paths := a_run_paths; diff --git a/source/core/types/ut_run.tps b/source/core/types/ut_run.tps index b5a1d18ac..7ea5cc605 100644 --- a/source/core/types/ut_run.tps +++ b/source/core/types/ut_run.tps @@ -21,7 +21,7 @@ create or replace type ut_run under ut_suite_item ( project_name varchar2(4000), items ut_suite_items, run_paths ut_varchar2_list, - run_tags ut_varchar2_rows, + run_tags varchar2(4000), coverage_options ut_coverage_options, test_file_mappings ut_file_mappings, client_character_set varchar2(100), @@ -37,7 +37,7 @@ create or replace type ut_run under ut_suite_item ( 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 + a_run_tags varchar2 := null ) return self as result, overriding member procedure mark_as_skipped(self in out nocopy ut_run), overriding member function do_execute(self in out nocopy ut_run) return boolean, diff --git a/source/core/types/ut_suite.tpb b/source/core/types/ut_suite.tpb index bf683d8aa..bd35d18ca 100644 --- a/source/core/types/ut_suite.tpb +++ b/source/core/types/ut_suite.tpb @@ -18,7 +18,7 @@ create or replace type body ut_suite as constructor function ut_suite ( self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer, - a_suite_tags ut_varchar2_rows := null + a_tags varchar2 := null ) return self as result is begin self.self_type := $$plsql_unit; @@ -26,7 +26,7 @@ create or replace type body ut_suite as self.items := ut_suite_items(); before_all_list := ut_executables(); after_all_list := ut_executables(); - self.suite_tags := a_suite_tags; + self.tags := a_tags; return; end; diff --git a/source/core/types/ut_suite.tps b/source/core/types/ut_suite.tps index 0da911b4f..0bcddd59b 100644 --- a/source/core/types/ut_suite.tps +++ b/source/core/types/ut_suite.tps @@ -29,10 +29,10 @@ create or replace type ut_suite under ut_logical_suite ( /** * Hold list of tags assign to suite */ - suite_tags ut_varchar2_rows, + tags varchar2(4000), constructor function ut_suite ( self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer, - a_suite_tags ut_varchar2_rows := null + a_tags varchar2 := null ) return self as result, overriding member function do_execute(self in out nocopy ut_suite) return boolean, overriding member function get_error_stack_traces(self ut_suite) return ut_varchar2_list, diff --git a/source/core/types/ut_test.tpb b/source/core/types/ut_test.tpb index f09a51162..c1d847bf5 100644 --- a/source/core/types/ut_test.tpb +++ b/source/core/types/ut_test.tpb @@ -18,7 +18,7 @@ create or replace type body ut_test as 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_test_tags ut_varchar2_rows := null + a_line_no integer, a_expected_error_codes ut_integer_list := null, a_tags varchar2 := null ) return self as result is begin self.self_type := $$plsql_unit; @@ -31,7 +31,7 @@ create or replace type body ut_test as self.all_expectations := ut_expectation_results(); self.failed_expectations := ut_expectation_results(); self.expected_error_codes := a_expected_error_codes; - self.test_tags := a_test_tags; + self.tags := a_tags; return; end; diff --git a/source/core/types/ut_test.tps b/source/core/types/ut_test.tps index caabdf1b1..23116119c 100644 --- a/source/core/types/ut_test.tps +++ b/source/core/types/ut_test.tps @@ -58,10 +58,10 @@ create or replace type ut_test force under ut_suite_item ( /** * Hold list of tags assign to test */ - test_tags ut_varchar2_rows, + tags varchar2(4000), 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_test_tags ut_varchar2_rows := null + a_line_no integer, a_expected_error_codes ut_integer_list := null, a_tags varchar2 := null ) return self as result, overriding member procedure mark_as_skipped(self in out nocopy ut_test), overriding member function do_execute(self in out nocopy ut_test) return boolean, diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index 2a6a810e3..e11c91a2b 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -309,13 +309,12 @@ create or replace package body ut_suite_builder is procedure add_tags_to_test( a_suite in out nocopy ut_suite, - a_list in out nocopy ut_varchar2_rows, + a_list in out nocopy varchar2, a_procedure_name t_object_name, a_tags_ann_text tt_annotation_texts ) is l_annotation_pos binary_integer; begin - a_list := ut_varchar2_rows(); l_annotation_pos := a_tags_ann_text.first; while l_annotation_pos is not null loop if a_tags_ann_text(l_annotation_pos) is null then @@ -325,8 +324,7 @@ create or replace package body ut_suite_builder is ); else a_list := - a_list multiset union - ut_utils.convert_collection(ut_utils.trim_list_elements(ut_utils.string_to_table(a_tags_ann_text(l_annotation_pos), ',', 'Y'))); + a_list || a_tags_ann_text(l_annotation_pos); end if; l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); end loop; @@ -514,7 +512,7 @@ create or replace package body ut_suite_builder is end if; if l_proc_annotations.exists( gc_tag) then - add_tags_to_test(a_suite, l_test.test_tags, a_procedure_name, l_proc_annotations( gc_tag)); + add_tags_to_test(a_suite, l_test.tags, a_procedure_name, l_proc_annotations( gc_tag)); end if; if l_proc_annotations.exists( gc_throws) then @@ -623,7 +621,7 @@ create or replace package body ut_suite_builder is a_tags_ann_text tt_annotation_texts ) is l_annotation_pos binary_integer; - l_tags ut_varchar2_rows := ut_varchar2_rows(); + l_tags varchar2(4000); begin l_annotation_pos := a_tags_ann_text.first; while l_annotation_pos is not null loop @@ -633,12 +631,11 @@ create or replace package body ut_suite_builder is ); else l_tags := - l_tags multiset union - ut_utils.convert_collection(ut_utils.trim_list_elements(ut_utils.string_to_table(a_tags_ann_text(l_annotation_pos), ',', 'Y'))); + l_tags || a_tags_ann_text(l_annotation_pos); end if; l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); end loop; - a_suite.suite_tags := l_tags; + a_suite.tags := l_tags; end; procedure add_suite_tests( diff --git a/source/core/ut_suite_cache.sql b/source/core/ut_suite_cache.sql index e41af9607..3a38ceeb7 100644 --- a/source/core/ut_suite_cache.sql +++ b/source/core/ut_suite_cache.sql @@ -47,7 +47,6 @@ create table ut_suite_cache ( nested table before_test_list store as ut_suite_cache_before_test nested table after_test_list store as ut_suite_cache_after_test nested table expected_error_codes store as ut_suite_cache_throws - nested table tags store as ut_suite_cache_tags return as locator as select cast(null as number(22)) id, @@ -69,7 +68,7 @@ create table ut_suite_cache ( t.after_each_list, t.after_test_list, t.expected_error_codes, - t.test_tags, + t.tags, t.item from table(ut_suite_contexts(ut_suite_context(user,'package_name','ctx_name',1))) c cross join table(ut_tests(ut_test(user,'package_name','test_name',1))) t diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index 55a6816e0..526a03338 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -104,7 +104,7 @@ create or replace package body ut_suite_cache_manager is 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.suite_tags tags, + null expected_error_codes, s.i.tags tags, null item from suites s; @@ -130,9 +130,22 @@ create or replace package body ut_suite_cache_manager is 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.test_tags as test_tags, + s.t.expected_error_codes as expected_error_codes, s.t.tags as test_tags, s.t.item as item from tests s; + + --TODO : Optimize to use only inserted + merge into ut_suite_cache_tag tgt + using ( select /*+cardinality (tt 100) */ t.id,tt.column_value tag + from ut_suite_cache t, + table(ut_utils.convert_collection((ut_utils.string_to_table(t.tags,',')))) tt + where tt.column_value is not null ) src + on ( tgt.suiteid = src.id and tgt.tagname = src.tag) + when not matched then + insert + (suiteid, tagname ) + values + (src.id, src.tag); end if; end if; diff --git a/source/core/ut_suite_cache_tag.sql b/source/core/ut_suite_cache_tag.sql new file mode 100644 index 000000000..17d287dd8 --- /dev/null +++ b/source/core/ut_suite_cache_tag.sql @@ -0,0 +1,7 @@ +create table ut_suite_cache_tag ( + suiteid number(22) not null, + tagname varchar2(100) not null, + constraint ut_suite_to_tag_pk primary key (suiteid,tagname), + constraint ut_suite_id_fk foreign key ( suiteid ) references ut_suite_cache(id) on delete cascade +) +organization index; \ No newline at end of file diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index ad433b8da..54bf8fa04 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -193,7 +193,7 @@ create or replace package body ut_suite_manager is 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), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags --TODO : Should be share or separate ) else ut_suite( @@ -206,7 +206,7 @@ create or replace package body ut_suite_manager is 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), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags --TODO : Should be share or separate ) end; when 'UT_SUITE_CONTEXT' then @@ -222,7 +222,7 @@ create or replace package body ut_suite_manager is 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), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags --TODO : Should be share or separate ) else ut_suite_context( @@ -235,7 +235,7 @@ create or replace package body ut_suite_manager is 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), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags --TODO : Should be share or separate ) end; when 'UT_LOGICAL_SUITE' then @@ -278,7 +278,7 @@ create or replace package body ut_suite_manager is 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, - test_tags => a_rows(a_idx).tags + tags => a_rows(a_idx).tags ); end case; l_result.results_count.warnings_count := l_result.warnings.count; @@ -363,14 +363,14 @@ create or replace package body ut_suite_manager is a_procedure_name varchar2 := null, a_skip_all_objects boolean := false, a_random_seed positive, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) return t_cached_suites_cursor is l_path varchar2( 4000 ); l_result sys_refcursor; l_ut_owner varchar2(250) := ut_utils.ut_owner; l_sql varchar2(32767); - l_tags ut_varchar2_rows := coalesce(a_tags,ut_varchar2_rows()); l_suite_item_name varchar2(20); + l_tag_list varchar2(4000) :=a_tags; begin if a_path is null and a_object_name is not null then execute immediate 'select min(path) @@ -382,8 +382,7 @@ create or replace package body ut_suite_manager is else l_path := lower( a_path ); end if; - - l_suite_item_name := case when l_tags.count > 0 then 'suite_items_tags' else 'suite_items' end; + l_suite_item_name := case when l_tag_list is not null then 'suite_items_tags' else 'suite_items' end; /* Rewrite that as tags should be put on whats left not on full suite item cache */ l_sql := @@ -415,13 +414,13 @@ create or replace package body ut_suite_manager is ) ) ),]' - ||case when l_tags.count > 0 then + ||case when l_tag_list is not null then q'[ filter_tags as ( select s.* from suite_items s where exists ( select 1 - from table(s.tags) ct,table(:l_tags) tag - where ct.column_value = tag.column_value) + from ]'||l_ut_owner||q'[.ut_suite_cache_tag ct + where ct.suiteid = s.id and instr(:a_tag_list,ct.tagname) > 0 ) ), suite_items_tags as ( select c.* from suite_items c @@ -431,7 +430,7 @@ create or replace package body ut_suite_manager is ) ),]' else - q'[dummy as (select 1 from table(:l_tags) where 1 = 2 ),]' + q'[dummy as (select 'x' from dual where :a_tag_list is null ),]' end|| q'[ suitepaths as ( select distinct substr(path,1,instr(path,'.',-1)-1) as suitepath, @@ -457,7 +456,6 @@ create or replace package body ut_suite_manager is upper( substr(p.path, instr( p.path, '.', -1 ) + 1 ) ) as object_name, cast(null as ]'||l_ut_owner||q'[.ut_executables) as x, cast(null as ]'||l_ut_owner||q'[.ut_integer_list) as y, - cast(null as ]'||l_ut_owner||q'[.ut_varchar2_rows) as q, cast(null as ]'||l_ut_owner||q'[.ut_executable_test) as z from suitepath_part p where p.path @@ -471,7 +469,7 @@ create or replace package body ut_suite_manager is s.x as before_all_list, s.x as after_all_list, s.x as before_each_list, s.x as before_test_list, s.x as after_each_list, s.x as after_test_list, - s.y as expected_error_codes, s.q as test_tags, + s.y as expected_error_codes, null as test_tags, s.z as item from logical_suite_data s ), @@ -499,8 +497,8 @@ create or replace package body ut_suite_manager is l_ut_owner||'.ut_annotation_manager.hash_suite_path( c.path, :a_random_seed ) desc nulls last' - end; - open l_result for l_sql using l_path, l_path, upper(a_object_name), upper(a_procedure_name), l_tags, a_random_seed; + end; + open l_result for l_sql using l_path, l_path, upper(a_object_name), upper(a_procedure_name), l_tag_list, a_random_seed; return l_result; end; @@ -588,7 +586,7 @@ create or replace package body ut_suite_manager is a_procedure_name varchar2 := null, a_suites in out nocopy ut_suite_items, a_random_seed positive, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is begin refresh_cache(a_owner_name); @@ -695,7 +693,7 @@ create or replace package body ut_suite_manager is a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, a_random_seed in positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is l_paths ut_varchar2_list := a_paths; l_path_items t_path_items; @@ -736,8 +734,8 @@ create or replace package body ut_suite_manager is 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'); elsif l_path_item.object_name is not null then raise_application_error(ut_utils.gc_suite_package_not_found,'Suite package '||l_schema||'.'||l_path_item.object_name|| ' does not exist'); - elsif a_tags.count > 0 then - raise_application_error(ut_utils.gc_suite_package_not_found,'No suite packages found for tags: '||ut_utils.to_string(ut_utils.table_to_clob(a_tags,','),a_max_output_len => 450)); + elsif a_tags is not null then + raise_application_error(ut_utils.gc_suite_package_not_found,'No suite packages found for tags: '||ut_utils.to_string(a_tags,a_max_output_len => 450)); end if; end if; l_index := a_suites.first; diff --git a/source/core/ut_suite_manager.pks b/source/core/ut_suite_manager.pks index 9b214a6c2..5b7c705c6 100644 --- a/source/core/ut_suite_manager.pks +++ b/source/core/ut_suite_manager.pks @@ -50,7 +50,7 @@ create or replace package ut_suite_manager authid current_user is a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, a_random_seed in positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ); /** diff --git a/source/create_synonyms_and_grants_for_public.sql b/source/create_synonyms_and_grants_for_public.sql index 609d78ccf..6cc40afdc 100644 --- a/source/create_synonyms_and_grants_for_public.sql +++ b/source/create_synonyms_and_grants_for_public.sql @@ -93,6 +93,7 @@ grant select on &&ut3_owner..ut_annotation_cache to public; grant execute on &&ut3_owner..ut_executables to public; grant execute on &&ut3_owner..ut_executable_test to public; grant select on &&ut3_owner..ut_suite_cache to public; +grant select on &&ut3_owner..ut_suite_cache_tag to public; grant select on &&ut3_owner..ut_suite_cache_package to public; grant select on &&ut3_owner..ut_suite_cache_schema to public; grant execute on &&ut3_owner..ut_annotation_cache_manager to public; diff --git a/source/create_user_grants.sql b/source/create_user_grants.sql index 7aa5deb39..ace73b951 100644 --- a/source/create_user_grants.sql +++ b/source/create_user_grants.sql @@ -114,6 +114,7 @@ grant select on &&ut3_owner..ut_annotation_cache to &ut3_user; grant execute on &&ut3_owner..ut_executables to &ut3_user; grant execute on &&ut3_owner..ut_executable_test to &ut3_user; grant select on &&ut3_owner..ut_suite_cache to &ut3_user; +grant select on &&ut3_owner..ut_suite_cache_tag to &ut3_user; grant select on &&ut3_owner..ut_suite_cache_package to public; grant select on &&ut3_owner..ut_suite_cache_schema to &ut3_user; grant execute on &&ut3_owner..ut_annotation_cache_manager to &ut3_user; diff --git a/source/install.sql b/source/install.sql index 728f4349f..86669c11d 100644 --- a/source/install.sql +++ b/source/install.sql @@ -130,6 +130,7 @@ alter session set current_schema = &&ut3_owner; @@install_component.sql 'core/ut_suite_cache_package.sql' @@install_component.sql 'core/ut_suite_cache_seq.sql' @@install_component.sql 'core/ut_suite_cache.sql' +@@install_component.sql 'core/ut_suite_cache_tag.sql' @@install_component.sql 'core/ut_suite_cache_manager.pks' @@install_component.sql 'core/ut_suite_cache_manager.pkb' @@install_component.sql 'core/ut_suite_builder.pks' diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index e2295f34d..e68b50664 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -63,6 +63,8 @@ drop package ut_suite_manager; drop package ut_suite_builder; +drop table ut_suite_cache_tag; + drop table ut_suite_cache; drop sequence ut_suite_cache_seq; diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index 7ef85a53a..71d3d32a0 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -897,7 +897,7 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || - '' || + '' || '' || '' || '%suite_level_testIn suitesome_package.suite_level_test' || @@ -907,7 +907,7 @@ create or replace package body test_suite_builder is '%some_packagesuite_level_beforeall' || '%' || '' || - '' || + '' || '' ); end; From d2f9796446234f6b40fd417217ade24e5bf6a22e Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 19 Apr 2019 21:04:55 +0100 Subject: [PATCH 084/181] Switch to use VARCHAR2 instead of UT_VARCHAR2_ROWS() Signed-off-by: lwasylow --- source/api/ut.pkb | 28 ++++++------- source/api/ut.pks | 4 +- source/api/ut_runner.pkb | 13 ++---- source/api/ut_runner.pks | 2 +- source/core/types/ut_run.tpb | 2 +- source/core/types/ut_run.tps | 4 +- source/core/types/ut_suite.tpb | 4 +- source/core/types/ut_suite.tps | 4 +- source/core/types/ut_test.tpb | 4 +- source/core/types/ut_test.tps | 4 +- source/core/ut_suite_builder.pkb | 15 +++---- source/core/ut_suite_cache.sql | 3 +- source/core/ut_suite_cache_manager.pkb | 17 +++++++- source/core/ut_suite_cache_tag.sql | 7 ++++ source/core/ut_suite_manager.pkb | 40 +++++++++---------- source/core/ut_suite_manager.pks | 2 +- .../create_synonyms_and_grants_for_public.sql | 1 + source/create_user_grants.sql | 1 + source/install.sql | 1 + source/uninstall_objects.sql | 2 + test/ut3_tester/core/test_suite_builder.pkb | 14 +++---- 21 files changed, 92 insertions(+), 80 deletions(-) create mode 100644 source/core/ut_suite_cache_tag.sql diff --git a/source/api/ut.pkb b/source/api/ut.pkb index 96cf51102..1a95f0725 100644 --- a/source/api/ut.pkb +++ b/source/api/ut.pkb @@ -121,7 +121,7 @@ create or replace package body ut is a_client_character_set varchar2, a_random_test_order integer, a_random_test_order_seed positive, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is pragma autonomous_transaction; begin @@ -157,7 +157,7 @@ create or replace package body ut is a_client_character_set varchar2, a_random_test_order integer, a_random_test_order_seed positive, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is pragma autonomous_transaction; begin @@ -234,7 +234,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -273,7 +273,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -313,7 +313,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -353,7 +353,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -393,7 +393,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -433,7 +433,7 @@ create or replace package body ut is a_client_character_set, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); if l_reporter is of (ut_output_reporter_base) then l_results := treat(l_reporter as ut_output_reporter_base).get_lines_cursor(); @@ -457,7 +457,7 @@ create or replace package body ut is a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is l_reporter ut_reporter_base := a_reporter; begin @@ -514,7 +514,7 @@ create or replace package body ut is a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is l_reporter ut_reporter_base := a_reporter; begin @@ -563,7 +563,7 @@ create or replace package body ut is a_force_manual_rollback, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); end; @@ -595,7 +595,7 @@ create or replace package body ut is a_force_manual_rollback, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); end; @@ -628,7 +628,7 @@ create or replace package body ut is a_force_manual_rollback, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); end; @@ -661,7 +661,7 @@ create or replace package body ut is a_force_manual_rollback, a_random_test_order, a_random_test_order_seed, - ut_varchar2_rows(a_tags) + a_tags ); end; diff --git a/source/api/ut.pks b/source/api/ut.pks index e6065d85b..17b4a845e 100644 --- a/source/api/ut.pks +++ b/source/api/ut.pks @@ -178,7 +178,7 @@ create or replace package ut authid current_user as a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ); procedure run( @@ -194,7 +194,7 @@ create or replace package ut authid current_user as a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ); procedure run( diff --git a/source/api/ut_runner.pkb b/source/api/ut_runner.pkb index 3d262abe3..30cdf2691 100644 --- a/source/api/ut_runner.pkb +++ b/source/api/ut_runner.pkb @@ -91,7 +91,7 @@ create or replace package body ut_runner is a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is l_run ut_run; l_coverage_schema_names ut_varchar2_rows; @@ -99,7 +99,6 @@ create or replace package body ut_runner is l_include_object_names ut_object_names; l_paths ut_varchar2_list := ut_varchar2_list(); l_random_test_order_seed positive; - l_tags ut_varchar2_rows := ut_varchar2_rows(); begin ut_event_manager.initialize(); if a_reporters is not empty then @@ -126,12 +125,6 @@ create or replace package body ut_runner is end loop; end if; - if (a_tags is not null) or not(a_tags is empty) then - for i in 1..a_tags.count loop - l_tags := l_tags multiset union ut_utils.convert_collection(ut_utils.string_to_table(a_string => a_tags(i),a_delimiter => ',')); - end loop; - end if; - begin ut_expectation_processor.reset_invalidation_exception(); ut_utils.save_dbms_output_to_cache(); @@ -161,10 +154,10 @@ create or replace package body ut_runner is set(a_test_file_mappings), a_client_character_set, l_random_test_order_seed, - l_tags + a_tags ); - ut_suite_manager.configure_execution_by_path(l_paths, l_run.items, l_random_test_order_seed, l_tags); + ut_suite_manager.configure_execution_by_path(l_paths, l_run.items, l_random_test_order_seed, a_tags); if a_force_manual_rollback then l_run.set_rollback_type( a_rollback_type => ut_utils.gc_rollback_manual, a_force => true ); end if; diff --git a/source/api/ut_runner.pks b/source/api/ut_runner.pks index 895de3bb7..0434790f5 100644 --- a/source/api/ut_runner.pks +++ b/source/api/ut_runner.pks @@ -71,7 +71,7 @@ create or replace package ut_runner authid current_user is a_force_manual_rollback boolean := false, a_random_test_order boolean := false, a_random_test_order_seed positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ); /** diff --git a/source/core/types/ut_run.tpb b/source/core/types/ut_run.tpb index c8f2778ff..d26c6fcb4 100644 --- a/source/core/types/ut_run.tpb +++ b/source/core/types/ut_run.tpb @@ -27,7 +27,7 @@ create or replace type body ut_run as 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 + a_run_tags varchar2 := null ) return self as result is begin self.run_paths := a_run_paths; diff --git a/source/core/types/ut_run.tps b/source/core/types/ut_run.tps index b5a1d18ac..7ea5cc605 100644 --- a/source/core/types/ut_run.tps +++ b/source/core/types/ut_run.tps @@ -21,7 +21,7 @@ create or replace type ut_run under ut_suite_item ( project_name varchar2(4000), items ut_suite_items, run_paths ut_varchar2_list, - run_tags ut_varchar2_rows, + run_tags varchar2(4000), coverage_options ut_coverage_options, test_file_mappings ut_file_mappings, client_character_set varchar2(100), @@ -37,7 +37,7 @@ create or replace type ut_run under ut_suite_item ( 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 + a_run_tags varchar2 := null ) return self as result, overriding member procedure mark_as_skipped(self in out nocopy ut_run), overriding member function do_execute(self in out nocopy ut_run) return boolean, diff --git a/source/core/types/ut_suite.tpb b/source/core/types/ut_suite.tpb index bf683d8aa..bd35d18ca 100644 --- a/source/core/types/ut_suite.tpb +++ b/source/core/types/ut_suite.tpb @@ -18,7 +18,7 @@ create or replace type body ut_suite as constructor function ut_suite ( self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer, - a_suite_tags ut_varchar2_rows := null + a_tags varchar2 := null ) return self as result is begin self.self_type := $$plsql_unit; @@ -26,7 +26,7 @@ create or replace type body ut_suite as self.items := ut_suite_items(); before_all_list := ut_executables(); after_all_list := ut_executables(); - self.suite_tags := a_suite_tags; + self.tags := a_tags; return; end; diff --git a/source/core/types/ut_suite.tps b/source/core/types/ut_suite.tps index 0da911b4f..0bcddd59b 100644 --- a/source/core/types/ut_suite.tps +++ b/source/core/types/ut_suite.tps @@ -29,10 +29,10 @@ create or replace type ut_suite under ut_logical_suite ( /** * Hold list of tags assign to suite */ - suite_tags ut_varchar2_rows, + tags varchar2(4000), constructor function ut_suite ( self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer, - a_suite_tags ut_varchar2_rows := null + a_tags varchar2 := null ) return self as result, overriding member function do_execute(self in out nocopy ut_suite) return boolean, overriding member function get_error_stack_traces(self ut_suite) return ut_varchar2_list, diff --git a/source/core/types/ut_test.tpb b/source/core/types/ut_test.tpb index f09a51162..c1d847bf5 100644 --- a/source/core/types/ut_test.tpb +++ b/source/core/types/ut_test.tpb @@ -18,7 +18,7 @@ create or replace type body ut_test as 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_test_tags ut_varchar2_rows := null + a_line_no integer, a_expected_error_codes ut_integer_list := null, a_tags varchar2 := null ) return self as result is begin self.self_type := $$plsql_unit; @@ -31,7 +31,7 @@ create or replace type body ut_test as self.all_expectations := ut_expectation_results(); self.failed_expectations := ut_expectation_results(); self.expected_error_codes := a_expected_error_codes; - self.test_tags := a_test_tags; + self.tags := a_tags; return; end; diff --git a/source/core/types/ut_test.tps b/source/core/types/ut_test.tps index caabdf1b1..23116119c 100644 --- a/source/core/types/ut_test.tps +++ b/source/core/types/ut_test.tps @@ -58,10 +58,10 @@ create or replace type ut_test force under ut_suite_item ( /** * Hold list of tags assign to test */ - test_tags ut_varchar2_rows, + tags varchar2(4000), 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_test_tags ut_varchar2_rows := null + a_line_no integer, a_expected_error_codes ut_integer_list := null, a_tags varchar2 := null ) return self as result, overriding member procedure mark_as_skipped(self in out nocopy ut_test), overriding member function do_execute(self in out nocopy ut_test) return boolean, diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index 2a6a810e3..e11c91a2b 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -309,13 +309,12 @@ create or replace package body ut_suite_builder is procedure add_tags_to_test( a_suite in out nocopy ut_suite, - a_list in out nocopy ut_varchar2_rows, + a_list in out nocopy varchar2, a_procedure_name t_object_name, a_tags_ann_text tt_annotation_texts ) is l_annotation_pos binary_integer; begin - a_list := ut_varchar2_rows(); l_annotation_pos := a_tags_ann_text.first; while l_annotation_pos is not null loop if a_tags_ann_text(l_annotation_pos) is null then @@ -325,8 +324,7 @@ create or replace package body ut_suite_builder is ); else a_list := - a_list multiset union - ut_utils.convert_collection(ut_utils.trim_list_elements(ut_utils.string_to_table(a_tags_ann_text(l_annotation_pos), ',', 'Y'))); + a_list || a_tags_ann_text(l_annotation_pos); end if; l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); end loop; @@ -514,7 +512,7 @@ create or replace package body ut_suite_builder is end if; if l_proc_annotations.exists( gc_tag) then - add_tags_to_test(a_suite, l_test.test_tags, a_procedure_name, l_proc_annotations( gc_tag)); + add_tags_to_test(a_suite, l_test.tags, a_procedure_name, l_proc_annotations( gc_tag)); end if; if l_proc_annotations.exists( gc_throws) then @@ -623,7 +621,7 @@ create or replace package body ut_suite_builder is a_tags_ann_text tt_annotation_texts ) is l_annotation_pos binary_integer; - l_tags ut_varchar2_rows := ut_varchar2_rows(); + l_tags varchar2(4000); begin l_annotation_pos := a_tags_ann_text.first; while l_annotation_pos is not null loop @@ -633,12 +631,11 @@ create or replace package body ut_suite_builder is ); else l_tags := - l_tags multiset union - ut_utils.convert_collection(ut_utils.trim_list_elements(ut_utils.string_to_table(a_tags_ann_text(l_annotation_pos), ',', 'Y'))); + l_tags || a_tags_ann_text(l_annotation_pos); end if; l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); end loop; - a_suite.suite_tags := l_tags; + a_suite.tags := l_tags; end; procedure add_suite_tests( diff --git a/source/core/ut_suite_cache.sql b/source/core/ut_suite_cache.sql index e41af9607..3a38ceeb7 100644 --- a/source/core/ut_suite_cache.sql +++ b/source/core/ut_suite_cache.sql @@ -47,7 +47,6 @@ create table ut_suite_cache ( nested table before_test_list store as ut_suite_cache_before_test nested table after_test_list store as ut_suite_cache_after_test nested table expected_error_codes store as ut_suite_cache_throws - nested table tags store as ut_suite_cache_tags return as locator as select cast(null as number(22)) id, @@ -69,7 +68,7 @@ create table ut_suite_cache ( t.after_each_list, t.after_test_list, t.expected_error_codes, - t.test_tags, + t.tags, t.item from table(ut_suite_contexts(ut_suite_context(user,'package_name','ctx_name',1))) c cross join table(ut_tests(ut_test(user,'package_name','test_name',1))) t diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index 55a6816e0..526a03338 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -104,7 +104,7 @@ create or replace package body ut_suite_cache_manager is 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.suite_tags tags, + null expected_error_codes, s.i.tags tags, null item from suites s; @@ -130,9 +130,22 @@ create or replace package body ut_suite_cache_manager is 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.test_tags as test_tags, + s.t.expected_error_codes as expected_error_codes, s.t.tags as test_tags, s.t.item as item from tests s; + + --TODO : Optimize to use only inserted + merge into ut_suite_cache_tag tgt + using ( select /*+cardinality (tt 100) */ t.id,tt.column_value tag + from ut_suite_cache t, + table(ut_utils.convert_collection((ut_utils.string_to_table(t.tags,',')))) tt + where tt.column_value is not null ) src + on ( tgt.suiteid = src.id and tgt.tagname = src.tag) + when not matched then + insert + (suiteid, tagname ) + values + (src.id, src.tag); end if; end if; diff --git a/source/core/ut_suite_cache_tag.sql b/source/core/ut_suite_cache_tag.sql new file mode 100644 index 000000000..17d287dd8 --- /dev/null +++ b/source/core/ut_suite_cache_tag.sql @@ -0,0 +1,7 @@ +create table ut_suite_cache_tag ( + suiteid number(22) not null, + tagname varchar2(100) not null, + constraint ut_suite_to_tag_pk primary key (suiteid,tagname), + constraint ut_suite_id_fk foreign key ( suiteid ) references ut_suite_cache(id) on delete cascade +) +organization index; \ No newline at end of file diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index ad433b8da..54bf8fa04 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -193,7 +193,7 @@ create or replace package body ut_suite_manager is 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), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags --TODO : Should be share or separate ) else ut_suite( @@ -206,7 +206,7 @@ create or replace package body ut_suite_manager is 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), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags --TODO : Should be share or separate ) end; when 'UT_SUITE_CONTEXT' then @@ -222,7 +222,7 @@ create or replace package body ut_suite_manager is 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), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags --TODO : Should be share or separate ) else ut_suite_context( @@ -235,7 +235,7 @@ create or replace package body ut_suite_manager is 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), suite_tags => a_rows(a_idx).tags --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags --TODO : Should be share or separate ) end; when 'UT_LOGICAL_SUITE' then @@ -278,7 +278,7 @@ create or replace package body ut_suite_manager is 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, - test_tags => a_rows(a_idx).tags + tags => a_rows(a_idx).tags ); end case; l_result.results_count.warnings_count := l_result.warnings.count; @@ -363,14 +363,14 @@ create or replace package body ut_suite_manager is a_procedure_name varchar2 := null, a_skip_all_objects boolean := false, a_random_seed positive, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) return t_cached_suites_cursor is l_path varchar2( 4000 ); l_result sys_refcursor; l_ut_owner varchar2(250) := ut_utils.ut_owner; l_sql varchar2(32767); - l_tags ut_varchar2_rows := coalesce(a_tags,ut_varchar2_rows()); l_suite_item_name varchar2(20); + l_tag_list varchar2(4000) :=a_tags; begin if a_path is null and a_object_name is not null then execute immediate 'select min(path) @@ -382,8 +382,7 @@ create or replace package body ut_suite_manager is else l_path := lower( a_path ); end if; - - l_suite_item_name := case when l_tags.count > 0 then 'suite_items_tags' else 'suite_items' end; + l_suite_item_name := case when l_tag_list is not null then 'suite_items_tags' else 'suite_items' end; /* Rewrite that as tags should be put on whats left not on full suite item cache */ l_sql := @@ -415,13 +414,13 @@ create or replace package body ut_suite_manager is ) ) ),]' - ||case when l_tags.count > 0 then + ||case when l_tag_list is not null then q'[ filter_tags as ( select s.* from suite_items s where exists ( select 1 - from table(s.tags) ct,table(:l_tags) tag - where ct.column_value = tag.column_value) + from ]'||l_ut_owner||q'[.ut_suite_cache_tag ct + where ct.suiteid = s.id and instr(:a_tag_list,ct.tagname) > 0 ) ), suite_items_tags as ( select c.* from suite_items c @@ -431,7 +430,7 @@ create or replace package body ut_suite_manager is ) ),]' else - q'[dummy as (select 1 from table(:l_tags) where 1 = 2 ),]' + q'[dummy as (select 'x' from dual where :a_tag_list is null ),]' end|| q'[ suitepaths as ( select distinct substr(path,1,instr(path,'.',-1)-1) as suitepath, @@ -457,7 +456,6 @@ create or replace package body ut_suite_manager is upper( substr(p.path, instr( p.path, '.', -1 ) + 1 ) ) as object_name, cast(null as ]'||l_ut_owner||q'[.ut_executables) as x, cast(null as ]'||l_ut_owner||q'[.ut_integer_list) as y, - cast(null as ]'||l_ut_owner||q'[.ut_varchar2_rows) as q, cast(null as ]'||l_ut_owner||q'[.ut_executable_test) as z from suitepath_part p where p.path @@ -471,7 +469,7 @@ create or replace package body ut_suite_manager is s.x as before_all_list, s.x as after_all_list, s.x as before_each_list, s.x as before_test_list, s.x as after_each_list, s.x as after_test_list, - s.y as expected_error_codes, s.q as test_tags, + s.y as expected_error_codes, null as test_tags, s.z as item from logical_suite_data s ), @@ -499,8 +497,8 @@ create or replace package body ut_suite_manager is l_ut_owner||'.ut_annotation_manager.hash_suite_path( c.path, :a_random_seed ) desc nulls last' - end; - open l_result for l_sql using l_path, l_path, upper(a_object_name), upper(a_procedure_name), l_tags, a_random_seed; + end; + open l_result for l_sql using l_path, l_path, upper(a_object_name), upper(a_procedure_name), l_tag_list, a_random_seed; return l_result; end; @@ -588,7 +586,7 @@ create or replace package body ut_suite_manager is a_procedure_name varchar2 := null, a_suites in out nocopy ut_suite_items, a_random_seed positive, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is begin refresh_cache(a_owner_name); @@ -695,7 +693,7 @@ create or replace package body ut_suite_manager is a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, a_random_seed in positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ) is l_paths ut_varchar2_list := a_paths; l_path_items t_path_items; @@ -736,8 +734,8 @@ create or replace package body ut_suite_manager is 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'); elsif l_path_item.object_name is not null then raise_application_error(ut_utils.gc_suite_package_not_found,'Suite package '||l_schema||'.'||l_path_item.object_name|| ' does not exist'); - elsif a_tags.count > 0 then - raise_application_error(ut_utils.gc_suite_package_not_found,'No suite packages found for tags: '||ut_utils.to_string(ut_utils.table_to_clob(a_tags,','),a_max_output_len => 450)); + elsif a_tags is not null then + raise_application_error(ut_utils.gc_suite_package_not_found,'No suite packages found for tags: '||ut_utils.to_string(a_tags,a_max_output_len => 450)); end if; end if; l_index := a_suites.first; diff --git a/source/core/ut_suite_manager.pks b/source/core/ut_suite_manager.pks index 9b214a6c2..5b7c705c6 100644 --- a/source/core/ut_suite_manager.pks +++ b/source/core/ut_suite_manager.pks @@ -50,7 +50,7 @@ create or replace package ut_suite_manager authid current_user is a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, a_random_seed in positive := null, - a_tags ut_varchar2_rows := null + a_tags varchar2 := null ); /** diff --git a/source/create_synonyms_and_grants_for_public.sql b/source/create_synonyms_and_grants_for_public.sql index 609d78ccf..6cc40afdc 100644 --- a/source/create_synonyms_and_grants_for_public.sql +++ b/source/create_synonyms_and_grants_for_public.sql @@ -93,6 +93,7 @@ grant select on &&ut3_owner..ut_annotation_cache to public; grant execute on &&ut3_owner..ut_executables to public; grant execute on &&ut3_owner..ut_executable_test to public; grant select on &&ut3_owner..ut_suite_cache to public; +grant select on &&ut3_owner..ut_suite_cache_tag to public; grant select on &&ut3_owner..ut_suite_cache_package to public; grant select on &&ut3_owner..ut_suite_cache_schema to public; grant execute on &&ut3_owner..ut_annotation_cache_manager to public; diff --git a/source/create_user_grants.sql b/source/create_user_grants.sql index 7aa5deb39..ace73b951 100644 --- a/source/create_user_grants.sql +++ b/source/create_user_grants.sql @@ -114,6 +114,7 @@ grant select on &&ut3_owner..ut_annotation_cache to &ut3_user; grant execute on &&ut3_owner..ut_executables to &ut3_user; grant execute on &&ut3_owner..ut_executable_test to &ut3_user; grant select on &&ut3_owner..ut_suite_cache to &ut3_user; +grant select on &&ut3_owner..ut_suite_cache_tag to &ut3_user; grant select on &&ut3_owner..ut_suite_cache_package to public; grant select on &&ut3_owner..ut_suite_cache_schema to &ut3_user; grant execute on &&ut3_owner..ut_annotation_cache_manager to &ut3_user; diff --git a/source/install.sql b/source/install.sql index 728f4349f..86669c11d 100644 --- a/source/install.sql +++ b/source/install.sql @@ -130,6 +130,7 @@ alter session set current_schema = &&ut3_owner; @@install_component.sql 'core/ut_suite_cache_package.sql' @@install_component.sql 'core/ut_suite_cache_seq.sql' @@install_component.sql 'core/ut_suite_cache.sql' +@@install_component.sql 'core/ut_suite_cache_tag.sql' @@install_component.sql 'core/ut_suite_cache_manager.pks' @@install_component.sql 'core/ut_suite_cache_manager.pkb' @@install_component.sql 'core/ut_suite_builder.pks' diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index e2295f34d..e68b50664 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -63,6 +63,8 @@ drop package ut_suite_manager; drop package ut_suite_builder; +drop table ut_suite_cache_tag; + drop table ut_suite_cache; drop sequence ut_suite_cache_seq; diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index 7ef85a53a..17fbca74a 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -652,7 +652,7 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || - '' || + '' || '' || '' || '%suite_level_testIn suitesome_package.suite_level_test' || @@ -662,7 +662,7 @@ create or replace package body test_suite_builder is '%some_packagesuite_level_beforeall' || '%' || '' || - '' || + '' || '' ); end; @@ -798,7 +798,7 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || - ''|| + ''|| '' ); end; @@ -840,7 +840,7 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || - '' || + '' || '' || '' || '%suite_level_testIn suitesome_package.suite_level_test' || @@ -850,7 +850,7 @@ create or replace package body test_suite_builder is '%some_packagesuite_level_beforeall' || '%' || '' || - '' || + '' || '' ); end; @@ -897,7 +897,7 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || - '' || + '' || '' || '' || '%suite_level_testIn suitesome_package.suite_level_test' || @@ -907,7 +907,7 @@ create or replace package body test_suite_builder is '%some_packagesuite_level_beforeall' || '%' || '' || - '' || + '' || '' ); end; From 1fbf433369ac074e6f18d250828d36c93755e27f Mon Sep 17 00:00:00 2001 From: Lukasz Date: Fri, 19 Apr 2019 23:00:02 +0100 Subject: [PATCH 085/181] Fix/oracle bug with xmlspaces (#895) * Address issue with whitespace in XML. Cursor describe is ignoring whitespace so max len of column with value ' t ' is showing as 1. XMLTABLE when extracting values from tag with whitespaces its ignoring them. It works properly if there is any character there e.g ' t '. * Update tests --- .../data_values/ut_compound_data_helper.pkb | 2 + .../data_values/ut_data_value_refcursor.tpb | 14 ++- .../expectations/test_expectations_cursor.pkb | 85 +++++++++++++++++++ .../expectations/test_expectations_cursor.pks | 25 ++++++ 4 files changed, 122 insertions(+), 4 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 322b9b215..6e8453f45 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -235,6 +235,8 @@ create or replace package body ut_compound_data_helper is l_col_type := 'VARCHAR2(50)'; elsif a_data_info.is_sql_diffable = 1 and type_no_length(a_data_info.column_type) then l_col_type := a_data_info.column_type; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('VARCHAR2','CHAR') then + l_col_type := 'VARCHAR2('||greatest(a_data_info.column_len,4000)||')'; else l_col_type := a_data_info.column_type ||case when a_data_info.column_len is not null diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index 23dca3dcf..ee929d097 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -49,15 +49,22 @@ create or replace type body ut_data_value_refcursor as dbms_xmlgen.setNullHandling(l_ctx, dbms_xmlgen.empty_tag); dbms_xmlgen.setMaxRows(l_ctx, c_bulk_rows); loop - l_xml := dbms_xmlgen.getxmltype(l_ctx); + l_xml := dbms_xmlgen.getxmltype(l_ctx); 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 + l_xml := xmltype( replace(l_xml.getClobVal(),' Date: Fri, 19 Apr 2019 22:59:18 +0000 Subject: [PATCH 086/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index ec79d645c..5f66fa774 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 3f6cffed3..5d31926b9 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 497d20418..94576cced 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index f1f3615b3..6493c0977 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index d448537b9..af338a8c6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 556d97129..5d15c45d0 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 922ab5227..c659f7237 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index cc41a86a5..ff6e3e9e1 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 8de2fdb27..546c24556 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index be73ccf6d..c3e04fd73 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 2e030665b..fa6190a5c 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index babf5a51b..70b19945e 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 060974505..327dd5a13 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 488db9204..df973f5ea 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 494f9ef6a..d0c2bbd63 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 4cdc4fb7c..9b765300a 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index fa03c5a19..d4c36b78f 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2851--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index dcf24f2e4..da3778eab 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2851-develop + * secion v3.1.7.2859-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index bfb3bc219..6ea107499 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2851-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2859-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 1a941a8698714e484079a40dbdd1e5375eae148a Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sat, 20 Apr 2019 18:36:43 +0100 Subject: [PATCH 087/181] Adding Tests to tags #suitebuilder --- source/core/ut_suite_builder.pkb | 20 +- source/core/ut_utils.pkb | 1 - test/ut3_tester/core/test_suite_builder.pkb | 300 ++++++++++++++++++++ test/ut3_tester/core/test_suite_builder.pks | 47 +++ 4 files changed, 361 insertions(+), 7 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index e11c91a2b..ccb91c203 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -314,6 +314,7 @@ create or replace package body ut_suite_builder is a_tags_ann_text tt_annotation_texts ) is l_annotation_pos binary_integer; + l_tag_list ut_varchar2_list := ut_varchar2_list(); begin l_annotation_pos := a_tags_ann_text.first; while l_annotation_pos is not null loop @@ -323,9 +324,13 @@ create or replace package body ut_suite_builder is || chr( 10 ) || 'at "' || get_qualified_object_name(a_suite, a_procedure_name) || '", line ' || l_annotation_pos ); else - a_list := - a_list || a_tags_ann_text(l_annotation_pos); + 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; + a_list := ut_utils.table_to_clob( + ut_utils.filter_list(l_tag_list,'^(\w|\S)+$'), + ','); l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); end loop; @@ -621,7 +626,7 @@ create or replace package body ut_suite_builder is a_tags_ann_text tt_annotation_texts ) is l_annotation_pos binary_integer; - l_tags varchar2(4000); + l_tag_list ut_varchar2_list := ut_varchar2_list(); begin l_annotation_pos := a_tags_ann_text.first; while l_annotation_pos is not null loop @@ -630,12 +635,15 @@ create or replace package body ut_suite_builder is '"--%tag" annotation requires a tag value populated. Annotation ignored, line ' || l_annotation_pos ); else - l_tags := - l_tags || a_tags_ann_text(l_annotation_pos); + 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; l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); end loop; - a_suite.tags := l_tags; + a_suite.tags := ut_utils.table_to_clob( + ut_utils.filter_list(l_tag_list,'^(\w|\S)+$'), + ','); end; procedure add_suite_tests( diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index be8da247e..64aa57af9 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -610,7 +610,6 @@ create or replace package body ut_utils is if a_list is not null then l_filtered_list := ut_varchar2_list(); l_index := a_list.first; - while (l_index is not null) loop if regexp_like(a_list(l_index), a_regexp_filter) then l_filtered_list.extend; diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index 17fbca74a..6d9289d3c 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -1121,5 +1121,305 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_match('(.*)(Unsupported annotation "--%bad_package_annotation"\. Annotation ignored\.)(.*)( line 17)(.*)', 'n'); end; + procedure test_tag_annotation is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), + ut3.ut_annotation(9, 'tag','testtag', 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%test_procedureSome testsome_package.test_procedure' || + '%testtag%'|| + '%%' + ); + + end; + + procedure suite_tag_annotation is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(3, 'tag','suitetag', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%some_packagetestsuitesome_package' || + '%suitetag%'|| + '%%' + ); + + end; + + procedure test_tags_annotation is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), + ut3.ut_annotation(9, 'tag','testtag,testtag2,testtag3', 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%test_procedureSome testsome_package.test_procedure' || + '%testtag,testtag2,testtag3%'|| + '%%' + ); + + end; + + procedure suite_tags_annotation is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(3, 'tag','suitetag,suitetag1,suitetag2', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%some_packagetestsuitesome_package' || + '%suitetag,suitetag1,suitetag2%'|| + '%%' + ); + + end; + + procedure test_2line_tags_annotation is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), + ut3.ut_annotation(9, 'tag','testtag', 'test_procedure'), + ut3.ut_annotation(10, 'tag','testtag2', 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%test_procedureSome testsome_package.test_procedure' || + '%testtag,testtag2%'|| + '%%' + ); + + end; + + procedure suite_2line_tags_annotation is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(3, 'tag','suitetag', null), + ut3.ut_annotation(4, 'tag','suitetag1', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%some_packagetestsuitesome_package' || + '%suitetag,suitetag1%'|| + '%%' + ); + + end; + + procedure test_empty_tag is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), + ut3.ut_annotation(9, 'tag',null, 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%%"--%tag" annotation requires a tag value populated. Annotation ignored.%%'|| + '%%' + ); + + end; + + procedure suite_empty_tag is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(3, 'tag',null, null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%"--%tag" annotation requires a tag value populated. Annotation ignored, line 3%'|| + '%%' + ); + + end; + + procedure test_duplicate_tag is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), + ut3.ut_annotation(9, 'tag','testtag,testtag1,testtag', 'test_procedure'), + ut3.ut_annotation(10, 'tag',' testtag,testtag1,testtag2', 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%test_procedureSome testsome_package.test_procedure' || + '%testtag,testtag1,testtag2%'|| + '%%' + ); + + end; + + procedure suite_duplicate_tag is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(3, 'tag','suitetag,suitetag1,suitetag', null), + ut3.ut_annotation(4, 'tag',' suitetag1,suitetag2', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%some_packagetestsuitesome_package' || + '%suitetag,suitetag1,suitetag2%'|| + '%%' + ); + + end; + + procedure test_empty_tag_between is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), + ut3.ut_annotation(9, 'tag','testtag,, ,testtag1', 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%test_procedureSome testsome_package.test_procedure' || + '%testtag,testtag1%'|| + '%%' + ); + + end; + + procedure suite_empty_tag_between is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(3, 'tag','suitetag,, ,suitetag1', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%some_packagetestsuitesome_package' || + '%suitetag,suitetag1%'|| + '%%' + ); + + end; + + procedure test_special_char_tag is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), + ut3.ut_annotation(9, 'tag','#?$%^&*!|\/@][', 'test_procedure') + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%test_procedureSome testsome_package.test_procedure' || + '%#?$%^&*!|\/@][%'|| + '%%' + ); + + end; + + procedure suite_special_char_tag is + l_actual clob; + l_annotations ut3.ut_annotations; + begin + --Arrange + l_annotations := ut3.ut_annotations( + ut3.ut_annotation(2, 'suite','testsuite', null), + ut3.ut_annotation(3, 'tag','#?$%^&*!|\/@][', null) + ); + --Act + l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); + --Assert + ut.expect(l_actual).to_be_like( + '%' || + '%some_packagetestsuitesome_package' || + '%#?$%^&*!|\/@][%'|| + '%%' + ); + + end; + end test_suite_builder; / diff --git a/test/ut3_tester/core/test_suite_builder.pks b/test/ut3_tester/core/test_suite_builder.pks index 5715cfd85..721db153f 100644 --- a/test/ut3_tester/core/test_suite_builder.pks +++ b/test/ut3_tester/core/test_suite_builder.pks @@ -172,5 +172,52 @@ create or replace package test_suite_builder is --%endcontext + --%context(tags_annotation) + --%displayname(--%tag_annotation) + + --%test(Build suite test with tag) + procedure test_tag_annotation; + + --%test(Build suite with tag) + procedure suite_tag_annotation; + + --%test(Build suite test with three tags) + procedure test_tags_annotation; + + --%test(Build suite with three tags) + procedure suite_tags_annotation; + + --%test(Build suite test with two line tag annotation) + procedure test_2line_tags_annotation; + + --%test(Build suite with two line tag annotation) + procedure suite_2line_tags_annotation; + + --%test(Build suite test with empty line tag annotation) + procedure test_empty_tag; + + --%test(Build suite with empty line tag annotation) + procedure suite_empty_tag; + + --%test(Build suite test with duplicate tag annotation) + procedure test_duplicate_tag; + + --%test(Build suite with duplicate tag annotation) + procedure suite_duplicate_tag; + + --%test(Build suite test with empty between tag annotation) + procedure test_empty_tag_between; + + --%test(Build suite with empty between tag annotation) + procedure suite_empty_tag_between; + + --%test(Build suite test with special char tag annotation) + procedure test_special_char_tag; + + --%test(Build suite with special char tag annotation) + procedure suite_special_char_tag; + + --%endcontext + end test_suite_builder; / From 3a8ba8f4fae4df30b2c97166675460bc2aa07335 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sun, 21 Apr 2019 07:47:27 +0100 Subject: [PATCH 088/181] Change annotation to --%tags --- source/core/ut_suite_builder.pkb | 2 +- test/ut3_tester/core/test_suite_builder.pkb | 36 ++++++++++----------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index ccb91c203..ab4920e9c 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -23,7 +23,7 @@ create or replace package body ut_suite_builder is gc_suite constant t_annotation_name := 'suite'; gc_suitepath constant t_annotation_name := 'suitepath'; - gc_tag constant t_annotation_name := 'tag'; + gc_tag constant t_annotation_name := 'tags'; gc_test constant t_annotation_name := ut_utils.gc_test_execute; gc_disabled constant t_annotation_name := 'disabled'; gc_displayname constant t_annotation_name := 'displayname'; diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index 6d9289d3c..8f8308f4f 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -1129,7 +1129,7 @@ create or replace package body test_suite_builder is l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), - ut3.ut_annotation(9, 'tag','testtag', 'test_procedure') + ut3.ut_annotation(9, 'tags','testtag', 'test_procedure') ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1150,7 +1150,7 @@ create or replace package body test_suite_builder is --Arrange l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), - ut3.ut_annotation(3, 'tag','suitetag', null) + ut3.ut_annotation(3, 'tags','suitetag', null) ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1172,7 +1172,7 @@ create or replace package body test_suite_builder is l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), - ut3.ut_annotation(9, 'tag','testtag,testtag2,testtag3', 'test_procedure') + ut3.ut_annotation(9, 'tags','testtag,testtag2,testtag3', 'test_procedure') ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1193,7 +1193,7 @@ create or replace package body test_suite_builder is --Arrange l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), - ut3.ut_annotation(3, 'tag','suitetag,suitetag1,suitetag2', null) + ut3.ut_annotation(3, 'tags','suitetag,suitetag1,suitetag2', null) ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1215,8 +1215,8 @@ create or replace package body test_suite_builder is l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), - ut3.ut_annotation(9, 'tag','testtag', 'test_procedure'), - ut3.ut_annotation(10, 'tag','testtag2', 'test_procedure') + ut3.ut_annotation(9, 'tags','testtag', 'test_procedure'), + ut3.ut_annotation(10, 'tags','testtag2', 'test_procedure') ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1237,8 +1237,8 @@ create or replace package body test_suite_builder is --Arrange l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), - ut3.ut_annotation(3, 'tag','suitetag', null), - ut3.ut_annotation(4, 'tag','suitetag1', null) + ut3.ut_annotation(3, 'tags','suitetag', null), + ut3.ut_annotation(4, 'tags','suitetag1', null) ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1259,7 +1259,7 @@ create or replace package body test_suite_builder is l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), - ut3.ut_annotation(9, 'tag',null, 'test_procedure') + ut3.ut_annotation(9, 'tags',null, 'test_procedure') ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1278,7 +1278,7 @@ create or replace package body test_suite_builder is --Arrange l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), - ut3.ut_annotation(3, 'tag',null, null) + ut3.ut_annotation(3, 'tags',null, null) ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1298,8 +1298,8 @@ create or replace package body test_suite_builder is l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), - ut3.ut_annotation(9, 'tag','testtag,testtag1,testtag', 'test_procedure'), - ut3.ut_annotation(10, 'tag',' testtag,testtag1,testtag2', 'test_procedure') + ut3.ut_annotation(9, 'tags','testtag,testtag1,testtag', 'test_procedure'), + ut3.ut_annotation(10, 'tags',' testtag,testtag1,testtag2', 'test_procedure') ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1320,8 +1320,8 @@ create or replace package body test_suite_builder is --Arrange l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), - ut3.ut_annotation(3, 'tag','suitetag,suitetag1,suitetag', null), - ut3.ut_annotation(4, 'tag',' suitetag1,suitetag2', null) + ut3.ut_annotation(3, 'tags','suitetag,suitetag1,suitetag', null), + ut3.ut_annotation(4, 'tags',' suitetag1,suitetag2', null) ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1343,7 +1343,7 @@ create or replace package body test_suite_builder is l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), - ut3.ut_annotation(9, 'tag','testtag,, ,testtag1', 'test_procedure') + ut3.ut_annotation(9, 'tags','testtag,, ,testtag1', 'test_procedure') ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1364,7 +1364,7 @@ create or replace package body test_suite_builder is --Arrange l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), - ut3.ut_annotation(3, 'tag','suitetag,, ,suitetag1', null) + ut3.ut_annotation(3, 'tags','suitetag,, ,suitetag1', null) ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1386,7 +1386,7 @@ create or replace package body test_suite_builder is l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), ut3.ut_annotation(8, 'test','Some test', 'test_procedure'), - ut3.ut_annotation(9, 'tag','#?$%^&*!|\/@][', 'test_procedure') + ut3.ut_annotation(9, 'tags','#?$%^&*!|\/@][', 'test_procedure') ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); @@ -1407,7 +1407,7 @@ create or replace package body test_suite_builder is --Arrange l_annotations := ut3.ut_annotations( ut3.ut_annotation(2, 'suite','testsuite', null), - ut3.ut_annotation(3, 'tag','#?$%^&*!|\/@][', null) + ut3.ut_annotation(3, 'tags','#?$%^&*!|\/@][', null) ); --Act l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); From 8ebb8b859bbce58eead838e3a6a501bbda2bb996 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sun, 21 Apr 2019 12:34:42 +0100 Subject: [PATCH 089/181] Fixing empty tags to use xmlgen --- test/ut3_tester/core/test_suite_builder.pkb | 37 ++++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index 8f8308f4f..d6f1a8b66 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -7,6 +7,8 @@ create or replace package body test_suite_builder is l_suites ut3.ut_suite_items; l_suite ut3.ut_logical_suite; l_cursor sys_refcursor; + l_type_cursor sys_refcursor; + l_ctx dbms_xmlgen.ctxhandle; l_xml xmltype; begin open l_cursor for select value(x) from table( @@ -22,9 +24,14 @@ create or replace package body test_suite_builder is a_skip_all_objects => true ); l_suite := treat( l_suites(l_suites.first) as ut3.ut_logical_suite); - + + open l_type_cursor for select l_suite as "UT_LOGICAL_SUITE" from dual; + l_ctx := dbms_xmlgen.newcontext(l_type_cursor); + dbms_xmlgen.setNullHandling(l_ctx, dbms_xmlgen.empty_tag); + l_xml := dbms_xmlgen.getxmltype(l_ctx); + select deletexml( - xmltype(l_suite), + l_xml, '//RESULTS_COUNT|//START_TIME|//END_TIME|//RESULT|//ASSOCIATED_EVENT_NAME' || '|//TRANSACTION_INVALIDATORS|//ERROR_BACKTRACE|//ERROR_STACK|//SERVEROUTPUT' ) @@ -638,7 +645,8 @@ create or replace package body test_suite_builder is l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); --Assert ut.expect(l_actual).to_be_like( - '%' || + ''|| + '' || '%' || '%' || '' || @@ -663,7 +671,8 @@ create or replace package body test_suite_builder is '%' || '' || '' || - '' + ''|| + '' ); end; @@ -687,6 +696,7 @@ create or replace package body test_suite_builder is l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); --Assert ut.expect(l_actual).to_be_like( + ''|| '' || '%' || '%' || @@ -707,7 +717,8 @@ create or replace package body test_suite_builder is '%%suite_level_test%' || '%' || '%' || - '%' + '%'|| + '' ); ut.expect(l_actual).not_to_be_like('%%%%%%'); ut.expect(l_actual).not_to_be_like('%%%%%%'); @@ -735,6 +746,7 @@ create or replace package body test_suite_builder is l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); --Assert ut.expect(l_actual).to_be_like( + ''|| '' || '%' || '%' || @@ -757,7 +769,8 @@ create or replace package body test_suite_builder is '%' || '%%suite_level_beforeall%' || '%%suite_level_afterall%' || - '%' + '%'|| + '' ); ut.expect(l_actual).not_to_be_like('%%%%%%'); ut.expect(l_actual).not_to_be_like('%%%%%%'); @@ -784,6 +797,7 @@ create or replace package body test_suite_builder is ,'\' ); ut.expect(l_actual).to_be_like( + ''|| '' || '%' || '' || @@ -799,7 +813,8 @@ create or replace package body test_suite_builder is '%' || '' || ''|| - '' + ''|| + '' ); end; @@ -827,6 +842,7 @@ create or replace package body test_suite_builder is ,'\' ); ut.expect(l_actual).to_be_like( + ''|| '' || '%' || '' || @@ -851,7 +867,8 @@ create or replace package body test_suite_builder is '%' || '' || '' || - '' + ''|| + '' ); end; @@ -884,6 +901,7 @@ create or replace package body test_suite_builder is ,'\' ); ut.expect(l_actual).to_be_like( + ''|| '' || '%' || '' || @@ -908,7 +926,8 @@ create or replace package body test_suite_builder is '%' || '' || '' || - '' + ''|| + '' ); end; From a42e2440c303792e8619e89e1320228d8efa2a60 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Tue, 23 Apr 2019 19:27:16 +0100 Subject: [PATCH 090/181] Adding tests for ut.run Change query to use regexp as instr was giving false positives. --- source/core/ut_suite_manager.pkb | 6 +- test/ut3_tester_helper/run_helper.pkb | 47 +++++++++++ test/ut3_tester_helper/run_helper.pks | 9 +++ test/ut3_user/api/test_ut_run.pkb | 109 ++++++++++++++++++++++++++ test/ut3_user/api/test_ut_run.pks | 34 ++++++++ 5 files changed, 203 insertions(+), 2 deletions(-) diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 54bf8fa04..f85128434 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -370,7 +370,7 @@ create or replace package body ut_suite_manager is l_ut_owner varchar2(250) := ut_utils.ut_owner; l_sql varchar2(32767); l_suite_item_name varchar2(20); - l_tag_list varchar2(4000) :=a_tags; + l_tag_list varchar2(4000) := a_tags; begin if a_path is null and a_object_name is not null then execute immediate 'select min(path) @@ -384,6 +384,8 @@ create or replace package body ut_suite_manager is end if; l_suite_item_name := case when l_tag_list is not null then 'suite_items_tags' else 'suite_items' end; + + /* Rewrite that as tags should be put on whats left not on full suite item cache */ l_sql := q'[with @@ -420,7 +422,7 @@ create or replace package body ut_suite_manager is where exists ( select 1 from ]'||l_ut_owner||q'[.ut_suite_cache_tag ct - where ct.suiteid = s.id and instr(:a_tag_list,ct.tagname) > 0 ) + where ct.suiteid = s.id and regexp_like(:a_tag_list,'(^|,){1}'||ct.tagname||'(,|$){1}') ) ), suite_items_tags as ( select c.* from suite_items c diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index 0fad905fd..38252f069 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -197,13 +197,16 @@ create or replace package body run_helper is begin execute immediate q'[create or replace package test_package_1 is --%suite + --%tags(suite1,helper) --%suitepath(tests) --%rollback(manual) --%test(Test1 from test package 1) + --%tags(test1,suite1test1,subtest1) procedure test1; --%test(Test2 from test package 1) + --%tags(test1,suite1test1) procedure test2; end test_package_1; @@ -223,12 +226,15 @@ create or replace package body run_helper is execute immediate q'[create or replace package test_package_2 is --%suite + --%tags(suite2,helper) --%suitepath(tests.test_package_1) --%test + --%tags(test2,test1suite2,subtest2) procedure test1; --%test + --%tags(test2suite1) procedure test2; end test_package_2; @@ -247,12 +253,15 @@ create or replace package body run_helper is execute immediate q'[create or replace package test_package_3 is --%suite + --%tags(suite3,helper) --%suitepath(tests2) --%test + --%tags(test1suite3) procedure test1; --%test + --%tags(test2suite3) procedure test2; end test_package_3; @@ -431,6 +440,44 @@ create or replace package body run_helper is )); return l_results; end; + + procedure run(a_reporter ut3.ut_reporter_base := null,a_tags varchar2) is + begin + ut3.ut.run(a_reporter,a_tags => a_tags); + end; + + procedure run(a_path varchar2, a_reporter ut3.ut_reporter_base := null,a_tags varchar2) is + begin + ut3.ut.run(a_path, a_reporter,a_tags => a_tags); + end; + + procedure run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null, a_tags varchar2) is + begin + ut3.ut.run(a_paths, a_reporter,a_tags => a_tags); + end; + + function run(a_reporter ut3.ut_reporter_base := null,a_tags varchar2) return ut3.ut_varchar2_list is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table (ut3.ut.run(a_reporter, a_tags => a_tags)); + return l_results; + end; + + function run(a_path varchar2, a_reporter ut3.ut_reporter_base := null, a_tags varchar2) + return ut3.ut_varchar2_list is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table (ut3.ut.run(a_path, a_reporter,a_tags => a_tags)); + return l_results; + end; + + function run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null, a_tags varchar2) + return ut3.ut_varchar2_list is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table (ut3.ut.run(a_paths, a_reporter, a_tags => a_tags)); + return l_results; + end; procedure test_rollback_type(a_procedure_name varchar2, a_rollback_type integer, a_expectation ut3_latest_release.ut_matcher) is l_suite ut3.ut_suite; diff --git a/test/ut3_tester_helper/run_helper.pks b/test/ut3_tester_helper/run_helper.pks index 7d285d7af..45c64741c 100644 --- a/test/ut3_tester_helper/run_helper.pks +++ b/test/ut3_tester_helper/run_helper.pks @@ -41,6 +41,15 @@ create or replace package run_helper is return ut3.ut_varchar2_list; function run(a_test_files ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base) return ut3.ut_varchar2_list; + + procedure run(a_reporter ut3.ut_reporter_base := null,a_tags varchar2); + procedure run(a_path varchar2, a_reporter ut3.ut_reporter_base := null,a_tags varchar2); + procedure run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null, a_tags varchar2); + function run(a_reporter ut3.ut_reporter_base := null,a_tags varchar2) return ut3.ut_varchar2_list; + function run(a_path varchar2, a_reporter ut3.ut_reporter_base := null, a_tags varchar2) + return ut3.ut_varchar2_list; + function run(a_paths ut3.ut_varchar2_list, a_reporter ut3.ut_reporter_base := null, a_tags varchar2) + return ut3.ut_varchar2_list; procedure test_rollback_type(a_procedure_name varchar2, a_rollback_type integer, a_expectation ut3_latest_release.ut_matcher); diff --git a/test/ut3_user/api/test_ut_run.pkb b/test/ut3_user/api/test_ut_run.pkb index 43a2238ae..0844b819d 100644 --- a/test/ut3_user/api/test_ut_run.pkb +++ b/test/ut3_user/api/test_ut_run.pkb @@ -787,5 +787,114 @@ Failures:% ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)); end; + procedure test_run_by_one_tag is + l_results clob; + begin + ut3_tester_helper.run_helper.run(a_tags => 'suite1test1'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); + end; + + procedure suite_run_by_one_tag is + l_results clob; + begin + ut3_tester_helper.run_helper.run(a_tags => 'suite2'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).not_to_be_like( '%test_package_1.%executed%' ); + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).to_be_like( '%test_package_2%' ); + ut.expect( l_results ).to_be_like( '%test_package_2.%executed%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3.%executed%' ); + end; + + procedure two_test_run_by_one_tag is + l_results clob; + begin + ut3_tester_helper.run_helper.run(a_tags => 'test2'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).not_to_be_like( '%test_package_1.%executed%' ); + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).to_be_like( '%test_package_2%' ); + ut.expect( l_results ).to_be_like( '%test_package_2.%executed%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3.%executed%' ); + end; + + procedure all_suites_run_by_one_tag is + l_results clob; + begin + ut3_tester_helper.run_helper.run(a_tags => 'helper'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).to_be_like( '%test_package_2%' ); + ut.expect( l_results ).to_be_like( '%test_package_3%' ); + end; + + procedure two_test_run_by_two_tags is + l_results clob; + begin + ut3_tester_helper.run_helper.run(a_tags => 'subtest1,subtest2'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).to_be_like( '%test_package_2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_1.test2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_2.test2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); + end; + + procedure suite_with_children_tag is + l_results clob; + begin + ut3_tester_helper.run_helper.run(a_tags => 'suite1'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).to_be_like( '%test_package_2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); + end; + + procedure test_nonexists_tag is + l_results clob; + l_exp_message varchar2(4000); + begin + l_exp_message :=q'[ORA-20204: No suite packages found for tags: 'nonexisting']'; + ut3_tester_helper.run_helper.run(a_tags => 'nonexisting'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + ut.fail('Expecte test to fail'); + --Assert + exception + when others then + ut.expect( sqlerrm ).to_be_like( l_exp_message ); + end; + + procedure test_duplicate_tag is + l_results clob; + begin + ut3_tester_helper.run_helper.run(a_tags => 'suite1test1,suite1test1'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); + end; + + procedure suite_duplicate_tag is + l_results clob; + begin + ut3_tester_helper.run_helper.run(a_tags => 'suite1,suite1'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).to_be_like( '%test_package_2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); + end; + end; / diff --git a/test/ut3_user/api/test_ut_run.pks b/test/ut3_user/api/test_ut_run.pks index 82b7eee95..c79686dc6 100644 --- a/test/ut3_user/api/test_ut_run.pks +++ b/test/ut3_user/api/test_ut_run.pks @@ -163,6 +163,40 @@ create or replace package test_ut_run is --%endcontext + --%context(run with tags) + --%displayname(Call ut.run with #tags) + --%beforeall(create_ut3$user#_tests) + --%afterall(drop_ut3$user#_tests) + + --%test(Execute test by tag) + procedure test_run_by_one_tag; + + --%test( Execute suite by one tag) + procedure suite_run_by_one_tag; + + --%test(Execute two tests by one tag) + procedure two_test_run_by_one_tag; + + --%test(Execute all suites tests with tag) + procedure all_suites_run_by_one_tag; + + --%test(Execute tests by passing two tags) + procedure two_test_run_by_two_tags; + + --%test(Execute suite and all of its children) + procedure suite_with_children_tag; + + --%test(Execute test for non existing tag) + procedure test_nonexists_tag; + + --%test(Execute test for duplicate list tags) + procedure test_duplicate_tag; + + --%test(Execute suite test for duplicate list tags) + procedure suite_duplicate_tag; + + --%endcontext + end; / From 5ee864177ae7784860aa4b51e69dc74000ad5b3a Mon Sep 17 00:00:00 2001 From: lwasylow Date: Wed, 24 Apr 2019 19:40:00 +0100 Subject: [PATCH 091/181] Added tests for ut.run procedure --- source/core/ut_suite_manager.pkb | 41 +++++++++++++++----- test/ut3_tester_helper/run_helper.pkb | 2 +- test/ut3_user/api/test_ut_run.pkb | 56 +++++++++++++++++++++++++++ test/ut3_user/api/test_ut_run.pks | 14 ++++++- 4 files changed, 102 insertions(+), 11 deletions(-) diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index f85128434..a770d3d6d 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -17,6 +17,7 @@ create or replace package body ut_suite_manager is */ gc_suitpath_error_message constant varchar2(100) := 'Suitepath exceeds 1000 CHAR on: '; + gc_tag_errmsg constant number := 450; type t_path_item is record ( object_name varchar2(250), @@ -691,6 +692,34 @@ create or replace package body ut_suite_manager is return l_suites; end; + function build_no_test_error_msg( + a_schema_name in varchar2, + a_suite_path in varchar2, + a_procedure_name in varchar2, + a_object_name in varchar2, + a_tags in varchar2 + ) return varchar2 is + l_error_msg varchar2(500); + begin + if a_suite_path is not null then + l_error_msg := 'No suite packages found for path '||a_schema_name||':'||a_suite_path; + elsif a_procedure_name is not null then + l_error_msg := 'Suite test '||a_schema_name||'.'||a_object_name|| '.'||a_procedure_name||' does not exist'; + elsif a_object_name is not null then + l_error_msg := 'Suite package '||a_schema_name||'.'||a_object_name|| ' does not exist'; + end if; + + if l_error_msg is null and a_tags is not null then + l_error_msg := 'No tests found for tags: '||ut_utils.to_string(a_tags,a_max_output_len => gc_tag_errmsg); + elsif l_error_msg is not null and a_tags is not null then + l_error_msg := l_error_msg||'with tags: '||ut_utils.to_string(a_tags,a_max_output_len => gc_tag_errmsg); + end if; + + l_error_msg := l_error_msg ||'.'; + + return l_error_msg; + end; + procedure configure_execution_by_path( a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, @@ -730,15 +759,9 @@ create or replace package body ut_suite_manager is a_tags ); if a_suites.count = l_suites_count then - 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|| '.'); - 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'); - elsif l_path_item.object_name is not null then - raise_application_error(ut_utils.gc_suite_package_not_found,'Suite package '||l_schema||'.'||l_path_item.object_name|| ' does not exist'); - elsif a_tags is not null then - raise_application_error(ut_utils.gc_suite_package_not_found,'No suite packages found for tags: '||ut_utils.to_string(a_tags,a_max_output_len => 450)); - end if; + raise_application_error(ut_utils.gc_suite_package_not_found,build_no_test_error_msg( + l_schema,l_path_item.suite_path,l_path_item.procedure_name, + l_path_item.object_name,a_tags)); end if; l_index := a_suites.first; l_suites_count := a_suites.count; diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index 38252f069..3e31b6ae6 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -206,7 +206,7 @@ create or replace package body run_helper is procedure test1; --%test(Test2 from test package 1) - --%tags(test1,suite1test1) + --%tags(test1,suite1test2) procedure test2; end test_package_1; diff --git a/test/ut3_user/api/test_ut_run.pkb b/test/ut3_user/api/test_ut_run.pkb index 0844b819d..5afc36ad4 100644 --- a/test/ut3_user/api/test_ut_run.pkb +++ b/test/ut3_user/api/test_ut_run.pkb @@ -895,6 +895,62 @@ Failures:% ut.expect( l_results ).to_be_like( '%test_package_2%' ); ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); end; + + procedure run_proc_pkg_name_no_tag is + l_results clob; + l_exp_message varchar2(4000); + begin + l_exp_message :=q'[ORA-20204: Suite package ut3_tester_helper.test_package_1 does not existwith tags: 'nonexists'.]'; + ut3.ut.run('ut3_tester_helper.test_package_1',a_tags => 'nonexists'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + ut.fail('Expecte test to fail'); + exception + when others then + ut.expect( sqlerrm ).to_be_like( l_exp_message ); + end; + + procedure run_proc_pkg_name_tag is + l_results clob; + begin + ut3.ut.run('ut3_tester_helper.test_package_1',a_tags => 'suite1test1'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).to_be_like( '%test_package_1.test1%executed%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_1.test2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); + end; + + procedure run_pkg_name_file_list_tag is + l_results clob; + begin + ut3.ut.run('ut3_tester_helper.test_package_1',a_tags => 'suite1test1'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).to_be_like( '%test_package_1.test1%executed%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_1.test2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); + end; + + procedure run_proc_path_list_tag is + l_results clob; + begin + ut3.ut.run( + 'ut3_tester_helper.test_package_1', + ut3.ut_sonar_test_reporter(), a_source_files => ut3.ut_varchar2_list(),a_tags => 'suite1', + a_test_files => ut3.ut_varchar2_list('tests/ut3_tester_helper.test_package_1.pkb', + 'tests/ut3_tester_helper.test_package_2.pkb', + 'tests/ut3_tester_helper.test_package_3.pkb') + ); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%tests/ut3_tester_helper.test_package_1.pkb%' ); + ut.expect( l_results ).not_to_be_like( '%tests/ut3_tester_helper.test_package_2.pkb%' ); + ut.expect( l_results ).not_to_be_like( '%tests/ut3_tester_helper.test_package_3.pkb%' ); + end; end; / diff --git a/test/ut3_user/api/test_ut_run.pks b/test/ut3_user/api/test_ut_run.pks index c79686dc6..872a2a05b 100644 --- a/test/ut3_user/api/test_ut_run.pks +++ b/test/ut3_user/api/test_ut_run.pks @@ -168,7 +168,7 @@ create or replace package test_ut_run is --%beforeall(create_ut3$user#_tests) --%afterall(drop_ut3$user#_tests) - --%test(Execute test by tag) + --%test(Execute test by tag ut_run) procedure test_run_by_one_tag; --%test( Execute suite by one tag) @@ -194,6 +194,18 @@ create or replace package test_ut_run is --%test(Execute suite test for duplicate list tags) procedure suite_duplicate_tag; + + --%test(Run a package by name with non existing tag) + procedure run_proc_pkg_name_no_tag; + + --%test(Runs given package only with package name given as path and filter by tag) + procedure run_proc_pkg_name_tag; + + --%test(Runs all from given package with package name given as path and coverage file list with tag) + procedure run_pkg_name_file_list_tag; + + --%test(Runs tests from given paths with paths list and tag) + procedure run_proc_path_list_tag; --%endcontext From 176519c69090cadc2721950a95106bc079bd5868 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Wed, 24 Apr 2019 19:51:28 +0100 Subject: [PATCH 092/181] Added extra tests for ut run function --- test/ut3_tester_helper/run_helper.pkb | 4 ++-- test/ut3_user/api/test_ut_run.pkb | 33 +++++++++++++++++++++++++++ test/ut3_user/api/test_ut_run.pks | 9 ++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index 3e31b6ae6..45403ca8a 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -230,11 +230,11 @@ create or replace package body run_helper is --%suitepath(tests.test_package_1) --%test - --%tags(test2,test1suite2,subtest2) + --%tags(test2,suite2test1,subtest2) procedure test1; --%test - --%tags(test2suite1) + --%tags(suite2test2) procedure test2; end test_package_2; diff --git a/test/ut3_user/api/test_ut_run.pkb b/test/ut3_user/api/test_ut_run.pkb index 5afc36ad4..4dc5e41c6 100644 --- a/test/ut3_user/api/test_ut_run.pkb +++ b/test/ut3_user/api/test_ut_run.pkb @@ -951,6 +951,39 @@ Failures:% ut.expect( l_results ).not_to_be_like( '%tests/ut3_tester_helper.test_package_2.pkb%' ); ut.expect( l_results ).not_to_be_like( '%tests/ut3_tester_helper.test_package_3.pkb%' ); end; + + procedure tag_run_func_no_params is + l_results ut3.ut_varchar2_list; + begin + l_results := ut3_tester_helper.run_helper.run(a_tags => 'helper'); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%test_package_2%test_package_3%' ); + end; + + procedure tag_run_func_pkg_name is + l_results ut3.ut_varchar2_list; + begin + select * bulk collect into l_results from table (ut3.ut.run('ut3_tester_helper.test_package_1', a_tags => 'suite1test1')); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1.test1%executed%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%test_package_1.test2%executed%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%test_package_2%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%test_package_3%' ); + end; + + procedure tag_run_func_path_list is + l_results ut3.ut_varchar2_list; + begin + l_results := ut3_tester_helper.run_helper.run(ut3.ut_varchar2_list(':tests.test_package_1',':tests'),a_tags => 'suite1test1,suite2test1'); + --Assert + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_2%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_1.test1%executed%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%test_package_1.test2%executed%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( '%test_package_2.test1%executed%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%test_package_2.test2%executed%' ); + ut.expect( ut3_tester_helper.main_helper.table_to_clob(l_results) ).not_to_be_like( '%test_package_3%' ); + end; end; / diff --git a/test/ut3_user/api/test_ut_run.pks b/test/ut3_user/api/test_ut_run.pks index 872a2a05b..feb825ffa 100644 --- a/test/ut3_user/api/test_ut_run.pks +++ b/test/ut3_user/api/test_ut_run.pks @@ -207,6 +207,15 @@ create or replace package test_ut_run is --%test(Runs tests from given paths with paths list and tag) procedure run_proc_path_list_tag; + --%test(Runs all tests in current schema with default reporter when only tag is given) + procedure tag_run_func_no_params; + + --%test(Runs given package only with package name given as path and filter by tag) + procedure tag_run_func_pkg_name; + + --%test(Runs tests from given paths with paths list and a tag) + procedure tag_run_func_path_list; + --%endcontext end; From b1f4a625eba580952acf746e4794bde8dca38c1f Mon Sep 17 00:00:00 2001 From: lwasylow Date: Wed, 24 Apr 2019 19:57:34 +0100 Subject: [PATCH 093/181] Fixing error message function --- source/core/ut_suite_manager.pkb | 6 +++--- test/ut3_user/api/test_ut_run.pkb | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index a770d3d6d..20c017091 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -704,15 +704,15 @@ create or replace package body ut_suite_manager is if a_suite_path is not null then l_error_msg := 'No suite packages found for path '||a_schema_name||':'||a_suite_path; elsif a_procedure_name is not null then - l_error_msg := 'Suite test '||a_schema_name||'.'||a_object_name|| '.'||a_procedure_name||' does not exist'; + l_error_msg := 'Suite test '||a_schema_name||'.'||a_object_name|| '.'||a_procedure_name||' does not exists'; elsif a_object_name is not null then - l_error_msg := 'Suite package '||a_schema_name||'.'||a_object_name|| ' does not exist'; + l_error_msg := 'Suite package '||a_schema_name||'.'||a_object_name|| ' does not exists'; end if; if l_error_msg is null and a_tags is not null then l_error_msg := 'No tests found for tags: '||ut_utils.to_string(a_tags,a_max_output_len => gc_tag_errmsg); elsif l_error_msg is not null and a_tags is not null then - l_error_msg := l_error_msg||'with tags: '||ut_utils.to_string(a_tags,a_max_output_len => gc_tag_errmsg); + l_error_msg := l_error_msg||' with tags: '||ut_utils.to_string(a_tags,a_max_output_len => gc_tag_errmsg); end if; l_error_msg := l_error_msg ||'.'; diff --git a/test/ut3_user/api/test_ut_run.pkb b/test/ut3_user/api/test_ut_run.pkb index 4dc5e41c6..0b0598ad5 100644 --- a/test/ut3_user/api/test_ut_run.pkb +++ b/test/ut3_user/api/test_ut_run.pkb @@ -864,7 +864,7 @@ Failures:% l_results clob; l_exp_message varchar2(4000); begin - l_exp_message :=q'[ORA-20204: No suite packages found for tags: 'nonexisting']'; + l_exp_message :=q'[ORA-20204: No tests found for tags: 'nonexisting'.]'; ut3_tester_helper.run_helper.run(a_tags => 'nonexisting'); l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); ut.fail('Expecte test to fail'); @@ -900,7 +900,7 @@ Failures:% l_results clob; l_exp_message varchar2(4000); begin - l_exp_message :=q'[ORA-20204: Suite package ut3_tester_helper.test_package_1 does not existwith tags: 'nonexists'.]'; + l_exp_message :=q'[ORA-20204: Suite package ut3_tester_helper.test_package_1 does not exists with tags: 'nonexists'.]'; ut3.ut.run('ut3_tester_helper.test_package_1',a_tags => 'nonexists'); l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); ut.fail('Expecte test to fail'); From dbbf197914e371bacbc812a1837554cf2a01c75a Mon Sep 17 00:00:00 2001 From: lwasylow Date: Wed, 24 Apr 2019 20:32:21 +0100 Subject: [PATCH 094/181] Update docs --- docs/userguide/annotations.md | 77 +++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 4 deletions(-) diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 2ffaf169b..ae99ea363 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -38,6 +38,7 @@ We strongly recommend putting package level annotations at the very top of packa | `--%disabled` | Package/procedure | Used to disable a suite or a test. Disabled suites/tests do not get executed, they are however marked and reported as disabled in a test run. | | `--%context()` | Package | Denotes start of a named context (sub-suite) in a suite package | | `--%endcontext` | Package | Denotes end of a nested context (sub-suite) in a suite package | +| `--%tags` | Package/procedure | Used to label a test or a suite for purpose of identification | ### Suite @@ -823,7 +824,7 @@ See [beforeall](#Beforeall) for more examples. Indicates specific setup procedure(s) to be executed for a test. The procedure(s) can be located either: - within current package (package name is optional) - within another package - + The annotation need to be placed alongside `--%test` annotation. The `--%beforetest` procedures are executed after invoking all `--%beforeeach` for a test. @@ -911,7 +912,7 @@ Finished in .015185 seconds Indicates specific cleanup procedure(s) to be executed for a test. The procedure(s) can be located either: - within current package (package name is optional) - within another package - + The annotation need to be placed alongside `--%test` annotation. If a test is marked as disabled the `--%aftertest` procedures are not invoked for that test. @@ -1221,6 +1222,74 @@ Finished in .035261 seconds ``` + +### Tags + +Tag is a label attached to the test or a suite path. It is used for identification and execution a group of tests / suites that share same tag. + +It allows us to group a tests / suites using a various categorization and place a test / suite in multiple buckets. Same tests can be group with other tests based on the functionality , frequency, type of output etc. + +e.q. + +```sql +--%tags(batch,daily,csv) +``` + +or + +```sql +--%tags(api,online,json) +``` + + + +Tags are defined as a coma separated list. When executing a tests filtering by tag utPLSQL will find all tests associated with a given tag and execute it. It will apply `OR` logic when resolving a tags so any tests / suites that got matching at least one tag will get executed. + +When a suite gets tagged all of its children will automatically inherit a tag and get executed along the parent. + +```sql +create or replace PACKAGE ut_sample_test IS + + --%suite(Sample Test Suite) + --%tag(suite1) + + --%test(Compare Ref Cursors) + --%tag(test1,sample) + PROCEDURE ut_refcursors1; + +END ut_sample_test; +/ + +create or replace PACKAGE BODY ut_sample_test IS + + PROCEDURE ut_refcursors1 IS + v_actual SYS_REFCURSOR; + v_expected SYS_REFCURSOR; + BEGIN + open v_expected for select 1 as test from dual; + open v_actual for select 2 as test from dual; + + ut.expect(v_actual).to_equal(v_expected); + END; + +END ut_sample_test; +/ +``` + +Execution of the test is done by using a new parameter `a_tags` + +```sql +select * from table(ut.run(a_path => 'ut_sample_test',a_tags => 'suite1')); +select * from table(ut.run(a_tags => 'suite1')); + +begin + ut.run(a_path => 'ut_sample_test',a_tags => 'suite1'); +end; +/ +``` + + + ### Suitepath It is very likely that the application for which you are going to introduce tests consists of many different packages, procedures and functions. @@ -1346,9 +1415,9 @@ If `--%throws` annotation is specified with arguments and exception raised is no The framework will raise a warning, when `--%throws` annotation has invalid arguments or when no arguments were provided. Annotation `--%throws(7894562, operaqk, -=1, -20496, pow74d, posdfk3)` will be interpreted as `--%throws(-20496)`. - + Please note that `NO_DATA_FOUND` exception is a special case in Oracle. To capture it use `NO_DATA_FOUND` named exception or `-1403` exception No. - +​ Example: ```sql create or replace package exc_pkg is From f7144991a19057e0924ac86f86c49ff028f42bff Mon Sep 17 00:00:00 2001 From: lwasylow Date: Wed, 24 Apr 2019 20:38:43 +0100 Subject: [PATCH 095/181] Update docs and tests --- docs/userguide/annotations.md | 21 +++++++++++++++++++-- test/ut3_user/api/test_ut_run.pkb | 11 +++++++++++ test/ut3_user/api/test_ut_run.pks | 5 ++++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index ae99ea363..946ad12ea 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1245,7 +1245,9 @@ or Tags are defined as a coma separated list. When executing a tests filtering by tag utPLSQL will find all tests associated with a given tag and execute it. It will apply `OR` logic when resolving a tags so any tests / suites that got matching at least one tag will get executed. -When a suite gets tagged all of its children will automatically inherit a tag and get executed along the parent. +When a suite gets tagged all of its children will automatically inherit a tag and get executed along the parent. Parent suit tests are not executed. but a suitepath hierarchy is kept. + +Sample tag package. ```sql create or replace PACKAGE ut_sample_test IS @@ -1257,6 +1259,10 @@ create or replace PACKAGE ut_sample_test IS --%tag(test1,sample) PROCEDURE ut_refcursors1; + --%test(Compare Ref Cursors #2) + --%tag(test2,sample) + PROCEDURE ut_refcursors2; + END ut_sample_test; / @@ -1271,7 +1277,17 @@ create or replace PACKAGE BODY ut_sample_test IS ut.expect(v_actual).to_equal(v_expected); END; + + PROCEDURE ut_refcursors2 IS + v_actual SYS_REFCURSOR; + v_expected SYS_REFCURSOR; + BEGIN + open v_expected for select 1 as test from dual; + open v_actual for select 2 as test from dual; + ut.expect(v_actual).to_equal(v_expected); + END; + END ut_sample_test; / ``` @@ -1280,7 +1296,8 @@ Execution of the test is done by using a new parameter `a_tags` ```sql select * from table(ut.run(a_path => 'ut_sample_test',a_tags => 'suite1')); -select * from table(ut.run(a_tags => 'suite1')); +select * from table(ut.run(a_tags => 'test1,test2')); +select * from table(ut.run(a_tags => 'sample')); begin ut.run(a_path => 'ut_sample_test',a_tags => 'suite1'); diff --git a/test/ut3_user/api/test_ut_run.pkb b/test/ut3_user/api/test_ut_run.pkb index 0b0598ad5..60c9a7dc8 100644 --- a/test/ut3_user/api/test_ut_run.pkb +++ b/test/ut3_user/api/test_ut_run.pkb @@ -860,6 +860,17 @@ Failures:% ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); end; + procedure suite_with_tag_parent is + l_results clob; + begin + ut3_tester_helper.run_helper.run(a_tags => 'suite2'); + l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); + --Assert + ut.expect( l_results ).to_be_like( '%test_package_1%' ); + ut.expect( l_results ).to_be_like( '%test_package_2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); + end; + procedure test_nonexists_tag is l_results clob; l_exp_message varchar2(4000); diff --git a/test/ut3_user/api/test_ut_run.pks b/test/ut3_user/api/test_ut_run.pks index feb825ffa..fcb62e207 100644 --- a/test/ut3_user/api/test_ut_run.pks +++ b/test/ut3_user/api/test_ut_run.pks @@ -186,6 +186,9 @@ create or replace package test_ut_run is --%test(Execute suite and all of its children) procedure suite_with_children_tag; + --%test(Execute suite and parents) + procedure suite_with_tag_parent; + --%test(Execute test for non existing tag) procedure test_nonexists_tag; @@ -215,7 +218,7 @@ create or replace package test_ut_run is --%test(Runs tests from given paths with paths list and a tag) procedure tag_run_func_path_list; - + --%endcontext end; From e5754040bb47bcc26ba4aa754cfb83994ebfc273 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Thu, 25 Apr 2019 05:43:45 +0100 Subject: [PATCH 096/181] Fixes to PR comments --- source/core/ut_suite_builder.pkb | 7 ++++--- source/core/ut_suite_manager.pkb | 24 ++++++++---------------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index ab4920e9c..dcbfedf27 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -320,7 +320,7 @@ create or replace package body ut_suite_builder is while l_annotation_pos is not null loop if a_tags_ann_text(l_annotation_pos) is null then a_suite.put_warning( - '"--%tag" annotation requires a tag value populated. Annotation ignored.' + '"--%tags" annotation requires a tag value populated. Annotation ignored.' || chr( 10 ) || 'at "' || get_qualified_object_name(a_suite, a_procedure_name) || '", line ' || l_annotation_pos ); else @@ -328,6 +328,7 @@ create or replace package body ut_suite_builder is ut_utils.string_to_table(a_tags_ann_text(l_annotation_pos),',') ); end if; + --remove empty strings from table list e.g. tag1,,tag2 a_list := ut_utils.table_to_clob( ut_utils.filter_list(l_tag_list,'^(\w|\S)+$'), ','); @@ -632,7 +633,7 @@ create or replace package body ut_suite_builder is while l_annotation_pos is not null loop if a_tags_ann_text(l_annotation_pos) is null then a_suite.put_warning( - '"--%tag" annotation requires a tag value populated. Annotation ignored, line ' || l_annotation_pos + '"--%tags" annotation requires a tag value populated. Annotation ignored, line ' || l_annotation_pos ); else l_tag_list := l_tag_list multiset union distinct ut_utils.trim_list_elements( @@ -641,6 +642,7 @@ create or replace package body ut_suite_builder is end if; l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); end loop; + --remove empty strings from table list e.g. tag1,,tag2 a_suite.tags := ut_utils.table_to_clob( ut_utils.filter_list(l_tag_list,'^(\w|\S)+$'), ','); @@ -657,7 +659,6 @@ create or replace package body ut_suite_builder is l_after_all_list tt_executables; l_rollback_type ut_utils.t_rollback_type; l_annotation_text t_annotation_text; - l_suite_tags ut_varchar2_rows; begin if a_annotations.by_name.exists(gc_displayname) then l_annotation_text := trim(a_annotations.by_name(gc_displayname)(a_annotations.by_name(gc_displayname).first)); diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 20c017091..3d34f34e9 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -194,7 +194,7 @@ create or replace package body ut_suite_manager is 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 --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags ) else ut_suite( @@ -207,7 +207,7 @@ create or replace package body ut_suite_manager is 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 --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags ) end; when 'UT_SUITE_CONTEXT' then @@ -223,7 +223,7 @@ create or replace package body ut_suite_manager is 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 --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags ) else ut_suite_context( @@ -236,7 +236,7 @@ create or replace package body ut_suite_manager is 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 --TODO : Should be share or separate + a_rows( a_idx ).after_all_list), tags => a_rows(a_idx).tags ) end; when 'UT_LOGICAL_SUITE' then @@ -371,7 +371,6 @@ create or replace package body ut_suite_manager is l_ut_owner varchar2(250) := ut_utils.ut_owner; l_sql varchar2(32767); l_suite_item_name varchar2(20); - l_tag_list varchar2(4000) := a_tags; begin if a_path is null and a_object_name is not null then execute immediate 'select min(path) @@ -383,11 +382,8 @@ create or replace package body ut_suite_manager is else l_path := lower( a_path ); end if; - l_suite_item_name := case when l_tag_list is not null then 'suite_items_tags' else 'suite_items' end; + l_suite_item_name := case when a_tags is not null then 'suite_items_tags' else 'suite_items' end; - - - /* Rewrite that as tags should be put on whats left not on full suite item cache */ l_sql := q'[with suite_items as ( @@ -417,7 +413,7 @@ create or replace package body ut_suite_manager is ) ) ),]' - ||case when l_tag_list is not null then + ||case when a_tags is not null then q'[ filter_tags as ( select s.* from suite_items s where exists @@ -501,7 +497,7 @@ create or replace package body ut_suite_manager is c.path, :a_random_seed ) desc nulls last' end; - open l_result for l_sql using l_path, l_path, upper(a_object_name), upper(a_procedure_name), l_tag_list, a_random_seed; + open l_result for l_sql using l_path, l_path, upper(a_object_name), upper(a_procedure_name), a_tags, a_random_seed; return l_result; end; @@ -739,11 +735,7 @@ create or replace package body ut_suite_manager is resolve_schema_names(l_paths); l_schema_paths := group_paths_by_schema(l_paths); - - -- TODO : use a_tags to filter out path. Should we do it before ? we dont know suites, if we do it after - -- we running into danger of filtering out to null value and raising wrong message. I reckon we should resolve that - -- before loop and l_th_items is set or after filter it out. - + l_schema := l_schema_paths.first; while l_schema is not null loop l_path_items := l_schema_paths(l_schema); From 632b64dec324faa63b2e260c3973bf6ffda25021 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Thu, 25 Apr 2019 05:57:35 +0100 Subject: [PATCH 097/181] Fixes to PR comments --- test/ut3_tester/core/test_suite_builder.pkb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index d6f1a8b66..49b54fa61 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -1284,7 +1284,7 @@ create or replace package body test_suite_builder is l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); --Assert ut.expect(l_actual).to_be_like( - '%%"--%tag" annotation requires a tag value populated. Annotation ignored.%%'|| + '%%"--%tags" annotation requires a tag value populated. Annotation ignored.%%'|| '%%' ); @@ -1303,7 +1303,7 @@ create or replace package body test_suite_builder is l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); --Assert ut.expect(l_actual).to_be_like( - '%"--%tag" annotation requires a tag value populated. Annotation ignored, line 3%'|| + '%"--%tags" annotation requires a tag value populated. Annotation ignored, line 3%'|| '%%' ); From 66257d18701461048b8665c08f25e091e0ff2601 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Thu, 25 Apr 2019 06:41:48 +0100 Subject: [PATCH 098/181] Updates to PR --- source/core/types/ut_suite.tps | 4 ---- source/core/types/ut_suite_item.tps | 4 ++++ source/core/types/ut_test.tps | 4 ---- source/core/ut_suite_manager.pkb | 4 ++-- test/ut3_tester/core/test_suite_builder.pkb | 7 ------- 5 files changed, 6 insertions(+), 17 deletions(-) diff --git a/source/core/types/ut_suite.tps b/source/core/types/ut_suite.tps index 0bcddd59b..a9647dcf3 100644 --- a/source/core/types/ut_suite.tps +++ b/source/core/types/ut_suite.tps @@ -26,10 +26,6 @@ create or replace type ut_suite under ut_logical_suite ( * Procedure exists within the package of the suite */ after_all_list ut_executables, - /** - * Hold list of tags assign to suite - */ - tags varchar2(4000), constructor function ut_suite ( self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer, a_tags varchar2 := null diff --git a/source/core/types/ut_suite_item.tps b/source/core/types/ut_suite_item.tps index 6b3b9c686..f0ea25187 100644 --- a/source/core/types/ut_suite_item.tps +++ b/source/core/types/ut_suite_item.tps @@ -60,6 +60,10 @@ create or replace type ut_suite_item force under ut_event_item ( warnings ut_varchar2_rows, results_count ut_results_counter, transaction_invalidators ut_varchar2_list, + /** + * Hold list of tags assign to test + */ + tags varchar2(4000), 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), member function get_disabled_flag return boolean, not instantiable member procedure mark_as_skipped(self in out nocopy ut_suite_item), diff --git a/source/core/types/ut_test.tps b/source/core/types/ut_test.tps index 23116119c..04d8f321d 100644 --- a/source/core/types/ut_test.tps +++ b/source/core/types/ut_test.tps @@ -55,10 +55,6 @@ create or replace type ut_test force under ut_suite_item ( *Holds the expected error codes list when the user use the annotation throws */ expected_error_codes ut_integer_list, - /** - * Hold list of tags assign to test - */ - tags varchar2(4000), 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 varchar2 := null diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 3d34f34e9..454e4c253 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -250,7 +250,7 @@ create or replace package body ut_suite_manager is 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) + items => a_items_at_level(a_prev_level), tags => null ) else ut_logical_suite( @@ -261,7 +261,7 @@ create or replace package body ut_suite_manager is 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() + items => ut_suite_items(), tags => null ) end; when 'UT_TEST' then diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index 49b54fa61..5a9f74992 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -660,7 +660,6 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || - '' || '' || '' || '%suite_level_testIn suitesome_package.suite_level_test' || @@ -670,7 +669,6 @@ create or replace package body test_suite_builder is '%some_packagesuite_level_beforeall' || '%' || '' || - '' || ''|| '' ); @@ -812,7 +810,6 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || - ''|| ''|| '' ); @@ -856,7 +853,6 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || - '' || '' || '' || '%suite_level_testIn suitesome_package.suite_level_test' || @@ -866,7 +862,6 @@ create or replace package body test_suite_builder is '%some_packagesuite_level_beforeall' || '%' || '' || - '' || ''|| '' ); @@ -915,7 +910,6 @@ create or replace package body test_suite_builder is '%some_packagecontext_setup' || '%' || '' || - '' || '' || '' || '%suite_level_testIn suitesome_package.suite_level_test' || @@ -925,7 +919,6 @@ create or replace package body test_suite_builder is '%some_packagesuite_level_beforeall' || '%' || '' || - '' || ''|| '' ); From b1d99f35c79306e294fea98878018d2ad35ba1ba Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Thu, 25 Apr 2019 21:59:06 +0100 Subject: [PATCH 099/181] Separated the install for trigger. --- .travis/install.sh | 10 ++++-- source/install.sql | 2 -- source/install_ddl_trigger.sql | 21 ++++++++++++ source/install_headless_with_trigger.sql | 43 ++++++++++++++++++++++++ source/uninstall_objects.sql | 4 +++ 5 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 source/install_ddl_trigger.sql create mode 100644 source/install_headless_with_trigger.sql diff --git a/.travis/install.sh b/.travis/install.sh index d8c2a87fc..7f7dc2198 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -25,14 +25,18 @@ if [[ "${TRAVIS_JOB_NUMBER}" =~ \.2$ ]]; then set verify off @uninstall_all.sql $UT3_OWNER + whenever sqlerror exit failure rollback declare v_leftover_objects_count integer; begin select sum(cnt) into v_leftover_objects_count - from (select count(1) cnt from dba_objects where owner = '$UT3_OWNER' - union all - select count(1) cnt from dba_synonyms where table_owner = '$UT3_OWNER' + from ( + select count(1) cnt from dba_objects where owner = '$UT3_OWNER' + where object_name not like 'PLSQL_PROFILER%' and object_name not like 'DBMSPCC_%' + union all + select count(1) cnt from dba_synonyms where table_owner = '$UT3_OWNER' + where table_name not like 'PLSQL_PROFILER%' and table_name not like 'DBMSPCC_%' ); if v_leftover_objects_count > 0 then raise_application_error(-20000, 'Not all objects were successfully uninstalled - leftover objects count='||v_leftover_objects_count); diff --git a/source/install.sql b/source/install.sql index a7dd53aaa..3163e1c26 100644 --- a/source/install.sql +++ b/source/install.sql @@ -335,8 +335,6 @@ prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema @@install_component.sql 'api/match.syn' @@install_component.sql 'api/contain.syn' -@@install_component.sql 'core/annotations/ut_trigger_annotation_parsing.trg' - set linesize 200 set define on column text format a100 diff --git a/source/install_ddl_trigger.sql b/source/install_ddl_trigger.sql new file mode 100644 index 000000000..39b975716 --- /dev/null +++ b/source/install_ddl_trigger.sql @@ -0,0 +1,21 @@ +/* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +@@define_ut3_owner_param.sql + +@@install_component.sql 'core/annotations/ut_trigger_annotation_parsing.trg' + diff --git a/source/install_headless_with_trigger.sql b/source/install_headless_with_trigger.sql new file mode 100644 index 000000000..511dd6514 --- /dev/null +++ b/source/install_headless_with_trigger.sql @@ -0,0 +1,43 @@ +/* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +set echo off +set verify off +column 1 new_value 1 noprint +column 2 new_value 2 noprint +column 3 new_value 3 noprint +select null as "1", null as "2" , null as "3" from dual where 1=0; +column sep new_value sep noprint +select '--------------------------------------------------------------' as sep from dual; + +spool params.sql.tmp + +column ut3_owner new_value ut3_owner noprint +column ut3_password new_value ut3_password noprint +column ut3_tablespace new_value ut3_tablespace noprint + +select coalesce('&&1','UT3') ut3_owner, + coalesce('&&2','XNtxj8eEgA6X6b6f') ut3_password, + coalesce('&&3','users') ut3_tablespace from dual; + + +@@create_utplsql_owner.sql &&ut3_owner &&ut3_password &&ut3_tablespace +@@install.sql &&ut3_owner +@@create_synonyms_and_grants_for_public.sql &&ut3_owner + +@@install_ddl_trigger.sql + +exit diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index 45c17fbab..b109efd89 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -68,6 +68,8 @@ drop package ut_suite_manager; drop package ut_suite_builder; +drop package ut_suite_cache_manager; + drop table ut_suite_cache; drop sequence ut_suite_cache_seq; @@ -298,6 +300,8 @@ drop type ut_key_value_pairs force; drop type ut_key_value_pair force; +drop type ut_key_anyvalues force; + drop type ut_object_names force; drop type ut_object_name force; From ddf3a7f608038ef177f76bbf8ee2d4492660e41f Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 26 Apr 2019 06:42:37 +0100 Subject: [PATCH 100/181] Phase 2 : switch to varchar_rows() --- source/api/ut_runner.pkb | 12 +++++-- source/api/ut_suite_item_info.tps | 3 +- source/core/types/ut_run.tpb | 2 +- source/core/types/ut_run.tps | 4 +-- source/core/types/ut_suite.tpb | 4 +-- source/core/types/ut_suite.tps | 2 +- source/core/types/ut_suite_item.tps | 2 +- source/core/types/ut_test.tpb | 4 +-- source/core/types/ut_test.tps | 2 +- source/core/ut_suite_builder.pkb | 12 +++---- source/core/ut_suite_cache.sql | 1 + source/core/ut_suite_cache_manager.pkb | 13 ------- source/core/ut_suite_cache_tag.sql | 7 ---- source/core/ut_suite_manager.pkb | 35 ++++++++++--------- source/core/ut_suite_manager.pks | 2 +- .../create_synonyms_and_grants_for_public.sql | 1 - source/create_user_grants.sql | 1 - source/install.sql | 1 - source/uninstall_objects.sql | 2 -- test/ut3_tester/core/test_suite_builder.pkb | 24 ++++++------- 20 files changed, 57 insertions(+), 77 deletions(-) delete mode 100644 source/core/ut_suite_cache_tag.sql diff --git a/source/api/ut_runner.pkb b/source/api/ut_runner.pkb index 30cdf2691..5a9cc856a 100644 --- a/source/api/ut_runner.pkb +++ b/source/api/ut_runner.pkb @@ -99,6 +99,7 @@ create or replace package body ut_runner is l_include_object_names ut_object_names; l_paths ut_varchar2_list := ut_varchar2_list(); l_random_test_order_seed positive; + l_tags ut_varchar2_rows := ut_varchar2_rows(); begin ut_event_manager.initialize(); if a_reporters is not empty then @@ -139,7 +140,12 @@ create or replace package body ut_runner is 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; - + + if a_tags is not null then + l_tags := l_tags multiset union distinct ut_utils.convert_collection( + ut_utils.filter_list(ut_utils.string_to_table(a_tags,','),'^(\w|\S)+$') + ); + end if; l_exclude_object_names := l_exclude_object_names multiset union all ut_suite_manager.get_schema_ut_packages(l_coverage_schema_names); l_include_object_names := to_ut_object_list(a_include_objects, l_coverage_schema_names); @@ -154,10 +160,10 @@ create or replace package body ut_runner is set(a_test_file_mappings), a_client_character_set, l_random_test_order_seed, - a_tags + l_tags ); - ut_suite_manager.configure_execution_by_path(l_paths, l_run.items, l_random_test_order_seed, a_tags); + ut_suite_manager.configure_execution_by_path(l_paths, l_run.items, l_random_test_order_seed, l_tags); if a_force_manual_rollback then l_run.set_rollback_type( a_rollback_type => ut_utils.gc_rollback_manual, a_force => true ); end if; diff --git a/source/api/ut_suite_item_info.tps b/source/api/ut_suite_item_info.tps index bf6fd6ecf..b0c77acb6 100644 --- a/source/api/ut_suite_item_info.tps +++ b/source/api/ut_suite_item_info.tps @@ -22,6 +22,7 @@ create or replace type ut_suite_item_info as object ( item_type varchar2( 250 ), -- the type of item (UT_SUITE/UT_SUITE_CONTEXT/UT_TEST) item_line_no integer, -- line_number where annotation identifying the item exists path varchar2( 4000 ),-- suitepath of the item - disabled_flag integer -- 0 (zero) if item is not disabled, 1 if item is disabled by --%disabled annotation + disabled_flag integer, -- 0 (zero) if item is not disabled, 1 if item is disabled by --%disabled annotation + tags varchar2(4000) ) / diff --git a/source/core/types/ut_run.tpb b/source/core/types/ut_run.tpb index d26c6fcb4..c8f2778ff 100644 --- a/source/core/types/ut_run.tpb +++ b/source/core/types/ut_run.tpb @@ -27,7 +27,7 @@ create or replace type body ut_run as a_test_file_mappings ut_file_mappings := null, a_client_character_set varchar2 := null, a_random_test_order_seed positive := null, - a_run_tags varchar2 := null + a_run_tags ut_varchar2_rows := null ) return self as result is begin self.run_paths := a_run_paths; diff --git a/source/core/types/ut_run.tps b/source/core/types/ut_run.tps index 7ea5cc605..b5a1d18ac 100644 --- a/source/core/types/ut_run.tps +++ b/source/core/types/ut_run.tps @@ -21,7 +21,7 @@ create or replace type ut_run under ut_suite_item ( project_name varchar2(4000), items ut_suite_items, run_paths ut_varchar2_list, - run_tags varchar2(4000), + run_tags ut_varchar2_rows, coverage_options ut_coverage_options, test_file_mappings ut_file_mappings, client_character_set varchar2(100), @@ -37,7 +37,7 @@ create or replace type ut_run under ut_suite_item ( a_test_file_mappings ut_file_mappings := null, a_client_character_set varchar2 := null, a_random_test_order_seed positive := null, - a_run_tags varchar2 := null + a_run_tags ut_varchar2_rows := null ) return self as result, overriding member procedure mark_as_skipped(self in out nocopy ut_run), overriding member function do_execute(self in out nocopy ut_run) return boolean, diff --git a/source/core/types/ut_suite.tpb b/source/core/types/ut_suite.tpb index bd35d18ca..1211d5d5c 100644 --- a/source/core/types/ut_suite.tpb +++ b/source/core/types/ut_suite.tpb @@ -18,7 +18,7 @@ create or replace type body ut_suite as constructor function ut_suite ( self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer, - a_tags varchar2 := null + a_tags ut_varchar2_rows := null ) return self as result is begin self.self_type := $$plsql_unit; @@ -26,7 +26,7 @@ create or replace type body ut_suite as self.items := ut_suite_items(); before_all_list := ut_executables(); after_all_list := ut_executables(); - self.tags := a_tags; + self.tags := coalesce(a_tags,ut_varchar2_rows()); return; end; diff --git a/source/core/types/ut_suite.tps b/source/core/types/ut_suite.tps index a9647dcf3..dd44a817e 100644 --- a/source/core/types/ut_suite.tps +++ b/source/core/types/ut_suite.tps @@ -28,7 +28,7 @@ create or replace type ut_suite under ut_logical_suite ( after_all_list ut_executables, constructor function ut_suite ( self in out nocopy ut_suite, a_object_owner varchar2, a_object_name varchar2, a_line_no integer, - a_tags varchar2 := null + a_tags ut_varchar2_rows := null ) return self as result, overriding member function do_execute(self in out nocopy ut_suite) return boolean, overriding member function get_error_stack_traces(self ut_suite) return ut_varchar2_list, diff --git a/source/core/types/ut_suite_item.tps b/source/core/types/ut_suite_item.tps index f0ea25187..a5eb10986 100644 --- a/source/core/types/ut_suite_item.tps +++ b/source/core/types/ut_suite_item.tps @@ -63,7 +63,7 @@ create or replace type ut_suite_item force under ut_event_item ( /** * Hold list of tags assign to test */ - tags varchar2(4000), + tags ut_varchar2_rows, 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), member function get_disabled_flag return boolean, not instantiable member procedure mark_as_skipped(self in out nocopy ut_suite_item), diff --git a/source/core/types/ut_test.tpb b/source/core/types/ut_test.tpb index c1d847bf5..b3b41b4c2 100644 --- a/source/core/types/ut_test.tpb +++ b/source/core/types/ut_test.tpb @@ -18,7 +18,7 @@ create or replace type body ut_test as 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 varchar2 := null + a_line_no integer, a_expected_error_codes ut_integer_list := null, a_tags ut_varchar2_rows := null ) return self as result is begin self.self_type := $$plsql_unit; @@ -31,7 +31,7 @@ create or replace type body ut_test as self.all_expectations := ut_expectation_results(); self.failed_expectations := ut_expectation_results(); self.expected_error_codes := a_expected_error_codes; - self.tags := a_tags; + self.tags := coalesce(a_tags,ut_varchar2_rows()); return; end; diff --git a/source/core/types/ut_test.tps b/source/core/types/ut_test.tps index 04d8f321d..ef30ab763 100644 --- a/source/core/types/ut_test.tps +++ b/source/core/types/ut_test.tps @@ -57,7 +57,7 @@ create or replace type ut_test force under ut_suite_item ( expected_error_codes ut_integer_list, 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 varchar2 := null + a_line_no integer, a_expected_error_codes ut_integer_list := null, a_tags ut_varchar2_rows := null ) return self as result, overriding member procedure mark_as_skipped(self in out nocopy ut_test), overriding member function do_execute(self in out nocopy ut_test) return boolean, diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index dcbfedf27..245a49b76 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -309,7 +309,7 @@ create or replace package body ut_suite_builder is procedure add_tags_to_test( a_suite in out nocopy ut_suite, - a_list in out nocopy varchar2, + a_list in out nocopy ut_varchar2_rows, a_procedure_name t_object_name, a_tags_ann_text tt_annotation_texts ) is @@ -328,10 +328,8 @@ create or replace package body ut_suite_builder is ut_utils.string_to_table(a_tags_ann_text(l_annotation_pos),',') ); end if; - --remove empty strings from table list e.g. tag1,,tag2 - a_list := ut_utils.table_to_clob( - ut_utils.filter_list(l_tag_list,'^(\w|\S)+$'), - ','); + --remove empty strings from table list e.g. tag1,,tag2 and conver to rows + a_list := ut_utils.convert_collection( ut_utils.filter_list(l_tag_list,'^(\w|\S)+$') ); l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); end loop; @@ -643,9 +641,7 @@ create or replace package body ut_suite_builder is l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); end loop; --remove empty strings from table list e.g. tag1,,tag2 - a_suite.tags := ut_utils.table_to_clob( - ut_utils.filter_list(l_tag_list,'^(\w|\S)+$'), - ','); + a_suite.tags := ut_utils.convert_collection(ut_utils.filter_list(l_tag_list,'^(\w|\S)+$')); end; procedure add_suite_tests( diff --git a/source/core/ut_suite_cache.sql b/source/core/ut_suite_cache.sql index 3a38ceeb7..8687858a3 100644 --- a/source/core/ut_suite_cache.sql +++ b/source/core/ut_suite_cache.sql @@ -47,6 +47,7 @@ create table ut_suite_cache ( nested table before_test_list store as ut_suite_cache_before_test nested table after_test_list store as ut_suite_cache_after_test nested table expected_error_codes store as ut_suite_cache_throws + nested table tags store as ut_suite_cache_tags return as locator as select cast(null as number(22)) id, diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index 526a03338..b805919fc 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -134,19 +134,6 @@ create or replace package body ut_suite_cache_manager is s.t.item as item from tests s; - --TODO : Optimize to use only inserted - merge into ut_suite_cache_tag tgt - using ( select /*+cardinality (tt 100) */ t.id,tt.column_value tag - from ut_suite_cache t, - table(ut_utils.convert_collection((ut_utils.string_to_table(t.tags,',')))) tt - where tt.column_value is not null ) src - on ( tgt.suiteid = src.id and tgt.tagname = src.tag) - when not matched then - insert - (suiteid, tagname ) - values - (src.id, src.tag); - end if; end if; commit; diff --git a/source/core/ut_suite_cache_tag.sql b/source/core/ut_suite_cache_tag.sql deleted file mode 100644 index 17d287dd8..000000000 --- a/source/core/ut_suite_cache_tag.sql +++ /dev/null @@ -1,7 +0,0 @@ -create table ut_suite_cache_tag ( - suiteid number(22) not null, - tagname varchar2(100) not null, - constraint ut_suite_to_tag_pk primary key (suiteid,tagname), - constraint ut_suite_id_fk foreign key ( suiteid ) references ut_suite_cache(id) on delete cascade -) -organization index; \ No newline at end of file diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 454e4c253..768c0af6f 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -299,7 +299,6 @@ create or replace package body ut_suite_manager is begin loop fetch a_suite_data_cursor bulk collect into l_rows limit c_bulk_limit; - l_idx := l_rows.first; while l_idx is not null loop l_level := length(l_rows(l_idx).path) - length( replace(l_rows(l_idx).path, '.') ) + 1; @@ -364,13 +363,14 @@ create or replace package body ut_suite_manager is a_procedure_name varchar2 := null, a_skip_all_objects boolean := false, a_random_seed positive, - a_tags varchar2 := null + a_tags ut_varchar2_rows := null ) return t_cached_suites_cursor is l_path varchar2( 4000 ); l_result sys_refcursor; l_ut_owner varchar2(250) := ut_utils.ut_owner; l_sql varchar2(32767); l_suite_item_name varchar2(20); + l_tags ut_varchar2_rows := coalesce(a_tags,ut_varchar2_rows()); begin if a_path is null and a_object_name is not null then execute immediate 'select min(path) @@ -382,7 +382,7 @@ create or replace package body ut_suite_manager is else l_path := lower( a_path ); end if; - l_suite_item_name := case when a_tags is not null then 'suite_items_tags' else 'suite_items' end; + l_suite_item_name := case when l_tags.count > 0 then 'suite_items_tags' else 'suite_items' end; l_sql := q'[with @@ -413,14 +413,13 @@ create or replace package body ut_suite_manager is ) ) ),]' - ||case when a_tags is not null then - q'[ filter_tags as ( - select s.* from suite_items s - where exists - ( select 1 - from ]'||l_ut_owner||q'[.ut_suite_cache_tag ct - where ct.suiteid = s.id and regexp_like(:a_tag_list,'(^|,){1}'||ct.tagname||'(,|$){1}') ) - ), + ||case when l_tags.count > 0 then + q'[ + filter_tags as ( + select c.* + from suite_items c + where c.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 @@ -497,7 +496,7 @@ create or replace package body ut_suite_manager is c.path, :a_random_seed ) desc nulls last' end; - open l_result for l_sql using l_path, l_path, upper(a_object_name), upper(a_procedure_name), a_tags, a_random_seed; + open l_result for l_sql using l_path, l_path, upper(a_object_name), upper(a_procedure_name), l_tags, a_random_seed; return l_result; end; @@ -585,7 +584,7 @@ create or replace package body ut_suite_manager is a_procedure_name varchar2 := null, a_suites in out nocopy ut_suite_items, a_random_seed positive, - a_tags varchar2 := null + a_tags ut_varchar2_rows := null ) is begin refresh_cache(a_owner_name); @@ -693,9 +692,10 @@ create or replace package body ut_suite_manager is a_suite_path in varchar2, a_procedure_name in varchar2, a_object_name in varchar2, - a_tags in varchar2 + a_tags in ut_varchar2_rows ) return varchar2 is l_error_msg varchar2(500); + l_tags clob:= ut_utils.table_to_clob(coalesce(a_tags,ut_varchar2_rows()),','); begin if a_suite_path is not null then l_error_msg := 'No suite packages found for path '||a_schema_name||':'||a_suite_path; @@ -706,9 +706,9 @@ create or replace package body ut_suite_manager is end if; if l_error_msg is null and a_tags is not null then - l_error_msg := 'No tests found for tags: '||ut_utils.to_string(a_tags,a_max_output_len => gc_tag_errmsg); + l_error_msg := 'No tests found for tags: '||ut_utils.to_string(l_tags,a_max_output_len => gc_tag_errmsg); elsif l_error_msg is not null and a_tags is not null then - l_error_msg := l_error_msg||' with tags: '||ut_utils.to_string(a_tags,a_max_output_len => gc_tag_errmsg); + l_error_msg := l_error_msg||' with tags: '||ut_utils.to_string(l_tags,a_max_output_len => gc_tag_errmsg); end if; l_error_msg := l_error_msg ||'.'; @@ -720,7 +720,7 @@ create or replace package body ut_suite_manager is a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, a_random_seed in positive := null, - a_tags varchar2 := null + a_tags ut_varchar2_rows := null ) is l_paths ut_varchar2_list := a_paths; l_path_items t_path_items; @@ -768,6 +768,7 @@ create or replace package body ut_suite_manager is end configure_execution_by_path; + --TODO : add tags function get_suites_info( a_owner_name varchar2, a_package_name varchar2 := null diff --git a/source/core/ut_suite_manager.pks b/source/core/ut_suite_manager.pks index 5b7c705c6..c27de2eb1 100644 --- a/source/core/ut_suite_manager.pks +++ b/source/core/ut_suite_manager.pks @@ -50,7 +50,7 @@ create or replace package ut_suite_manager authid current_user is a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, a_random_seed in positive := null, - a_tags varchar2 := null + a_tags ut_varchar2_rows := null ); /** diff --git a/source/create_synonyms_and_grants_for_public.sql b/source/create_synonyms_and_grants_for_public.sql index 6cc40afdc..609d78ccf 100644 --- a/source/create_synonyms_and_grants_for_public.sql +++ b/source/create_synonyms_and_grants_for_public.sql @@ -93,7 +93,6 @@ grant select on &&ut3_owner..ut_annotation_cache to public; grant execute on &&ut3_owner..ut_executables to public; grant execute on &&ut3_owner..ut_executable_test to public; grant select on &&ut3_owner..ut_suite_cache to public; -grant select on &&ut3_owner..ut_suite_cache_tag to public; grant select on &&ut3_owner..ut_suite_cache_package to public; grant select on &&ut3_owner..ut_suite_cache_schema to public; grant execute on &&ut3_owner..ut_annotation_cache_manager to public; diff --git a/source/create_user_grants.sql b/source/create_user_grants.sql index ace73b951..7aa5deb39 100644 --- a/source/create_user_grants.sql +++ b/source/create_user_grants.sql @@ -114,7 +114,6 @@ grant select on &&ut3_owner..ut_annotation_cache to &ut3_user; grant execute on &&ut3_owner..ut_executables to &ut3_user; grant execute on &&ut3_owner..ut_executable_test to &ut3_user; grant select on &&ut3_owner..ut_suite_cache to &ut3_user; -grant select on &&ut3_owner..ut_suite_cache_tag to &ut3_user; grant select on &&ut3_owner..ut_suite_cache_package to public; grant select on &&ut3_owner..ut_suite_cache_schema to &ut3_user; grant execute on &&ut3_owner..ut_annotation_cache_manager to &ut3_user; diff --git a/source/install.sql b/source/install.sql index 86669c11d..728f4349f 100644 --- a/source/install.sql +++ b/source/install.sql @@ -130,7 +130,6 @@ alter session set current_schema = &&ut3_owner; @@install_component.sql 'core/ut_suite_cache_package.sql' @@install_component.sql 'core/ut_suite_cache_seq.sql' @@install_component.sql 'core/ut_suite_cache.sql' -@@install_component.sql 'core/ut_suite_cache_tag.sql' @@install_component.sql 'core/ut_suite_cache_manager.pks' @@install_component.sql 'core/ut_suite_cache_manager.pkb' @@install_component.sql 'core/ut_suite_builder.pks' diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index e68b50664..e2295f34d 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -63,8 +63,6 @@ drop package ut_suite_manager; drop package ut_suite_builder; -drop table ut_suite_cache_tag; - drop table ut_suite_cache; drop sequence ut_suite_cache_seq; diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index 5a9f74992..3bebb500e 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -1149,7 +1149,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%test_procedureSome testsome_package.test_procedure' || - '%testtag%'|| + '%testtag%'|| '%%' ); @@ -1170,7 +1170,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%some_packagetestsuitesome_package' || - '%suitetag%'|| + '%suitetag%'|| '%%' ); @@ -1192,7 +1192,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%test_procedureSome testsome_package.test_procedure' || - '%testtag,testtag2,testtag3%'|| + '%testtagtesttag2testtag3%'|| '%%' ); @@ -1213,7 +1213,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%some_packagetestsuitesome_package' || - '%suitetag,suitetag1,suitetag2%'|| + '%suitetagsuitetag1suitetag2%'|| '%%' ); @@ -1236,7 +1236,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%test_procedureSome testsome_package.test_procedure' || - '%testtag,testtag2%'|| + '%testtagtesttag2%'|| '%%' ); @@ -1258,7 +1258,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%some_packagetestsuitesome_package' || - '%suitetag,suitetag1%'|| + '%suitetagsuitetag1%'|| '%%' ); @@ -1319,7 +1319,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%test_procedureSome testsome_package.test_procedure' || - '%testtag,testtag1,testtag2%'|| + '%testtagtesttag1testtag2%'|| '%%' ); @@ -1341,7 +1341,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%some_packagetestsuitesome_package' || - '%suitetag,suitetag1,suitetag2%'|| + '%suitetagsuitetag1suitetag2%'|| '%%' ); @@ -1363,7 +1363,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%test_procedureSome testsome_package.test_procedure' || - '%testtag,testtag1%'|| + '%testtagtesttag1%'|| '%%' ); @@ -1384,7 +1384,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%some_packagetestsuitesome_package' || - '%suitetag,suitetag1%'|| + '%suitetagsuitetag1%'|| '%%' ); @@ -1406,7 +1406,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%test_procedureSome testsome_package.test_procedure' || - '%#?$%^&*!|\/@][%'|| + '%#?$%^&*!|\/@][%'|| '%%' ); @@ -1427,7 +1427,7 @@ create or replace package body test_suite_builder is ut.expect(l_actual).to_be_like( '%' || '%some_packagetestsuitesome_package' || - '%#?$%^&*!|\/@][%'|| + '%#?$%^&*!|\/@][%'|| '%%' ); From e64f498fb7ec4b86f706f19729928bda9146e155 Mon Sep 17 00:00:00 2001 From: Lukasz Date: Sat, 27 Apr 2019 21:36:41 +0100 Subject: [PATCH 101/181] Number precision from dbms_sql not correct (#908) * Fixing issue with number from dual and precision being incorrectly read. * Updated tests --- .../data_values/ut_compound_data_helper.pkb | 4 +++ .../data_values/ut_cursor_column.tpb | 11 +++++-- .../data_values/ut_cursor_column.tps | 8 +++-- .../data_values/ut_cursor_details.tpb | 12 ++++++-- .../expectations/test_expectations_cursor.pkb | 29 ++++++++++++++++++- .../expectations/test_expectations_cursor.pks | 3 ++ 6 files changed, 58 insertions(+), 9 deletions(-) diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 6e8453f45..bd259b47d 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -237,6 +237,10 @@ create or replace package body ut_compound_data_helper is l_col_type := a_data_info.column_type; elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('VARCHAR2','CHAR') then l_col_type := 'VARCHAR2('||greatest(a_data_info.column_len,4000)||')'; + 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 + l_col_type := a_data_info.column_type; else l_col_type := a_data_info.column_type ||case when a_data_info.column_len is not null diff --git a/source/expectations/data_values/ut_cursor_column.tpb b/source/expectations/data_values/ut_cursor_column.tpb index 8f26f58aa..3c6931a5d 100644 --- a/source/expectations/data_values/ut_cursor_column.tpb +++ b/source/expectations/data_values/ut_cursor_column.tpb @@ -4,13 +4,16 @@ create or replace type body ut_cursor_column as 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_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 self.parent_name := a_parent_name; --Name of the parent if its nested self.hierarchy_level := a_hierarchy_level; --Hierarchy level self.column_position := a_col_position; --Position of the column in cursor/ type self.column_len := a_col_max_len; --length of column + self.column_precision := a_col_precision; + self.column_scale := a_col_scale; self.column_name := TRIM( BOTH '''' FROM a_col_name); --name of the column self.column_type_name := coalesce(a_col_type_name,a_col_type); --type name e.g. test_dummy_object or varchar2 self.xml_valid_name := ut_utils.get_valid_xml_name(self.column_name); @@ -49,10 +52,12 @@ create or replace type body ut_cursor_column as 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_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 - 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); + 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); return; end; diff --git a/source/expectations/data_values/ut_cursor_column.tps b/source/expectations/data_values/ut_cursor_column.tps index f55973e16..db9cbd3ae 100644 --- a/source/expectations/data_values/ut_cursor_column.tps +++ b/source/expectations/data_values/ut_cursor_column.tps @@ -28,18 +28,22 @@ create or replace type ut_cursor_column force authid current_user as object ( column_type_name varchar2(128), column_schema varchar2(128), column_len integer, + column_precision integer, + column_scale integer, is_sql_diffable number(1, 0), is_collection number(1, 0), 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 in varchar2, a_collection integer,a_access_path in varchar2), + 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), 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_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, constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index c1d229e6a..9f1f08d67 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -39,7 +39,9 @@ create or replace type body ut_cursor_details as 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 + a_access_path, + l_elements_info.precision, + l_elements_info.scale ); if l_element_info.attr_elt_type is not null then desc_compound_data( @@ -63,7 +65,9 @@ create or replace type body ut_cursor_details as 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 + a_access_path, + l_elements_info.precision, + l_elements_info.scale ); if l_element_info.attr_elt_type is not null then desc_compound_data( @@ -114,7 +118,9 @@ create or replace type body ut_cursor_details as 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 + null, + l_columns_desc(pos).col_precision, + l_columns_desc(pos).col_scale ); if l_columns_desc(pos).col_type = dbms_sql.user_defined_type or l_is_collection then diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 959014a45..e1000457d 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2761,6 +2761,33 @@ Check the query and data for errors.'; ut3.ut.expect( l_actual ).to_equal( l_expected ); ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_be_greater_than(0); end; - + + procedure number_from_dual is + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + open l_expected for select + 12345 as n1, + cast(7456123.89 as number(7,-2)) as n2, + cast(7456123.89 as number(9,1)) as n3, + cast(7456123.89 as number(9,2)) as n4, + cast(7456123.89 as number(9)) as n5, + cast(7456123.89 as number(*,1)) as n6, + 7456123.89 as n7 + from dual; + + open l_actual for select + 12345 as n1, + 7456100 as n2, + 7456123.9 as n3, + 7456123.89 as n4, + 7456124 as n5, + 7456123.9 as n6, + 7456123.89 as n7 + from dual; + ut3.ut.expect(l_actual).to_equal(l_expected); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + end; / diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index d511ae7f7..15a0d98ea 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -443,5 +443,8 @@ create or replace package test_expectations_cursor is --%disabled procedure nulltowhitespace; + --%test(Check precision of number from dual #907) + procedure number_from_dual; + end; / From 91112bce1d776111966b963340c439b19a62ba13 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sat, 27 Apr 2019 21:01:19 +0000 Subject: [PATCH 102/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 5f66fa774..491892256 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 5d31926b9..bbd1e1cf3 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 94576cced..d9439e5be 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 6493c0977..c8d388d30 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index af338a8c6..9c915d543 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 5d15c45d0..b55249394 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index c659f7237..f1a58d7af 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index ff6e3e9e1..e3ae65485 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 546c24556..ee78589c8 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index c3e04fd73..c1aca8c6a 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index fa6190a5c..24d617f5d 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 70b19945e..d3bfe9d19 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 327dd5a13..571f14d98 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index df973f5ea..56b4d1001 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index d0c2bbd63..b48a170e4 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 9b765300a..f6ef99991 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index d4c36b78f..5f5339002 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2859--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index da3778eab..392ff96dc 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2859-develop + * secion v3.1.7.2886-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 6ea107499..7738a9196 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2859-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2886-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From e036629bfed253d31b1279b5a2bc907e9e099dbf Mon Sep 17 00:00:00 2001 From: Pazus Date: Sun, 28 Apr 2019 11:31:44 +0300 Subject: [PATCH 103/181] add tests on 19c DB version --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index af8a07cee..7e9d94ccf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -56,6 +56,7 @@ env: - ORACLE_VERSION="${DOCKER_TAG_12C:-12c-r1-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' DOCKER_OPTIONS="-v /dev/pdbs:/opt/oracle/oradata/pdbs" - ORACLE_VERSION="${DOCKER_TAG_12C2:-12c-r2-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' DOCKER_OPTIONS="-v /dev/pdbs:/opt/oracle/oradata/pdbs" - ORACLE_VERSION="${DOCKER_TAG_18:-18c-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' DOCKER_OPTIONS="-v /dev/pdbs:/opt/oracle/oradata/pdbs" + - ORACLE_VERSION="${DOCKER_TAG_19:-19c-se2-small}" CONNECTION_STR='127.0.0.1:1521/ORCLCDB' DOCKER_OPTIONS="-v /dev/pdbs:/opt/oracle/oradata/pdbs" cache: pip: true From 6d8b09901308e74bdbea8d23f85d4a6592cc7792 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 26 Apr 2019 07:15:23 +0100 Subject: [PATCH 104/181] Phase 2 : switch to varchar_rows() --- docs/userguide/annotations.md | 29 +++++---- docs/userguide/querying_suites.md | 9 +-- source/api/ut_suite_item_info.tpb | 38 ++++++++++++ source/api/ut_suite_item_info.tps | 5 +- source/core/ut_suite_manager.pkb | 17 +++--- source/core/ut_suite_manager.pks | 2 +- source/install.sql | 1 + test/ut3_tester_helper/run_helper.pkb | 88 +++++++++++++++++++++++++++ test/ut3_tester_helper/run_helper.pks | 3 + test/ut3_user/api/test_ut_runner.pkb | 88 ++++++++++++++++++++++++++- test/ut3_user/api/test_ut_runner.pks | 25 +++++++- 11 files changed, 275 insertions(+), 30 deletions(-) create mode 100644 source/api/ut_suite_item_info.tpb diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 60a4ed845..84e5f90fc 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1243,7 +1243,7 @@ or -Tags are defined as a coma separated list. When executing a tests filtering by tag utPLSQL will find all tests associated with a given tag and execute it. It will apply `OR` logic when resolving a tags so any tests / suites that got matching at least one tag will get executed. +Tags are defined as a coma separated list. When executing a test run with tag filter applied, framework will find all tests associated with given tags and execute them. Framework applies `OR` logic when resolving a tags so any tests / suites that match at least one tag will be included in the test run. When a suite gets tagged all of its children will automatically inherit a tag and get executed along the parent. Parent suit tests are not executed. but a suitepath hierarchy is kept. @@ -1259,9 +1259,9 @@ create or replace PACKAGE ut_sample_test IS --%tag(test1,sample) PROCEDURE ut_refcursors1; - --%test(Compare Ref Cursors #2) + --%test(Run equality test) --%tag(test2,sample) - PROCEDURE ut_refcursors2; + PROCEDURE ut_test; END ut_sample_test; / @@ -1278,21 +1278,16 @@ create or replace PACKAGE BODY ut_sample_test IS ut.expect(v_actual).to_equal(v_expected); END; - PROCEDURE ut_refcursors2 IS - v_actual SYS_REFCURSOR; - v_expected SYS_REFCURSOR; + PROCEDURE ut_test IS BEGIN - open v_expected for select 1 as test from dual; - open v_actual for select 2 as test from dual; - - ut.expect(v_actual).to_equal(v_expected); + ut.expect(1).to_equal(0); END; END ut_sample_test; / ``` -Execution of the test is done by using a new parameter `a_tags` +Execution of the test is done by using a parameter `a_tags` ```sql select * from table(ut.run(a_path => 'ut_sample_test',a_tags => 'suite1')); @@ -1303,10 +1298,22 @@ begin ut.run(a_path => 'ut_sample_test',a_tags => 'suite1'); end; / + +exec ut.run('ut_sample_test', a_tags => 'sample'); ``` +Tags should adhere to following rules: + +- tags are case sensitive +- tags cannot be an empty string +- tags cannot contain spaces e.g. to create a multi-word `tag` please use underscores,dashes, dots etc. e.g. `test_of_batch` +- tags with empty spaces will be ignored during execution +- tags can contain special characters + + + ### Suitepath It is very likely that the application for which you are going to introduce tests consists of many different packages, procedures and functions. diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index df973f5ea..e4d4d482c 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -22,21 +22,22 @@ Querying the data from function provides the follwing details: - `item_line_no` - line_number where annotation identifying the item exists - `path` - suitepath of the item - `disabled_flag` - (0/1) indicator if item is disabled by --%disabled annotation - +- `tags` - tags associated with suites + To get list of all test suites in current schema ```sql select * from table(ut_runner.get_suites_info()) where item_type = 'UT_SUITE'; -``` +``` To get list of all tests for test suite `TEST_STUFF` in current user schema ```sql select * from table(ut_runner.get_suites_info(USER, 'TEST_STUFF')) where item_type = 'UT_TEST'; -``` +``` To get a full information about suite `TEST_STUFF` including suite description, all contexts and tests in a suite ```sql select * from table(ut_runner.get_suites_info(USER, 'TEST_STUFF')) where item_type = 'UT_TEST'; -``` +``` ## Checking if schema contains tests diff --git a/source/api/ut_suite_item_info.tpb b/source/api/ut_suite_item_info.tpb new file mode 100644 index 000000000..06ae8341b --- /dev/null +++ b/source/api/ut_suite_item_info.tpb @@ -0,0 +1,38 @@ +create or replace type body ut_suite_item_info is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + constructor function ut_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 + self.object_owner := a_object_owner; + self.object_name := a_object_name; + self.item_name := a_item_name; + self.item_description := a_item_description; + self.item_type := a_item_type; + self.item_line_no := a_item_line_no; + self.path := a_path; + self.disabled_flag := a_disabled_flag; + self.tags := case + when a_tags is null then null + when a_tags.count = 0 then null + else ut_utils.to_string(ut_utils.table_to_clob(a_tags,',') ,a_quote_char => null) + end; + return; + end; +end; +/ diff --git a/source/api/ut_suite_item_info.tps b/source/api/ut_suite_item_info.tps index b0c77acb6..d7f7f97dc 100644 --- a/source/api/ut_suite_item_info.tps +++ b/source/api/ut_suite_item_info.tps @@ -23,6 +23,9 @@ create or replace type ut_suite_item_info as object ( item_line_no integer, -- line_number where annotation identifying the item exists path varchar2( 4000 ),-- suitepath of the item disabled_flag integer, -- 0 (zero) if item is not disabled, 1 if item is disabled by --%disabled annotation - tags varchar2(4000) + tags varchar2(4000), + 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 ) / diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 768c0af6f..3e41ab58b 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -692,7 +692,7 @@ create or replace package body ut_suite_manager is a_suite_path in varchar2, a_procedure_name in varchar2, a_object_name in varchar2, - a_tags in ut_varchar2_rows + a_tags in ut_varchar2_rows := ut_varchar2_rows() ) return varchar2 is l_error_msg varchar2(500); l_tags clob:= ut_utils.table_to_clob(coalesce(a_tags,ut_varchar2_rows()),','); @@ -705,9 +705,9 @@ create or replace package body ut_suite_manager is l_error_msg := 'Suite package '||a_schema_name||'.'||a_object_name|| ' does not exists'; end if; - if l_error_msg is null and a_tags is not null then + if l_error_msg is null and a_tags.count > 0 then l_error_msg := 'No tests found for tags: '||ut_utils.to_string(l_tags,a_max_output_len => gc_tag_errmsg); - elsif l_error_msg is not null and a_tags is not null then + elsif l_error_msg is not null and a_tags.count > 0 then l_error_msg := l_error_msg||' with tags: '||ut_utils.to_string(l_tags,a_max_output_len => gc_tag_errmsg); end if; @@ -720,7 +720,7 @@ create or replace package body ut_suite_manager is a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, a_random_seed in positive := null, - a_tags ut_varchar2_rows := null + a_tags ut_varchar2_rows := ut_varchar2_rows() ) is l_paths ut_varchar2_list := a_paths; l_path_items t_path_items; @@ -768,7 +768,6 @@ create or replace package body ut_suite_manager is end configure_execution_by_path; - --TODO : add tags function get_suites_info( a_owner_name varchar2, a_package_name varchar2 := null @@ -779,7 +778,7 @@ create or replace package body ut_suite_manager is refresh_cache(a_owner_name); - open l_result for + open l_result for q'[with suite_items as ( select /*+ cardinality(c 100) */ c.* @@ -831,17 +830,17 @@ create or replace package body ut_suite_manager is items as ( select object_owner, object_name, name as item_name, description as item_description, self_type as item_type, line_no as item_line_no, - path, disabled_flag + path, disabled_flag,tags from suite_items union all select object_owner, object_name, object_name as item_name, null as item_description, item_type, null as item_line_no, - s.path, 0 as disabled_flag + s.path, 0 as disabled_flag, ]'||l_ut_owner||q'[.ut_varchar2_rows() as tags from logical_suites s ) select ]'||l_ut_owner||q'[.ut_suite_item_info( object_owner, object_name, item_name, item_description, - item_type, item_line_no, path, disabled_flag + item_type, item_line_no, path, disabled_flag, tags ) from items c]' using upper(a_package_name); diff --git a/source/core/ut_suite_manager.pks b/source/core/ut_suite_manager.pks index c27de2eb1..bf8819693 100644 --- a/source/core/ut_suite_manager.pks +++ b/source/core/ut_suite_manager.pks @@ -50,7 +50,7 @@ create or replace package ut_suite_manager authid current_user is a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, a_random_seed in positive := null, - a_tags ut_varchar2_rows := null + a_tags ut_varchar2_rows := ut_varchar2_rows() ); /** diff --git a/source/install.sql b/source/install.sql index 728f4349f..465beaa48 100644 --- a/source/install.sql +++ b/source/install.sql @@ -279,6 +279,7 @@ prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema --plugin interface API for running utPLSQL @@install_component.sql 'api/ut_suite_item_info.tps' +@@install_component.sql 'api/ut_suite_item_info.tpb' @@install_component.sql 'api/ut_suite_items_info.tps' @@install_component.sql 'api/ut_runner.pks' @@install_component.sql 'api/ut_runner.pkb' diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index 45403ca8a..2f4c9a86e 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -27,6 +27,94 @@ create or replace package body run_helper is execute immediate q'[grant execute on ut3_tester_helper.dummy_test_procedure to public]'; end; + procedure setup_cache_objectstag is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package ut3$user#.dummy_test_package as + --%suite(dummy_test_suite) + --%tags(dummy) + --%rollback(manual) + + --%test(dummy_test) + --%tags(testtag) + --%beforetest(some_procedure) + procedure some_dummy_test_procedure; + end;]'; + execute immediate q'[create or replace procedure ut3$user#.dummy_test_procedure as + --%some_annotation(some_text) + --%rollback(manual) + begin + null; + end;]'; + execute immediate q'[create or replace procedure ut3_tester_helper.dummy_test_procedure as + --%some_annotation(some_text) + --%rollback(manual) + begin + null; + end;]'; + + execute immediate q'[grant execute on ut3_tester_helper.dummy_test_procedure to public]'; + end; + + procedure setup_cache_twotags is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package ut3$user#.dummy_test_package as + --%suite(dummy_test_suite) + --%tags(suitetag1,suitetag2) + --%rollback(manual) + + --%test(dummy_test) + --%tags(testtag1,testtag2) + --%beforetest(some_procedure) + procedure some_dummy_test_procedure; + end;]'; + execute immediate q'[create or replace procedure ut3$user#.dummy_test_procedure as + --%some_annotation(some_text) + --%rollback(manual) + begin + null; + end;]'; + execute immediate q'[create or replace procedure ut3_tester_helper.dummy_test_procedure as + --%some_annotation(some_text) + --%rollback(manual) + begin + null; + end;]'; + + execute immediate q'[grant execute on ut3_tester_helper.dummy_test_procedure to public]'; + end; + + procedure setup_cache_longtags is + pragma autonomous_transaction; + begin + execute immediate q'[create or replace package ut3$user#.dummy_test_package as + --%suite(dummy_test_suite) + --%tags(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) + --%tags(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) + --%rollback(manual) + + --%test(dummy_test) + --%tags(testtag1,testtag2) + --%beforetest(some_procedure) + procedure some_dummy_test_procedure; + end;]'; + execute immediate q'[create or replace procedure ut3$user#.dummy_test_procedure as + --%some_annotation(some_text) + --%rollback(manual) + begin + null; + end;]'; + execute immediate q'[create or replace procedure ut3_tester_helper.dummy_test_procedure as + --%some_annotation(some_text) + --%rollback(manual) + begin + null; + end;]'; + + execute immediate q'[grant execute on ut3_tester_helper.dummy_test_procedure to public]'; + end; + procedure create_trans_control is pragma autonomous_transaction; begin diff --git a/test/ut3_tester_helper/run_helper.pks b/test/ut3_tester_helper/run_helper.pks index 45c64741c..e79549f3e 100644 --- a/test/ut3_tester_helper/run_helper.pks +++ b/test/ut3_tester_helper/run_helper.pks @@ -6,6 +6,9 @@ create or replace package run_helper is type prof_runs_tab is table of ut3.plsql_profiler_runs%rowtype; procedure setup_cache_objects; + procedure setup_cache_objectstag; + procedure setup_cache_twotags; + procedure setup_cache_longtags; procedure setup_cache; procedure cleanup_cache; procedure create_db_link; diff --git a/test/ut3_user/api/test_ut_runner.pkb b/test/ut3_user/api/test_ut_runner.pkb index 298c15c2a..d58f4832d 100644 --- a/test/ut3_user/api/test_ut_runner.pkb +++ b/test/ut3_user/api/test_ut_runner.pkb @@ -5,6 +5,21 @@ create or replace package body test_ut_runner is ut3_tester_helper.run_helper.setup_cache_objects(); end; + procedure setup_cache_objectstag is + begin + ut3_tester_helper.run_helper.setup_cache_objectstag(); + end; + + procedure setup_cache_twotags is + begin + ut3_tester_helper.run_helper.setup_cache_twotags(); + end; + + procedure setup_cache_longtags is + begin + ut3_tester_helper.run_helper.setup_cache_longtags(); + end; + procedure setup_cache is begin ut3_tester_helper.run_helper.setup_cache(); @@ -238,7 +253,7 @@ end;'; ut.expect(l_actual).to_equal(0); end; - procedure test_get_suites_info is + procedure test_get_suites_info_notag is l_expected sys_refcursor; l_actual sys_refcursor; begin @@ -247,12 +262,79 @@ end;'; select 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'DUMMY_TEST_PACKAGE' item_name, 'dummy_test_suite' item_description, 'UT_SUITE' item_type, 2 item_line_no, - 'dummy_test_package' path, 0 disabled_flag + 'dummy_test_package' path, 0 disabled_flag,null tags from dual union all select 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'SOME_DUMMY_TEST_PROCEDURE' item_name, 'dummy_test' item_description, 'UT_TEST' item_type, 5 item_line_no, - 'dummy_test_package.some_dummy_test_procedure' path, 0 disabled_flag + 'dummy_test_package.some_dummy_test_procedure' path, 0 disabled_flag,null tags + from dual; + --Act + open l_actual for select * from table(ut3.ut_runner.get_suites_info('UT3$USER#','DUMMY_TEST_PACKAGE')); + --Assert + ut.expect(l_actual).to_equal(l_expected); + end; + + --TODO : Apostro????? + procedure test_get_suites_info_tag is + l_expected sys_refcursor; + l_actual sys_refcursor; + begin + --Arrange + open l_expected for + select + 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'DUMMY_TEST_PACKAGE' item_name, + 'dummy_test_suite' item_description, 'UT_SUITE' item_type, 2 item_line_no, + 'dummy_test_package' path, 0 disabled_flag,'dummy' tags + from dual union all + select + 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'SOME_DUMMY_TEST_PROCEDURE' item_name, + 'dummy_test' item_description, 'UT_TEST' item_type, 6 item_line_no, + 'dummy_test_package.some_dummy_test_procedure' path, 0 disabled_flag,'testtag' tags + from dual; + --Act + open l_actual for select * from table(ut3.ut_runner.get_suites_info('UT3$USER#','DUMMY_TEST_PACKAGE')); + --Assert + ut.expect(l_actual).to_equal(l_expected); + end; + + procedure test_get_suites_info_twotag is + l_expected sys_refcursor; + l_actual sys_refcursor; + begin + --Arrange + open l_expected for + select + 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'DUMMY_TEST_PACKAGE' item_name, + 'dummy_test_suite' item_description, 'UT_SUITE' item_type, 2 item_line_no, + 'dummy_test_package' path, 0 disabled_flag,'suitetag1,suitetag2' tags + from dual union all + select + 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'SOME_DUMMY_TEST_PROCEDURE' item_name, + 'dummy_test' item_description, 'UT_TEST' item_type, 6 item_line_no, + 'dummy_test_package.some_dummy_test_procedure' path, 0 disabled_flag,'testtag1,testtag2' tags + from dual; + --Act + open l_actual for select * from table(ut3.ut_runner.get_suites_info('UT3$USER#','DUMMY_TEST_PACKAGE')); + --Assert + ut.expect(l_actual).to_equal(l_expected); + end; + + procedure test_get_suites_info_longtag is + l_expected sys_refcursor; + l_actual sys_refcursor; + begin + --Arrange + open l_expected for + select + 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'DUMMY_TEST_PACKAGE' item_name, + 'dummy_test_suite' item_description, 'UT_SUITE' item_type, 2 item_line_no, + 'dummy_test_package' path, 0 disabled_flag,'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[...]' tags + from dual union all + select + 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'SOME_DUMMY_TEST_PROCEDURE' item_name, + 'dummy_test' item_description, 'UT_TEST' item_type, 7 item_line_no, + 'dummy_test_package.some_dummy_test_procedure' path, 0 disabled_flag,'testtag1,testtag2' tags from dual; --Act open l_actual for select * from table(ut3.ut_runner.get_suites_info('UT3$USER#','DUMMY_TEST_PACKAGE')); diff --git a/test/ut3_user/api/test_ut_runner.pks b/test/ut3_user/api/test_ut_runner.pks index 70eed747f..2ddeff401 100644 --- a/test/ut3_user/api/test_ut_runner.pks +++ b/test/ut3_user/api/test_ut_runner.pks @@ -41,6 +41,9 @@ create or replace package test_ut_runner is procedure test_purge_cache_schema_type; procedure setup_cache_objects; + procedure setup_cache_objectstag; + procedure setup_cache_twotags; + procedure setup_cache_longtags; --%test(Rebuilds cache for a given schema and object type) --%beforetest(setup_cache_objects) @@ -50,7 +53,27 @@ create or replace package test_ut_runner is --%test(get_suites_info returns a cursor containing records for a newly created test) --%beforetest(setup_cache_objects) --%aftertest(cleanup_cache) - procedure test_get_suites_info; + procedure test_get_suites_info_notag; + + --%test(get_suites_info returns a cursor containing records for a newly created test with tag) + --%beforetest(setup_cache_objectstag) + --%aftertest(cleanup_cache) + procedure test_get_suites_info_tag; + + --%test(get_suites_info returns a cursor containing records for a newly created test with two tags) + --%beforetest(setup_cache_twotags) + --%aftertest(cleanup_cache) + procedure test_get_suites_info_twotag; + + /*** + * This test at the moment is not possible to correctly run due to limit of to_string when + * displaying a diff message returnign max 4k char. + */ + --%test(get_suites_info returns a cursor containing records for a newly created test with long tag) + --%beforetest(setup_cache_longtags) + --%aftertest(cleanup_cache) + --%disabled + procedure test_get_suites_info_longtag; --%test(get_reporters_list returns a cursor containing all built-in reporters and information about output-reporter) --%beforetest(setup_cache_objects) From 957ea8bdf8ae2f9dff452c9a9532494f7e779a32 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sun, 28 Apr 2019 10:46:03 +0100 Subject: [PATCH 105/181] Remove a 4k tests --- test/ut3_tester_helper/run_helper.pkb | 30 --------------------------- test/ut3_tester_helper/run_helper.pks | 1 - test/ut3_user/api/test_ut_runner.pkb | 27 ------------------------ test/ut3_user/api/test_ut_runner.pks | 11 ---------- 4 files changed, 69 deletions(-) diff --git a/test/ut3_tester_helper/run_helper.pkb b/test/ut3_tester_helper/run_helper.pkb index 2f4c9a86e..9bc2b7f79 100644 --- a/test/ut3_tester_helper/run_helper.pkb +++ b/test/ut3_tester_helper/run_helper.pkb @@ -85,36 +85,6 @@ create or replace package body run_helper is execute immediate q'[grant execute on ut3_tester_helper.dummy_test_procedure to public]'; end; - procedure setup_cache_longtags is - pragma autonomous_transaction; - begin - execute immediate q'[create or replace package ut3$user#.dummy_test_package as - --%suite(dummy_test_suite) - --%tags(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) - --%tags(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) - --%rollback(manual) - - --%test(dummy_test) - --%tags(testtag1,testtag2) - --%beforetest(some_procedure) - procedure some_dummy_test_procedure; - end;]'; - execute immediate q'[create or replace procedure ut3$user#.dummy_test_procedure as - --%some_annotation(some_text) - --%rollback(manual) - begin - null; - end;]'; - execute immediate q'[create or replace procedure ut3_tester_helper.dummy_test_procedure as - --%some_annotation(some_text) - --%rollback(manual) - begin - null; - end;]'; - - execute immediate q'[grant execute on ut3_tester_helper.dummy_test_procedure to public]'; - end; - procedure create_trans_control is pragma autonomous_transaction; begin diff --git a/test/ut3_tester_helper/run_helper.pks b/test/ut3_tester_helper/run_helper.pks index e79549f3e..e06401eae 100644 --- a/test/ut3_tester_helper/run_helper.pks +++ b/test/ut3_tester_helper/run_helper.pks @@ -8,7 +8,6 @@ create or replace package run_helper is procedure setup_cache_objects; procedure setup_cache_objectstag; procedure setup_cache_twotags; - procedure setup_cache_longtags; procedure setup_cache; procedure cleanup_cache; procedure create_db_link; diff --git a/test/ut3_user/api/test_ut_runner.pkb b/test/ut3_user/api/test_ut_runner.pkb index d58f4832d..e282963cb 100644 --- a/test/ut3_user/api/test_ut_runner.pkb +++ b/test/ut3_user/api/test_ut_runner.pkb @@ -15,11 +15,6 @@ create or replace package body test_ut_runner is ut3_tester_helper.run_helper.setup_cache_twotags(); end; - procedure setup_cache_longtags is - begin - ut3_tester_helper.run_helper.setup_cache_longtags(); - end; - procedure setup_cache is begin ut3_tester_helper.run_helper.setup_cache(); @@ -320,28 +315,6 @@ end;'; ut.expect(l_actual).to_equal(l_expected); end; - procedure test_get_suites_info_longtag is - l_expected sys_refcursor; - l_actual sys_refcursor; - begin - --Arrange - open l_expected for - select - 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'DUMMY_TEST_PACKAGE' item_name, - 'dummy_test_suite' item_description, 'UT_SUITE' item_type, 2 item_line_no, - 'dummy_test_package' path, 0 disabled_flag,'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[...]' tags - from dual union all - select - 'UT3$USER#' object_owner, 'DUMMY_TEST_PACKAGE' object_name, 'SOME_DUMMY_TEST_PROCEDURE' item_name, - 'dummy_test' item_description, 'UT_TEST' item_type, 7 item_line_no, - 'dummy_test_package.some_dummy_test_procedure' path, 0 disabled_flag,'testtag1,testtag2' tags - from dual; - --Act - open l_actual for select * from table(ut3.ut_runner.get_suites_info('UT3$USER#','DUMMY_TEST_PACKAGE')); - --Assert - ut.expect(l_actual).to_equal(l_expected); - end; - procedure test_get_reporters_list is l_expected sys_refcursor; l_actual sys_refcursor; diff --git a/test/ut3_user/api/test_ut_runner.pks b/test/ut3_user/api/test_ut_runner.pks index 2ddeff401..967009c61 100644 --- a/test/ut3_user/api/test_ut_runner.pks +++ b/test/ut3_user/api/test_ut_runner.pks @@ -43,7 +43,6 @@ create or replace package test_ut_runner is procedure setup_cache_objects; procedure setup_cache_objectstag; procedure setup_cache_twotags; - procedure setup_cache_longtags; --%test(Rebuilds cache for a given schema and object type) --%beforetest(setup_cache_objects) @@ -65,16 +64,6 @@ create or replace package test_ut_runner is --%aftertest(cleanup_cache) procedure test_get_suites_info_twotag; - /*** - * This test at the moment is not possible to correctly run due to limit of to_string when - * displaying a diff message returnign max 4k char. - */ - --%test(get_suites_info returns a cursor containing records for a newly created test with long tag) - --%beforetest(setup_cache_longtags) - --%aftertest(cleanup_cache) - --%disabled - procedure test_get_suites_info_longtag; - --%test(get_reporters_list returns a cursor containing all built-in reporters and information about output-reporter) --%beforetest(setup_cache_objects) --%aftertest(cleanup_cache) From 2a9155146da957678e3f247ef96d4d44bd5de07f Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sun, 28 Apr 2019 10:48:15 +0100 Subject: [PATCH 106/181] Added constant --- source/core/ut_suite_builder.pkb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index 245a49b76..f732bb004 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -16,6 +16,11 @@ create or replace package body ut_suite_builder is limitations under the License. */ + /** + * Regexp to validate tag + */ + gc_word_no_space constant varchar2(50) := '^(\w|\S)+$'; + subtype t_annotation_text is varchar2(4000); subtype t_annotation_name is varchar2(4000); subtype t_object_name is varchar2(500); @@ -329,7 +334,7 @@ create or replace package body ut_suite_builder is ); end if; --remove empty strings from table list e.g. tag1,,tag2 and conver to rows - a_list := ut_utils.convert_collection( ut_utils.filter_list(l_tag_list,'^(\w|\S)+$') ); + a_list := ut_utils.convert_collection( ut_utils.filter_list(l_tag_list,gc_word_no_space) ); l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); end loop; @@ -641,7 +646,7 @@ create or replace package body ut_suite_builder is l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); end loop; --remove empty strings from table list e.g. tag1,,tag2 - a_suite.tags := ut_utils.convert_collection(ut_utils.filter_list(l_tag_list,'^(\w|\S)+$')); + a_suite.tags := ut_utils.convert_collection(ut_utils.filter_list(l_tag_list,gc_word_no_space)); end; procedure add_suite_tests( From 8a7bf6fe620deb7c70ad3c8d473c67024a33b9ff Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 28 Apr 2019 12:47:24 +0000 Subject: [PATCH 107/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 491892256..36547c793 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index bbd1e1cf3..4ecd8f126 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index d9439e5be..581f85c0f 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index c8d388d30..fbca85f14 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 9c915d543..b98ab6109 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index b55249394..96a97c67b 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index f1a58d7af..25b99e8d4 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index e3ae65485..521cbbe75 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index ee78589c8..4baa52100 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index c1aca8c6a..7709caaf0 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 24d617f5d..750f8aa59 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index d3bfe9d19..ff1b5cbfe 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 571f14d98..a8631cf61 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 56b4d1001..a163dca35 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index b48a170e4..81a1d2346 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index f6ef99991..82c324284 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 5f5339002..13db959fc 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2886--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 392ff96dc..88409bd9e 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2886-develop + * secion v3.1.7.2897-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 7738a9196..730ec140a 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2886-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2897-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From b2fcd953815f0a3da4a5c8c71ee6fc0c8d1eb424 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 28 Apr 2019 14:55:18 +0100 Subject: [PATCH 108/181] Added-back rigger installation to CI/CD process. --- .travis/install.sh | 4 +++- .travis/install_utplsql_release.sh | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index 7f7dc2198..04cf72c16 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -10,7 +10,7 @@ set verify off --alter session set plsql_warnings = 'ENABLE:ALL', 'DISABLE:(5004,5018,6000,6001,6003,6009,6010,7206)'; alter session set plsql_optimize_level=0; -@install_headless.sql $UT3_OWNER $UT3_OWNER_PASSWORD +@install_headless_with_trigger.sql $UT3_OWNER $UT3_OWNER_PASSWORD SQL #Run this step only on second child job (12.1 - at it's fastest) @@ -92,5 +92,7 @@ set feedback on --Needed for testing coverage outside of main UT3 schema. grant create any procedure, drop any procedure, execute any procedure, create any type, drop any type, execute any type, under any type, select any table, update any table, insert any table, delete any table, create any table, drop any table, alter any table, select any dictionary, create any synonym, drop any synonym to $UT3_TESTER_HELPER; grant create job to $UT3_TESTER_HELPER; +--Needed to allow for enable/disable of annotation triggers +grant administer database trigger to $UT3_TESTER_HELPER; exit SQL diff --git a/.travis/install_utplsql_release.sh b/.travis/install_utplsql_release.sh index 889e098da..339c23c6e 100755 --- a/.travis/install_utplsql_release.sh +++ b/.travis/install_utplsql_release.sh @@ -38,7 +38,7 @@ SQL "$SQLCLI" sys/$ORACLE_PWD@//$CONNECTION_STR AS SYSDBA < Date: Sun, 28 Apr 2019 15:31:57 +0100 Subject: [PATCH 109/181] Moved test to new package structure and improved test details. --- .../expectations/test_expectations_cursor.pkb | 41 ++++++++++++++++++- .../expectations/test_expectations_cursor.pks | 15 ++++++- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index e1000457d..9b0668287 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2788,6 +2788,45 @@ Check the query and data for errors.'; ut3.ut.expect(l_actual).to_equal(l_expected); ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; - + + procedure compare_number_pckg_type + as + l_expected sys_refcursor; + l_actual sys_refcursor; + l_expected_data t_num_tab; + l_actual_message varchar2(32767); + l_expected_message varchar2(32767); + begin + + l_expected_data(1).col1 := 2135; + l_expected_data(1).col4 := 2016; + l_expected_data(1).col5 := -1; + + open l_expected for + select * + from table (l_expected_data); + + open l_actual for + select + 1 as col1 + ,2 as col2 + ,3 as col3 + ,2016 as col4 + ,-1 as col5 + from dual; + + ut3.ut.expect(l_actual).to_equal(a_expected => l_expected); + + l_expected_message := q'[%Actual: refcursor [ count = 1 ] was expected to equal: refcursor [ count = 1 ] +%Diff: +%Rows: [ 1 differences ] +%Row No. 1 - Actual: 123 +%Row No. 1 - Expected: 2135%]'; + + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + end; / diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index 15a0d98ea..222717c07 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -445,6 +445,19 @@ create or replace package test_expectations_cursor is --%test(Check precision of number from dual #907) procedure number_from_dual; - + + --%test( Comparing number types with different precisions works with package-type nested tables ) + procedure compare_number_pckg_type; + + type t_num_rec is record ( + col1 number(15,0), + col2 number(1,0), + col3 number(4,0), + col4 number(4,0), + col5 number(38,0)); + + + type t_num_tab is table of t_num_rec index by binary_integer; + end; / From 63bc825160c7fc609a515beaa0caf4d71eb41104 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 28 Apr 2019 15:43:28 +0100 Subject: [PATCH 110/181] Fixed test to run only on 12 and above. --- test/ut3_user/expectations/test_expectations_cursor.pkb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 9b0668287..a6e87a892 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2802,6 +2802,8 @@ Check the query and data for errors.'; l_expected_data(1).col4 := 2016; l_expected_data(1).col5 := -1; + --Select on package level nested table types supported only since Oracle 12 + $if dbms_db_version.version >= 12 $then open l_expected for select * from table (l_expected_data); @@ -2826,6 +2828,7 @@ Check the query and data for errors.'; l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); ut.expect(l_actual_message).to_be_like(l_expected_message); + $end end; end; From aaf73c7b1d7a1c733f31de7209a062ed4633b6e3 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 28 Apr 2019 15:19:02 +0000 Subject: [PATCH 111/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 36547c793..be39b208a 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 4ecd8f126..451fe512f 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 581f85c0f..38df1fcd1 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index fbca85f14..441b1d8ab 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index b98ab6109..9875ef64e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 96a97c67b..df0c392f1 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 25b99e8d4..9ec377237 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 521cbbe75..dcf74b8e6 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 4baa52100..aa1bbbb77 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 7709caaf0..bf9ae74ce 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 750f8aa59..51ea26ca7 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index ff1b5cbfe..3da8dee25 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index a8631cf61..416ee5116 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index a163dca35..39dfabceb 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 81a1d2346..bda4a3583 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 82c324284..df11ae6de 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 13db959fc..962e57f96 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2897--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 88409bd9e..9cd49c4a0 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2897-develop + * secion v3.1.7.2904-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 730ec140a..94b9f3f68 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2897-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2904-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 00fe13e141730e437cf00bc1bd01beb3c744c1da Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 28 Apr 2019 21:27:46 +0100 Subject: [PATCH 112/181] Removed garbage after PR merge. --- test/core/expectations/compound_data/test_expectations_cursor.pkb | 0 test/core/expectations/compound_data/test_expectations_cursor.pks | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/core/expectations/compound_data/test_expectations_cursor.pkb delete mode 100644 test/core/expectations/compound_data/test_expectations_cursor.pks diff --git a/test/core/expectations/compound_data/test_expectations_cursor.pkb b/test/core/expectations/compound_data/test_expectations_cursor.pkb deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/core/expectations/compound_data/test_expectations_cursor.pks b/test/core/expectations/compound_data/test_expectations_cursor.pks deleted file mode 100644 index e69de29bb..000000000 From d00a0f783a005e5e7bb3d8dec638e5fac35c54ee Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 29 Apr 2019 07:25:31 +0100 Subject: [PATCH 113/181] Updates to PR. Switch to common add tags to suite item --- docs/userguide/annotations.md | 28 +++++------ source/api/ut_runner.pkb | 2 +- source/core/ut_suite_builder.pkb | 51 ++++----------------- source/core/ut_suite_manager.pkb | 41 ++++------------- source/core/ut_utils.pks | 5 ++ test/ut3_tester/core/test_suite_builder.pkb | 2 +- test/ut3_user/api/test_ut_run.pkb | 22 ++------- test/ut3_user/api/test_ut_run.pks | 3 -- test/ut3_user/api/test_ut_runner.pkb | 1 - 9 files changed, 42 insertions(+), 113 deletions(-) diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 296616f28..51bfa7abf 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1250,40 +1250,40 @@ When a suite gets tagged all of its children will automatically inherit a tag an Sample tag package. ```sql -create or replace PACKAGE ut_sample_test IS +create or replace package ut_sample_test IS --%suite(Sample Test Suite) --%tag(suite1) --%test(Compare Ref Cursors) --%tag(test1,sample) - PROCEDURE ut_refcursors1; + procedure ut_refcursors1; --%test(Run equality test) --%tag(test2,sample) - PROCEDURE ut_test; + procedure ut_test; -END ut_sample_test; +end ut_sample_test; / -create or replace PACKAGE BODY ut_sample_test IS +create or replace package body ut_sample_test is - PROCEDURE ut_refcursors1 IS - v_actual SYS_REFCURSOR; - v_expected SYS_REFCURSOR; - BEGIN + procedure ut_refcursors1 is + v_actual sys_refcursor; + v_expected sys_refcursor; + begin open v_expected for select 1 as test from dual; open v_actual for select 2 as test from dual; ut.expect(v_actual).to_equal(v_expected); - END; + end; - PROCEDURE ut_test IS - BEGIN + procedure ut_test is + begin ut.expect(1).to_equal(0); - END; + end; -END ut_sample_test; +end ut_sample_test; / ``` diff --git a/source/api/ut_runner.pkb b/source/api/ut_runner.pkb index 5a9cc856a..d57b86edd 100644 --- a/source/api/ut_runner.pkb +++ b/source/api/ut_runner.pkb @@ -143,7 +143,7 @@ create or replace package body ut_runner is if a_tags is not null then l_tags := l_tags multiset union distinct ut_utils.convert_collection( - ut_utils.filter_list(ut_utils.string_to_table(a_tags,','),'^(\w|\S)+$') + ut_utils.trim_list_elements(ut_utils.filter_list(ut_utils.string_to_table(a_tags,','),ut_utils.gc_word_no_space)) ); end if; l_exclude_object_names := l_exclude_object_names multiset union all ut_suite_manager.get_schema_ut_packages(l_coverage_schema_names); diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index f732bb004..eab4d48b1 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -15,11 +15,6 @@ create or replace package body ut_suite_builder is See the License for the specific language governing permissions and limitations under the License. */ - - /** - * Regexp to validate tag - */ - gc_word_no_space constant varchar2(50) := '^(\w|\S)+$'; subtype t_annotation_text is varchar2(4000); subtype t_annotation_name is varchar2(4000); @@ -311,13 +306,13 @@ create or replace package body ut_suite_builder is l_annotation_pos := a_throws_ann_text.next(l_annotation_pos); end loop; end; - - procedure add_tags_to_test( + + 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, - a_tags_ann_text tt_annotation_texts - ) is + a_procedure_name t_object_name := null + ) is l_annotation_pos binary_integer; l_tag_list ut_varchar2_list := ut_varchar2_list(); begin @@ -333,14 +328,12 @@ create or replace package body ut_suite_builder is ut_utils.string_to_table(a_tags_ann_text(l_annotation_pos),',') ); end if; - --remove empty strings from table list e.g. tag1,,tag2 and conver to rows - a_list := ut_utils.convert_collection( ut_utils.filter_list(l_tag_list,gc_word_no_space) ); 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 + 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 @@ -521,7 +514,7 @@ create or replace package body ut_suite_builder is end if; if l_proc_annotations.exists( gc_tag) then - add_tags_to_test(a_suite, l_test.tags, a_procedure_name, l_proc_annotations( gc_tag)); + add_tags_to_suite_item(a_suite, l_proc_annotations( gc_tag), l_test.tags, a_procedure_name); end if; if l_proc_annotations.exists( gc_throws) then @@ -625,30 +618,6 @@ create or replace package body ut_suite_builder is a_suite.path := lower(coalesce(a_suite.path, a_suite.object_name)); end; - procedure add_tags_to_suite( - a_suite in out nocopy ut_suite, - a_tags_ann_text tt_annotation_texts - ) is - l_annotation_pos binary_integer; - l_tag_list ut_varchar2_list := ut_varchar2_list(); - begin - l_annotation_pos := a_tags_ann_text.first; - while l_annotation_pos is not null loop - if a_tags_ann_text(l_annotation_pos) is null then - a_suite.put_warning( - '"--%tags" annotation requires a tag value populated. Annotation ignored, line ' || l_annotation_pos - ); - else - 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; - l_annotation_pos := a_tags_ann_text.next(l_annotation_pos); - end loop; - --remove empty strings from table list e.g. tag1,,tag2 - a_suite.tags := ut_utils.convert_collection(ut_utils.filter_list(l_tag_list,gc_word_no_space)); - end; - procedure add_suite_tests( a_suite in out nocopy ut_suite, a_annotations t_annotations_info, @@ -699,7 +668,7 @@ create or replace package body ut_suite_builder is end if; if a_annotations.by_name.exists(gc_tag) then - add_tags_to_suite(a_suite, a_annotations.by_name(gc_tag)); + add_tags_to_suite_item(a_suite, a_annotations.by_name(gc_tag),a_suite.tags); end if; a_suite.disabled_flag := ut_utils.boolean_to_int(a_annotations.by_name.exists(gc_disabled)); diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 3e41ab58b..edbce7d5b 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -17,7 +17,7 @@ create or replace package body ut_suite_manager is */ gc_suitpath_error_message constant varchar2(100) := 'Suitepath exceeds 1000 CHAR on: '; - gc_tag_errmsg constant number := 450; + gc_tag_errmsg constant integer := 450; type t_path_item is record ( object_name varchar2(250), @@ -687,35 +687,6 @@ create or replace package body ut_suite_manager is return l_suites; end; - function build_no_test_error_msg( - a_schema_name in varchar2, - a_suite_path in varchar2, - a_procedure_name in varchar2, - a_object_name in varchar2, - a_tags in ut_varchar2_rows := ut_varchar2_rows() - ) return varchar2 is - l_error_msg varchar2(500); - l_tags clob:= ut_utils.table_to_clob(coalesce(a_tags,ut_varchar2_rows()),','); - begin - if a_suite_path is not null then - l_error_msg := 'No suite packages found for path '||a_schema_name||':'||a_suite_path; - elsif a_procedure_name is not null then - l_error_msg := 'Suite test '||a_schema_name||'.'||a_object_name|| '.'||a_procedure_name||' does not exists'; - elsif a_object_name is not null then - l_error_msg := 'Suite package '||a_schema_name||'.'||a_object_name|| ' does not exists'; - end if; - - if l_error_msg is null and a_tags.count > 0 then - l_error_msg := 'No tests found for tags: '||ut_utils.to_string(l_tags,a_max_output_len => gc_tag_errmsg); - elsif l_error_msg is not null and a_tags.count > 0 then - l_error_msg := l_error_msg||' with tags: '||ut_utils.to_string(l_tags,a_max_output_len => gc_tag_errmsg); - end if; - - l_error_msg := l_error_msg ||'.'; - - return l_error_msg; - end; - procedure configure_execution_by_path( a_paths in ut_varchar2_list, a_suites out nocopy ut_suite_items, @@ -751,9 +722,13 @@ create or replace package body ut_suite_manager is a_tags ); if a_suites.count = l_suites_count then - raise_application_error(ut_utils.gc_suite_package_not_found,build_no_test_error_msg( - l_schema,l_path_item.suite_path,l_path_item.procedure_name, - l_path_item.object_name,a_tags)); + 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|| '.'); + 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'); + elsif l_path_item.object_name is not null then + 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; l_index := a_suites.first; l_suites_count := a_suites.count; diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index dfef91489..69a8824d4 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -131,6 +131,11 @@ create or replace package ut_utils authid definer is gc_bc_fetch_limit constant integer := 1000; gc_diff_max_rows constant integer := 20; + /** + * Regexp to validate tag + */ + gc_word_no_space constant varchar2(50) := '^(\w|\S)+$'; + type t_version is record( major natural, minor natural, diff --git a/test/ut3_tester/core/test_suite_builder.pkb b/test/ut3_tester/core/test_suite_builder.pkb index 3bebb500e..523d31a3d 100644 --- a/test/ut3_tester/core/test_suite_builder.pkb +++ b/test/ut3_tester/core/test_suite_builder.pkb @@ -1296,7 +1296,7 @@ create or replace package body test_suite_builder is l_actual := invoke_builder_for_annotations(l_annotations, 'SOME_PACKAGE'); --Assert ut.expect(l_actual).to_be_like( - '%"--%tags" annotation requires a tag value populated. Annotation ignored, line 3%'|| + '%"--%tags" annotation requires a tag value populated. Annotation ignored.%%'|| '%%' ); diff --git a/test/ut3_user/api/test_ut_run.pkb b/test/ut3_user/api/test_ut_run.pkb index 60c9a7dc8..857492f58 100644 --- a/test/ut3_user/api/test_ut_run.pkb +++ b/test/ut3_user/api/test_ut_run.pkb @@ -875,14 +875,11 @@ Failures:% l_results clob; l_exp_message varchar2(4000); begin - l_exp_message :=q'[ORA-20204: No tests found for tags: 'nonexisting'.]'; ut3_tester_helper.run_helper.run(a_tags => 'nonexisting'); l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); - ut.fail('Expecte test to fail'); - --Assert - exception - when others then - ut.expect( sqlerrm ).to_be_like( l_exp_message ); + ut.expect( l_results ).not_to_be_like( '%test_package_1%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_2%' ); + ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); end; procedure test_duplicate_tag is @@ -906,19 +903,6 @@ Failures:% ut.expect( l_results ).to_be_like( '%test_package_2%' ); ut.expect( l_results ).not_to_be_like( '%test_package_3%' ); end; - - procedure run_proc_pkg_name_no_tag is - l_results clob; - l_exp_message varchar2(4000); - begin - l_exp_message :=q'[ORA-20204: Suite package ut3_tester_helper.test_package_1 does not exists with tags: 'nonexists'.]'; - ut3.ut.run('ut3_tester_helper.test_package_1',a_tags => 'nonexists'); - l_results := ut3_tester_helper.main_helper.get_dbms_output_as_clob(); - ut.fail('Expecte test to fail'); - exception - when others then - ut.expect( sqlerrm ).to_be_like( l_exp_message ); - end; procedure run_proc_pkg_name_tag is l_results clob; diff --git a/test/ut3_user/api/test_ut_run.pks b/test/ut3_user/api/test_ut_run.pks index fcb62e207..4616763d0 100644 --- a/test/ut3_user/api/test_ut_run.pks +++ b/test/ut3_user/api/test_ut_run.pks @@ -198,9 +198,6 @@ create or replace package test_ut_run is --%test(Execute suite test for duplicate list tags) procedure suite_duplicate_tag; - --%test(Run a package by name with non existing tag) - procedure run_proc_pkg_name_no_tag; - --%test(Runs given package only with package name given as path and filter by tag) procedure run_proc_pkg_name_tag; diff --git a/test/ut3_user/api/test_ut_runner.pkb b/test/ut3_user/api/test_ut_runner.pkb index e282963cb..3ff0a4850 100644 --- a/test/ut3_user/api/test_ut_runner.pkb +++ b/test/ut3_user/api/test_ut_runner.pkb @@ -270,7 +270,6 @@ end;'; ut.expect(l_actual).to_equal(l_expected); end; - --TODO : Apostro????? procedure test_get_suites_info_tag is l_expected sys_refcursor; l_actual sys_refcursor; From 31643107b21f13da0896ec60f4ce7337772485ad Mon Sep 17 00:00:00 2001 From: lwasylow Date: Mon, 29 Apr 2019 13:34:08 +0100 Subject: [PATCH 114/181] Move query to template to simplify view --- source/core/ut_suite_manager.pkb | 252 ++++++++++++++++++------------- 1 file changed, 146 insertions(+), 106 deletions(-) diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index edbce7d5b..554085277 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -19,6 +19,70 @@ create or replace package body ut_suite_manager is gc_suitpath_error_message constant varchar2(100) := 'Suitepath exceeds 1000 CHAR on: '; gc_tag_errmsg constant integer := 450; + gc_get_cache_suite_sql constant varchar2(32767) := + q'[with + suite_items as ( + select /*+ cardinality(c 100) */ c.* + from {:owner:}.ut_suite_cache c + where 1 = 1 {:object_list:} + and c.object_owner = '{:object_owner:}' + and ( {:path:} + and {:object_name:} + and {:procedure_name:} + ) + ) + ), + {:tags:}, + suitepaths as ( + select distinct substr(path,1,instr(path,'.',-1)-1) as suitepath, + path, + object_owner + from {:suite_item_name:} + where 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 {:owner:}.ut_executables) as x, + cast(null as {:owner:}.ut_integer_list) as y, + cast(null as {:owner:}.ut_executable_test) as z + from suitepath_part p + where p.path + not in (select s.path from suitepaths s) + ), + logical_suites as ( + select to_number(null) as id, s.self_type, s.path, s.object_owner, s.object_name, + s.object_name as name, null as line_no, null as parse_time, + null as description, null as rollback_type, 0 as disabled_flag, + {:owner:}.ut_varchar2_rows() as warnings, + s.x as before_all_list, s.x as after_all_list, + s.x as before_each_list, s.x as before_test_list, + s.x as after_each_list, s.x as after_test_list, + s.y as expected_error_codes, null as test_tags, + s.z as item + from logical_suite_data s + ), + items as ( + select * from {:suite_item_name:} + union all + select * from logical_suites + ) + select c.* + from items c + order by c.object_owner,{:random_seed:}]'; + type t_path_item is record ( object_name varchar2(250), procedure_name varchar2(250), @@ -330,7 +394,7 @@ create or replace package body ut_suite_manager is end loop; close a_suite_data_cursor; end reconstruct_from_cache; - + function get_missing_objects(a_object_owner varchar2) return ut_varchar2_rows is l_rows sys_refcursor; l_ut_owner varchar2(250) := ut_utils.ut_owner; @@ -356,66 +420,46 @@ create or replace package body ut_suite_manager is return l_result; end; - 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_path varchar2( 4000 ); - l_result sys_refcursor; - l_ut_owner varchar2(250) := ut_utils.ut_owner; - l_sql varchar2(32767); - l_suite_item_name varchar2(20); - l_tags ut_varchar2_rows := coalesce(a_tags,ut_varchar2_rows()); + function get_object_names_sql(a_skip_all_objects boolean ) return varchar2 is begin - if a_path is null and a_object_name is not null then - execute immediate 'select min(path) - from '||l_ut_owner||q'[.ut_suite_cache - where object_owner = :a_object_owner - and object_name = :a_object_name - and name = nvl(:a_procedure_name, name)]' - into l_path using upper(a_object_owner), upper(a_object_name), upper(a_procedure_name); - else - l_path := lower( a_path ); - end if; - l_suite_item_name := case when l_tags.count > 0 then 'suite_items_tags' else 'suite_items' end; - - l_sql := - q'[with - suite_items as ( - select /*+ cardinality(c 100) */ c.* - from ]'||l_ut_owner||q'[.ut_suite_cache c - where 1 = 1 ]'||case when not a_skip_all_objects then q'[ + return case when not a_skip_all_objects then q'[ and exists ( select 1 from all_objects a where a.object_name = c.object_name - and a.owner = ']'||upper(a_object_owner)||q'[' + and a.owner = '{:object_owner:}' and a.owner = c.object_owner and a.object_type = 'PACKAGE' - )]' end ||q'[ - and c.object_owner = ']'||upper(a_object_owner)||q'[' - and ( ]' || case when l_path is not null then q'[ + )]' else null end; + end; + + function get_path_sql(a_path in varchar2) return varchar2 is + begin + 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 - || case when a_object_name is not null - then 'and c.object_name = :a_object_name ' - else 'and :a_object_name is null' end ||' - '|| case when a_procedure_name is not null - then 'and c.name = :a_procedure_name' - else 'and :a_procedure_name is null' end ||q'[ - ) - ) - ),]' - ||case when l_tags.count > 0 then - q'[ - filter_tags as ( + 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 + 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 + 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 + return case when a_tags_count > 0 then + q'[filter_tags as ( select c.* from suite_items c where c.tags multiset intersect :a_tag_list is not empty @@ -426,60 +470,15 @@ create or replace package body ut_suite_manager is t.path||'.' like c.path || '.%' /*all children and self*/ or c.path||'.' like t.path || '.%' --all parents ) - ),]' + )]' else - q'[dummy as (select 'x' from dual where :a_tag_list is null ),]' - end|| - q'[ suitepaths as ( - select distinct substr(path,1,instr(path,'.',-1)-1) as suitepath, - path, - object_owner - from ]'||l_suite_item_name||q'[ - where 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 ]'||l_ut_owner||q'[.ut_executables) as x, - cast(null as ]'||l_ut_owner||q'[.ut_integer_list) as y, - cast(null as ]'||l_ut_owner||q'[.ut_executable_test) as z - from suitepath_part p - where p.path - not in (select s.path from suitepaths s) - ), - logical_suites as ( - select to_number(null) as id, s.self_type, s.path, s.object_owner, s.object_name, - s.object_name as name, null as line_no, null as parse_time, - null as description, null as rollback_type, 0 as disabled_flag, - ]'||l_ut_owner||q'[.ut_varchar2_rows() as warnings, - s.x as before_all_list, s.x as after_all_list, - s.x as before_each_list, s.x as before_test_list, - s.x as after_each_list, s.x as after_test_list, - s.y as expected_error_codes, null as test_tags, - s.z as item - from logical_suite_data s - ), - items as ( - select * from ]'||l_suite_item_name||q'[ - union all - select * from logical_suites - ) - select c.* - from items c - order by c.object_owner,]'|| - case + 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 + return case when a_random_seed is null then q'[ replace( case @@ -492,10 +491,51 @@ create or replace package body ut_suite_manager is c.line_no, :a_random_seed]' else - l_ut_owner||'.ut_annotation_manager.hash_suite_path( + ' {:owner:}.ut_annotation_manager.hash_suite_path( c.path, :a_random_seed ) desc nulls last' - end; + end; + end; + + 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_path varchar2( 4000 ); + l_result sys_refcursor; + l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_sql varchar2(32767); + l_suite_item_name varchar2(20); + l_tags ut_varchar2_rows := coalesce(a_tags,ut_varchar2_rows()); + begin + if a_path is null and a_object_name is not null then + execute immediate 'select min(path) + from '||l_ut_owner||q'[.ut_suite_cache + where object_owner = :a_object_owner + and object_name = :a_object_name + and name = nvl(:a_procedure_name, name)]' + into l_path using upper(a_object_owner), upper(a_object_name), upper(a_procedure_name); + else + l_path := lower( a_path ); + end if; + l_suite_item_name := case when l_tags.count > 0 then 'suite_items_tags' else 'suite_items' end; + + l_sql := gc_get_cache_suite_sql; + l_sql := replace(l_sql,'{:suite_item_name:}',l_suite_item_name); + l_sql := replace(l_sql,'{:object_list:}',get_object_names_sql(a_skip_all_objects)); + l_sql := replace(l_sql,'{:object_owner:}',upper(a_object_owner)); + l_sql := replace(l_sql,'{:path:}',get_path_sql(l_path)); + l_sql := replace(l_sql,'{:object_name:}',get_object_name_sql(a_object_name)); + l_sql := replace(l_sql,'{:procedure_name:}',get_procedure_name_sql(a_procedure_name)); + l_sql := replace(l_sql,'{:tags:}',get_tags_sql(l_tags.count)); + l_sql := replace(l_sql,'{:random_seed:}',get_random_seed_sql(a_random_seed)); + l_sql := replace(l_sql,'{:owner:}',l_ut_owner); + open l_result for l_sql using l_path, l_path, upper(a_object_name), upper(a_procedure_name), l_tags, a_random_seed; return l_result; end; From 541809e1e8bc777d53f8f6da5ec326c2c9c28150 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Tue, 30 Apr 2019 07:28:08 +0000 Subject: [PATCH 115/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index be39b208a..238d6e107 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 451fe512f..d7f008926 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 38df1fcd1..e8c5429a1 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 441b1d8ab..2a2b7500f 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 9875ef64e..e1e26d917 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index df0c392f1..5e2344ff6 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 9ec377237..80ca1e4ce 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index dcf74b8e6..a8e636e68 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index aa1bbbb77..f0aaa734e 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index bf9ae74ce..653328d7a 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 51ea26ca7..dd8cfdc5f 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 3da8dee25..abfa1162e 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 416ee5116..566d1486a 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 39dfabceb..d84815235 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index bda4a3583..f969cb360 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index df11ae6de..87fd799d8 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 962e57f96..80d837720 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2904--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 9cd49c4a0..6cf4299ec 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2904-develop + * secion v3.1.7.2905-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 94b9f3f68..a132fb9fc 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2904-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2905-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 8ceb774121d5e69eab9b31c4b6dd7a22f45aed2d Mon Sep 17 00:00:00 2001 From: lwasylow Date: Wed, 8 May 2019 13:43:12 +0100 Subject: [PATCH 116/181] Fix to issue when column was removed from the middle of cursor using a exclude or include. this left a gap in orders and cause an columns mismatch on position for remainder of columns. --- .../data_values/ut_cursor_details.tpb | 18 ++++++++++++++++++ .../expectations/test_expectations_cursor.pkb | 11 +++++++++++ .../expectations/test_expectations_cursor.pks | 3 +++ 3 files changed, 32 insertions(+) diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index 9f1f08d67..d7141cbcb 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -160,6 +160,8 @@ create or replace type body ut_cursor_details as member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options) is l_result ut_cursor_details := self; + l_column_tab ut_cursor_column_tab := ut_cursor_column_tab(); + l_column ut_cursor_column; c_xpath_extract_reg constant varchar2(50) := '^((/ROW/)|^(//)|^(/\*/))?(.*)'; begin if l_result.cursor_columns_info is not null then @@ -194,6 +196,22 @@ create or replace type body ut_cursor_details as select 1 from excluded_columns f where regexp_like( '/'||x.access_path, '^/?'||f.col_names||'($|/.*)' ) ); end if; + + --Rewrite column order after columns been excluded + for i in ( + select parent_name, access_path, display_path, has_nested_col, + transformed_name, hierarchy_level, + row_number() over (partition by parent_name,transformed_name order by column_position) 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) loop + l_column := i.col_info; + l_column.column_position := i.new_position; + l_column_tab.extend; + l_column_tab(l_column_tab.last) := l_column; + end loop; + + l_result.cursor_columns_info := l_column_tab; self := l_result; end if; end; diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index a6e87a892..87db24dff 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2831,5 +2831,16 @@ Check the query and data for errors.'; $end end; + procedure uc_columns_exclude is + v_actual SYS_REFCURSOR; + v_expected SYS_REFCURSOR; + begin + open v_expected for + select to_Char(null) id, 'ok' name from dual; + open v_actual for + select 'ok' name, to_number(null) id from dual; + + ut3.ut.expect(v_actual).to_equal(v_expected).exclude('ID'); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; / diff --git a/test/ut3_user/expectations/test_expectations_cursor.pks b/test/ut3_user/expectations/test_expectations_cursor.pks index 222717c07..483968301 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pks +++ b/test/ut3_user/expectations/test_expectations_cursor.pks @@ -459,5 +459,8 @@ create or replace package test_expectations_cursor is type t_num_tab is table of t_num_rec index by binary_integer; + --%test( Mixed column order exclusion ) + procedure uc_columns_exclude; + end; / From f248f8807c0775fa5e8fcd076809d333927adfd3 Mon Sep 17 00:00:00 2001 From: LUKASZ104 Date: Wed, 8 May 2019 13:54:50 +0100 Subject: [PATCH 117/181] Fix typo --- test/ut3_user/expectations/test_expectations_cursor.pkb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/ut3_user/expectations/test_expectations_cursor.pkb b/test/ut3_user/expectations/test_expectations_cursor.pkb index 87db24dff..daa3389bc 100644 --- a/test/ut3_user/expectations/test_expectations_cursor.pkb +++ b/test/ut3_user/expectations/test_expectations_cursor.pkb @@ -2842,5 +2842,6 @@ Check the query and data for errors.'; ut3.ut.expect(v_actual).to_equal(v_expected).exclude('ID'); ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; end; / From 367958dbd703598e2cb5d8ff370e23b9e4d7c223 Mon Sep 17 00:00:00 2001 From: LUKASZ104 Date: Wed, 8 May 2019 15:06:50 +0100 Subject: [PATCH 118/181] Make sure that order of the columns is kept when rewriting an order and nothing was removed. --- source/expectations/data_values/ut_cursor_details.tpb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index d7141cbcb..a5a7e7699 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -204,7 +204,9 @@ create or replace type body ut_cursor_details as row_number() over (partition by parent_name,transformed_name order by column_position) 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) loop + from table(l_result.cursor_columns_info) x + order by x.column_position asc + ) loop l_column := i.col_info; l_column.column_position := i.new_position; l_column_tab.extend; From 525da0238d616a80c5043825bfa1a1e233742ee3 Mon Sep 17 00:00:00 2001 From: LUKASZ104 Date: Wed, 8 May 2019 15:08:04 +0100 Subject: [PATCH 119/181] Partition should not be across column name but a full table set. --- source/expectations/data_values/ut_cursor_details.tpb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index a5a7e7699..021a374f9 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -201,7 +201,7 @@ create or replace type body ut_cursor_details as for i in ( select parent_name, access_path, display_path, has_nested_col, transformed_name, hierarchy_level, - row_number() over (partition by parent_name,transformed_name order by column_position) as new_position, xml_valid_name, + row_number() over (order by column_position) 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 From e08821164a4b235bd3ab4da2723f45b6cd3d2c93 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Wed, 8 May 2019 17:07:50 +0100 Subject: [PATCH 120/181] Removal of row_number as its excessive we dont partition by any --- source/expectations/data_values/ut_cursor_details.tpb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index 021a374f9..e6e24eea2 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -201,7 +201,7 @@ create or replace type body ut_cursor_details as for i in ( select parent_name, access_path, display_path, has_nested_col, transformed_name, hierarchy_level, - row_number() over (order by column_position) as new_position, xml_valid_name, + 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 From f76670f6f5aee9672f4e44de65849bb04df0a3c5 Mon Sep 17 00:00:00 2001 From: Pazus Date: Fri, 10 May 2019 10:11:17 +0300 Subject: [PATCH 121/181] fix message_id increment --- test/ut3_tester/core/test_output_buffer.pkb | 18 ++++++++++++++++++ test/ut3_tester/core/test_output_buffer.pks | 3 +++ 2 files changed, 21 insertions(+) diff --git a/test/ut3_tester/core/test_output_buffer.pkb b/test/ut3_tester/core/test_output_buffer.pkb index d8157a687..f3a5a337f 100644 --- a/test/ut3_tester/core/test_output_buffer.pkb +++ b/test/ut3_tester/core/test_output_buffer.pkb @@ -46,6 +46,24 @@ create or replace package body test_output_buffer is ut.expect(l_cur).to_be_empty; end; + + procedure test_doesnt_send_multiline_on_null_text is + l_cur sys_refcursor; + l_result integer; + l_buffer ut3.ut_output_buffer_base := ut3.ut_output_table_buffer(); + l_message_id varchar2(255); + l_text varchar2(4000); + begin + ut3_tester_helper.run_helper.delete_buffer(); + --Act + l_buffer.send_lines(ut_varchar2_rows(null)); + l_buffer.send_lines(ut_varchar2_rows('test')); + + select message_id, text into l_message_id, l_text from table(ut3_tester_helper.run_helper.ut_output_buffer_tmp); + ut.expect(l_message_id).to_equal('1'); + ut.expect(l_text).to_equal('test'); + end; + procedure test_send_line is l_result varchar2(4000); c_expected constant varchar2(4000) := lpad('a text',4000,',a text'); diff --git a/test/ut3_tester/core/test_output_buffer.pks b/test/ut3_tester/core/test_output_buffer.pks index 9a4cfa68a..420f09244 100644 --- a/test/ut3_tester/core/test_output_buffer.pks +++ b/test/ut3_tester/core/test_output_buffer.pks @@ -9,6 +9,9 @@ create or replace package test_output_buffer is --%test(Does not send line if null text given) procedure test_doesnt_send_on_null_text; + --%test(Does not send line if null text given for multiline case) + procedure test_doesnt_send_multiline_on_null_text; + --%test(Sends a line into buffer table) procedure test_send_line; From 40c64d6a575e74f25e25771f74727ea17cd9ed10 Mon Sep 17 00:00:00 2001 From: Pazus Date: Fri, 10 May 2019 10:12:47 +0300 Subject: [PATCH 122/181] the fix --- source/core/output_buffers/ut_output_clob_table_buffer.tpb | 2 +- source/core/output_buffers/ut_output_table_buffer.tpb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/core/output_buffers/ut_output_clob_table_buffer.tpb b/source/core/output_buffers/ut_output_clob_table_buffer.tpb index 7b97c70ca..56873a418 100644 --- a/source/core/output_buffers/ut_output_clob_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_clob_table_buffer.tpb @@ -66,7 +66,7 @@ create or replace type body ut_output_clob_table_buffer is 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; - self.last_message_id := self.last_message_id + a_text_list.count; + self.last_message_id := self.last_message_id + SQL%rowcount; commit; end; diff --git a/source/core/output_buffers/ut_output_table_buffer.tpb b/source/core/output_buffers/ut_output_table_buffer.tpb index 2b29e8ee5..afcbcbc95 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_table_buffer.tpb @@ -75,7 +75,7 @@ create or replace type body ut_output_table_buffer is 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; - self.last_message_id := self.last_message_id + a_text_list.count; + self.last_message_id := self.last_message_id + SQL%rowcount; commit; end; From 8030a09375efe5b2c7cf48a41c29a1fe2ae18309 Mon Sep 17 00:00:00 2001 From: Pazus Date: Fri, 10 May 2019 10:21:34 +0300 Subject: [PATCH 123/181] shorten test name --- test/ut3_tester/core/test_output_buffer.pkb | 2 +- test/ut3_tester/core/test_output_buffer.pks | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ut3_tester/core/test_output_buffer.pkb b/test/ut3_tester/core/test_output_buffer.pkb index f3a5a337f..93062f4a6 100644 --- a/test/ut3_tester/core/test_output_buffer.pkb +++ b/test/ut3_tester/core/test_output_buffer.pkb @@ -47,7 +47,7 @@ create or replace package body test_output_buffer is end; - procedure test_doesnt_send_multiline_on_null_text is + procedure test_doesnt_send_on_null_elem is l_cur sys_refcursor; l_result integer; l_buffer ut3.ut_output_buffer_base := ut3.ut_output_table_buffer(); diff --git a/test/ut3_tester/core/test_output_buffer.pks b/test/ut3_tester/core/test_output_buffer.pks index 420f09244..8f4d5873d 100644 --- a/test/ut3_tester/core/test_output_buffer.pks +++ b/test/ut3_tester/core/test_output_buffer.pks @@ -10,7 +10,7 @@ create or replace package test_output_buffer is procedure test_doesnt_send_on_null_text; --%test(Does not send line if null text given for multiline case) - procedure test_doesnt_send_multiline_on_null_text; + procedure test_doesnt_send_on_null_elem; --%test(Sends a line into buffer table) procedure test_send_line; From 1b1d86ce2dfd10197c4c535d2eae033ce37d43f3 Mon Sep 17 00:00:00 2001 From: Pazus Date: Fri, 10 May 2019 10:37:15 +0300 Subject: [PATCH 124/181] fix type --- test/ut3_tester/core/test_output_buffer.pkb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ut3_tester/core/test_output_buffer.pkb b/test/ut3_tester/core/test_output_buffer.pkb index 93062f4a6..40af7e0b0 100644 --- a/test/ut3_tester/core/test_output_buffer.pkb +++ b/test/ut3_tester/core/test_output_buffer.pkb @@ -56,8 +56,8 @@ create or replace package body test_output_buffer is begin ut3_tester_helper.run_helper.delete_buffer(); --Act - l_buffer.send_lines(ut_varchar2_rows(null)); - l_buffer.send_lines(ut_varchar2_rows('test')); + l_buffer.send_lines(ut3.ut_varchar2_rows(null)); + l_buffer.send_lines(ut3.ut_varchar2_rows('test')); select message_id, text into l_message_id, l_text from table(ut3_tester_helper.run_helper.ut_output_buffer_tmp); ut.expect(l_message_id).to_equal('1'); From 584cfcd56d6a4688062e85266e3f60d3aa9a974a Mon Sep 17 00:00:00 2001 From: Travis CI Date: Fri, 10 May 2019 17:21:58 +0000 Subject: [PATCH 125/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 238d6e107..e2c920dd0 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index d7f008926..63fcdca1b 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index e8c5429a1..0c9f563fc 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 2a2b7500f..a512d04c0 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index e1e26d917..78a321f0c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 5e2344ff6..4981963b3 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 80ca1e4ce..5854b022a 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index a8e636e68..ae5cd1b06 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index f0aaa734e..60ed590ce 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 653328d7a..e0c7cf473 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index dd8cfdc5f..72484f17c 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index abfa1162e..c36c43c61 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 566d1486a..7727b1427 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index d84815235..f6c12192a 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index f969cb360..1bd76e5bd 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 87fd799d8..a8cddf707 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 80d837720..590ba3cbd 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2905--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 6cf4299ec..7efbd6b06 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2905-develop + * secion v3.1.7.2927-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index a132fb9fc..a2bb728e4 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2905-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2927-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From f0c2bd8ae71837788dfc3db7c7e3a72bf3ffbb75 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Fri, 10 May 2019 22:26:22 +0000 Subject: [PATCH 126/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index e2c920dd0..93793346e 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 63fcdca1b..7873d9c19 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 0c9f563fc..152508020 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index a512d04c0..1bbdfcf53 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 78a321f0c..00f088dcc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 4981963b3..a3b3bae67 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 5854b022a..e8f7801e1 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index ae5cd1b06..b04650d53 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 60ed590ce..a10568ddc 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index e0c7cf473..c9f755a61 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 72484f17c..6f8e6ffd6 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index c36c43c61..5254c919b 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 7727b1427..8f4fb6507 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index f6c12192a..e7c84bca1 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 1bd76e5bd..f8757bf5d 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index a8cddf707..470f0af62 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 590ba3cbd..f8d456225 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2927--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 7efbd6b06..d9d4663e4 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2927-develop + * secion v3.1.7.2928-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index a2bb728e4..0add1089a 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2927-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2928-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 4d7bc3d0a212a8b8520611d29fb6590d37081f5d Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 11 May 2019 00:28:42 +0100 Subject: [PATCH 127/181] Fixed issue with missing newlines in cobertura coverage for non-executed packages. Resolves #917 --- .../ut_coverage_cobertura_reporter.tpb | 320 +++++++++--------- test/install_and_run_tests.sh | 15 +- .../test_cov_cobertura_reporter.pkb | 56 +++ .../test_cov_cobertura_reporter.pks | 3 + 4 files changed, 227 insertions(+), 167 deletions(-) diff --git a/source/reporters/ut_coverage_cobertura_reporter.tpb b/source/reporters/ut_coverage_cobertura_reporter.tpb index 18221e3d9..56fd4b524 100644 --- a/source/reporters/ut_coverage_cobertura_reporter.tpb +++ b/source/reporters/ut_coverage_cobertura_reporter.tpb @@ -1,160 +1,160 @@ -create or replace type body ut_coverage_cobertura_reporter is - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - constructor function ut_coverage_cobertura_reporter( - self in out nocopy ut_coverage_cobertura_reporter - ) return self as result is - begin - self.init($$plsql_unit); - return; - end; - - - overriding member procedure after_calling_run(self in out nocopy ut_coverage_cobertura_reporter, a_run in ut_run) as - l_report_lines ut_varchar2_list; - l_coverage_data ut_coverage.t_coverage; - - function get_lines_xml(a_unit_coverage ut_coverage.t_unit_coverage) return clob is - l_file_part varchar2(32767); - l_result clob; - l_line_no binary_integer; - l_pct integer; - begin - dbms_lob.createtemporary(l_result, true); - l_line_no := a_unit_coverage.lines.first; - if l_line_no is null then - for i in 1 .. a_unit_coverage.total_lines loop - ut_utils.append_to_clob(l_result, ''); - end loop; - else - while l_line_no is not null loop - if a_unit_coverage.lines(l_line_no).executions = 0 then - l_file_part := ''||chr(10); - else - l_file_part := ''||chr(10); - end if; - ut_utils.append_to_clob(l_result, l_file_part); - l_line_no := a_unit_coverage.lines.next(l_line_no); - end loop; - end if; - return l_result; - end; - - function get_coverage_xml( - a_coverage_data ut_coverage.t_coverage, - a_run ut_run - ) return ut_varchar2_rows is - l_file_part varchar2(32767); - l_result ut_varchar2_rows := ut_varchar2_rows(); - l_unit ut_coverage.t_full_name; - l_obj_name ut_coverage.t_object_name; - c_coverage_def constant varchar2(200) := ''; - c_file_footer constant varchar2(30) := ''; - c_coverage_footer constant varchar2(30) := ''; - c_sources_footer constant varchar2(30) := ''; - c_packages_footer constant varchar2(30) := ''; - c_package_footer constant varchar2(30) := ''; - c_class_footer constant varchar2(30) := ''; - c_lines_footer constant varchar2(30) := ''; - l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60; - begin - - ut_utils.append_to_list( l_result, ut_utils.get_xml_header(a_run.client_character_set) ); - ut_utils.append_to_list( l_result, c_coverage_def ); - - --write header - ut_utils.append_to_list( - l_result, - '' - ); - - - --Write sources - l_unit := a_coverage_data.objects.first; - ut_utils.append_to_list( l_result, '' ); - - while l_unit is not null loop - ut_utils.append_to_list(l_result, ''||dbms_xmlgen.convert(l_unit)||''); - l_unit := a_coverage_data.objects.next(l_unit); - end loop; - ut_utils.append_to_list(l_result, c_sources_footer); - - --write packages - l_unit := a_coverage_data.objects.first; - ut_utils.append_to_list(l_result, ''); - - while l_unit is not null loop - l_obj_name := a_coverage_data.objects(l_unit).name; - ut_utils.append_to_list( - l_result, - '' - ); - - ut_utils.append_to_list( - l_result, - '' - ); - - ut_utils.append_to_list(l_result, ''); - - ut_utils.append_to_list( l_result, get_lines_xml(a_coverage_data.objects(l_unit)) ); - - ut_utils.append_to_list(l_result, c_lines_footer); - ut_utils.append_to_list(l_result, c_class_footer); - ut_utils.append_to_list(l_result, c_package_footer); - - l_unit := a_coverage_data.objects.next(l_unit); - end loop; - - ut_utils.append_to_list(l_result, c_packages_footer); - ut_utils.append_to_list(l_result, c_coverage_footer); - return l_result; - end; - begin - ut_coverage.coverage_stop(); - - l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options); - - self.print_text_lines( get_coverage_xml( l_coverage_data, a_run ) ); - - (self as ut_reporter_base).after_calling_run(a_run); - end; - - overriding member function get_description return varchar2 as - begin - return 'Generates a Cobertura coverage report providing information on code coverage with line numbers.' || chr(10) || - 'Designed for Jenkins and TFS to report coverage. ' || chr(10) || - 'Cobertura Document Type Definition can be found: http://cobertura.sourceforge.net/xml/coverage-04.dtd.'|| chr(10) || - 'Sample file: https://github.com/leobalter/testing-examples/blob/master/solutions/3/report/cobertura-coverage.xml.'; - end; - -end; -/ +create or replace type body ut_coverage_cobertura_reporter is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + constructor function ut_coverage_cobertura_reporter( + self in out nocopy ut_coverage_cobertura_reporter + ) return self as result is + begin + self.init($$plsql_unit); + return; + end; + + + overriding member procedure after_calling_run(self in out nocopy ut_coverage_cobertura_reporter, a_run in ut_run) as + l_report_lines ut_varchar2_list; + l_coverage_data ut_coverage.t_coverage; + + function get_lines_xml(a_unit_coverage ut_coverage.t_unit_coverage) return clob is + l_file_part varchar2(32767); + l_result clob; + l_line_no binary_integer; + l_pct integer; + begin + dbms_lob.createtemporary(l_result, true); + l_line_no := a_unit_coverage.lines.first; + if l_line_no is null then + for i in 1 .. a_unit_coverage.total_lines loop + ut_utils.append_to_clob(l_result, ''||chr(10)); + end loop; + else + while l_line_no is not null loop + if a_unit_coverage.lines(l_line_no).executions = 0 then + l_file_part := ''||chr(10); + else + l_file_part := ''||chr(10); + end if; + ut_utils.append_to_clob(l_result, l_file_part); + l_line_no := a_unit_coverage.lines.next(l_line_no); + end loop; + end if; + return l_result; + end; + + function get_coverage_xml( + a_coverage_data ut_coverage.t_coverage, + a_run ut_run + ) return ut_varchar2_rows is + l_file_part varchar2(32767); + l_result ut_varchar2_rows := ut_varchar2_rows(); + l_unit ut_coverage.t_full_name; + l_obj_name ut_coverage.t_object_name; + c_coverage_def constant varchar2(200) := ''; + c_file_footer constant varchar2(30) := ''; + c_coverage_footer constant varchar2(30) := ''; + c_sources_footer constant varchar2(30) := ''; + c_packages_footer constant varchar2(30) := ''; + c_package_footer constant varchar2(30) := ''; + c_class_footer constant varchar2(30) := ''; + c_lines_footer constant varchar2(30) := ''; + l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60; + begin + + ut_utils.append_to_list( l_result, ut_utils.get_xml_header(a_run.client_character_set) ); + ut_utils.append_to_list( l_result, c_coverage_def ); + + --write header + ut_utils.append_to_list( + l_result, + '' + ); + + + --Write sources + l_unit := a_coverage_data.objects.first; + ut_utils.append_to_list( l_result, '' ); + + while l_unit is not null loop + ut_utils.append_to_list(l_result, ''||dbms_xmlgen.convert(l_unit)||''); + l_unit := a_coverage_data.objects.next(l_unit); + end loop; + ut_utils.append_to_list(l_result, c_sources_footer); + + --write packages + l_unit := a_coverage_data.objects.first; + ut_utils.append_to_list(l_result, ''); + + while l_unit is not null loop + l_obj_name := a_coverage_data.objects(l_unit).name; + ut_utils.append_to_list( + l_result, + '' + ); + + ut_utils.append_to_list( + l_result, + '' + ); + + ut_utils.append_to_list(l_result, ''); + + ut_utils.append_to_list( l_result, get_lines_xml(a_coverage_data.objects(l_unit)) ); + + ut_utils.append_to_list(l_result, c_lines_footer); + ut_utils.append_to_list(l_result, c_class_footer); + ut_utils.append_to_list(l_result, c_package_footer); + + l_unit := a_coverage_data.objects.next(l_unit); + end loop; + + ut_utils.append_to_list(l_result, c_packages_footer); + ut_utils.append_to_list(l_result, c_coverage_footer); + return l_result; + end; + begin + ut_coverage.coverage_stop(); + + l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options); + + self.print_text_lines( get_coverage_xml( l_coverage_data, a_run ) ); + + (self as ut_reporter_base).after_calling_run(a_run); + end; + + overriding member function get_description return varchar2 as + begin + return 'Generates a Cobertura coverage report providing information on code coverage with line numbers.' || chr(10) || + 'Designed for Jenkins and TFS to report coverage. ' || chr(10) || + 'Cobertura Document Type Definition can be found: http://cobertura.sourceforge.net/xml/coverage-04.dtd.'|| chr(10) || + 'Sample file: https://github.com/leobalter/testing-examples/blob/master/solutions/3/report/cobertura-coverage.xml.'; + end; + +end; +/ diff --git a/test/install_and_run_tests.sh b/test/install_and_run_tests.sh index be7857346..01bd378fb 100755 --- a/test/install_and_run_tests.sh +++ b/test/install_and_run_tests.sh @@ -20,10 +20,11 @@ time utPLSQL-cli/bin/utplsql run ${UT3_TESTER_HELPER}/${UT3_TESTER_HELPER_PASSWO -source_path=source -owner=ut3 \ -p='ut3_tester,ut3$user#' \ -test_path=test -c \ --f=ut_coverage_sonar_reporter -o=coverage.xml \ --f=ut_coverage_html_reporter -o=coverage.html \ --f=ut_coveralls_reporter -o=coverage.json \ --f=ut_sonar_test_reporter -o=test_results.xml \ --f=ut_junit_reporter -o=junit_test_results.xml \ --f=ut_tfs_junit_reporter -o=tfs_test_results.xml \ --f=ut_documentation_reporter -o=test_results.log -s +-f=ut_coverage_sonar_reporter -o=coverage.xml \ +-f=ut_coverage_cobertura_reporter -o=cobertura.xml \ +-f=ut_coverage_html_reporter -o=coverage.html \ +-f=ut_coveralls_reporter -o=coverage.json \ +-f=ut_sonar_test_reporter -o=test_results.xml \ +-f=ut_junit_reporter -o=junit_test_results.xml \ +-f=ut_tfs_junit_reporter -o=tfs_test_results.xml \ +-f=ut_documentation_reporter -o=test_results.log -s diff --git a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb index ecfb66340..b3c0439b4 100644 --- a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb +++ b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb @@ -41,5 +41,61 @@ create or replace package body test_cov_cobertura_reporter is ut.expect(l_actual).to_be_like(l_expected); end; + procedure report_zero_coverage is + l_results ut3.ut_varchar2_list; + l_expected clob; + l_actual clob; + begin + --Arrange + l_expected := + q'[ + + + +ut3.dummy_coverage + + + + + + + + + + + + + + + + + + + + + + + + +]'; + + test_coverage.cleanup_dummy_coverage; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_dummy_coverage', + a_reporter=> ut3.ut_coverage_cobertura_reporter( ), + a_include_objects => ut3.ut_varchar2_list('UT3.DUMMY_COVERAGE') + ) + ); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like(l_expected); + --Cleanup + test_coverage.setup_dummy_coverage; + end; + end; / diff --git a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks index 365815964..0016641d5 100644 --- a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks +++ b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks @@ -6,5 +6,8 @@ create or replace package test_cov_cobertura_reporter is --%test(reports on a project file mapped to database object) procedure report_on_file; + --%test(reports zero coverage on each line of non-executed database object - Issue #917) + procedure report_zero_coverage; + end test_cov_cobertura_reporter; / From 467078f121f2410638fc71ec7b81eed26bf38dd7 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sat, 11 May 2019 12:55:48 +0000 Subject: [PATCH 128/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 93793346e..2ce241de6 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 7873d9c19..8f0c2e69e 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 152508020..4de716069 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 1bbdfcf53..24c747b78 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 00f088dcc..72818c3bd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index a3b3bae67..f2f296755 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index e8f7801e1..e152d015d 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index b04650d53..8899444b8 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index a10568ddc..a28177d34 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index c9f755a61..c5b6d493d 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 6f8e6ffd6..51dbb4e69 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 5254c919b..9803d3ff4 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 8f4fb6507..88d26641a 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index e7c84bca1..674907b78 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index f8757bf5d..31b8ab6c7 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 470f0af62..3645c3efc 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index f8d456225..ed0b8195b 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2928--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index d9d4663e4..92ee0895d 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2928-develop + * secion v3.1.7.2935-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 0add1089a..25487d9c3 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2928-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2935-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From ae982a69e536adb4a522a718eb3f05dee6e419ca Mon Sep 17 00:00:00 2001 From: lwasylow Date: Sat, 11 May 2019 09:32:17 +0100 Subject: [PATCH 129/181] Initial checkin --- source/core/ut_utils.pkb | 15 +++++ source/core/ut_utils.pks | 5 ++ .../data_values/ut_compound_data_helper.pkb | 17 ++++- .../data_values/ut_cursor_details.tpb | 63 +++++++++++++++++-- .../data_values/ut_cursor_details.tps | 13 ++-- .../data_values/ut_data_value_anydata.tpb | 2 + .../data_values/ut_data_value_refcursor.tpb | 16 +++-- .../expectations/test_expectation_anydata.pkb | 39 ++++++------ 8 files changed, 136 insertions(+), 34 deletions(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 7efbd6b06..12739d01b 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -798,5 +798,20 @@ create or replace package body ut_utils is return l_valid_name; end; + function add_prefix(a_list ut_varchar2_list, a_prefix varchar2, a_connector varchar2 := '/') return ut_varchar2_list is + l_result ut_varchar2_list := ut_varchar2_list(); + l_idx binary_integer; + begin + if a_prefix is not null then + l_idx := a_list.first; + while l_idx is not null loop + l_result.extend; + l_result(l_idx) := a_prefix||a_connector||trim(leading a_connector from a_list(l_idx)); + l_idx := a_list.next(l_idx); + end loop; + end if; + return l_result; + end; + end ut_utils; / diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index a2bb728e4..8a751a0d8 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -387,5 +387,10 @@ create or replace package ut_utils authid definer is */ function get_valid_xml_name(a_name varchar2) return varchar2; + /** + * Add prefix word to elements of list + */ + function add_prefix(a_list ut_varchar2_list, a_prefix varchar2, a_connector varchar2 := '/') return ut_varchar2_list; + end ut_utils; / diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index bd259b47d..fa736ecfb 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -335,7 +335,8 @@ create or replace package body ut_compound_data_helper is l_not_equal_stmt clob; l_where_stmt clob; l_ut_owner varchar2(250) := ut_utils.ut_owner; - + l_join_by_list ut_varchar2_list; + function get_join_type(a_inclusion_compare in boolean,a_negated in boolean) return varchar2 is begin return @@ -356,12 +357,22 @@ create or replace package body ut_compound_data_helper is end; begin + /** + * We already estabilished cursor equality so now we add anydata root if we compare anydata + * to join by. + */ + l_join_by_list := + case + 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; + dbms_lob.createtemporary(l_compare_sql, true); --Initiate a SQL template with placeholders ut_utils.append_to_clob(l_compare_sql, g_compare_sql_template); --Generate a pieceso of dynamic SQL that will substitute placeholders gen_sql_pieces_out_of_cursor( - a_other.cursor_details.cursor_columns_info, a_join_by_list, a_unordered, + 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 ); @@ -374,7 +385,7 @@ create or replace package body ut_compound_data_helper is l_compare_sql := replace(l_compare_sql,'{:join_type:}',get_join_type(a_inclusion_type,a_is_negated)); l_compare_sql := replace(l_compare_sql,'{:join_condition:}',l_join_on_stmt); - if l_not_equal_stmt is not null and ((a_join_by_list.count > 0 and not a_is_negated) or (not a_unordered)) then + 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 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 diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index e6e24eea2..d2bd56e14 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -146,13 +146,25 @@ create or replace type body ut_cursor_details as member function get_missing_join_by_columns( a_expected_columns ut_varchar2_list ) return ut_varchar2_list is l_result ut_varchar2_list; + l_prefix varchar2(125); begin + if self.is_anydata = 1 then + l_prefix := get_root; + end if; + --regexp_replace(c.access_path,'^\/?([^\/]+\/){1}') 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.access_path, '^'||fl.column_value||'($|/.*)') + where regexp_like(c.access_path,'^/?'|| + case + when self.is_anydata = 1 then + l_prefix||'/'||trim (leading '/' from fl.column_value) + else + fl.column_value + end||'($|/.*)' + ) ) order by fl.column_value; return l_result; @@ -162,9 +174,14 @@ create or replace type body ut_cursor_details as l_result ut_cursor_details := self; l_column_tab ut_cursor_column_tab := ut_cursor_column_tab(); l_column ut_cursor_column; + l_prefix varchar2(125); c_xpath_extract_reg constant varchar2(50) := '^((/ROW/)|^(//)|^(/\*/))?(.*)'; begin if l_result.cursor_columns_info is not null then + + if self.is_anydata = 1 then + l_prefix := get_root; + end if; --limit columns to those on the include items minus exclude items if a_match_options.include.items.count > 0 then @@ -181,8 +198,16 @@ create or replace type body ut_cursor_details as 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.access_path, '^/?'||f.col_names||'($|/.*)' ) - ); + select 1 from included_columns f where regexp_like(x.access_path,'^/?'|| + case + when self.is_anydata = 1 then + l_prefix||'/'||trim(leading '/' from f.col_names) + else + f.col_names + end||'($|/.*)' + ) + ) + or x.hierarchy_level = case when self.is_anydata = 1 then 1 else 0 end ; end if; elsif a_match_options.exclude.items.count > 0 then with excluded_columns as ( @@ -193,7 +218,13 @@ create or replace type body ut_cursor_details as 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.access_path, '^/?'||f.col_names||'($|/.*)' ) + select 1 from excluded_columns f where regexp_like(x.access_path,'^/?'|| + case + when self.is_anydata = 1 then + l_prefix||'/'||trim(leading '/' from f.col_names) + else + f.col_names + end||'($|/.*)' ) ); end if; @@ -226,8 +257,30 @@ create or replace type body ut_cursor_details as 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; - return l_result; end; + + member procedure has_anydata(self in out nocopy ut_cursor_details, a_is_anydata in boolean :=false) is + begin + self.is_anydata := case when nvl(a_is_anydata,false) then 1 else 0 end; + end; + + member function has_anydata return boolean is + begin + return ut_utils.int_to_boolean(nvl(self.is_anydata,0)); + end; + + member function get_root return varchar2 is + l_root varchar2(250); + begin + if self.cursor_columns_info.count > 0 then + select x.access_path into l_root from table(self.cursor_columns_info) x + where x.hierarchy_level = 1; + else + l_root := null; + end if; + return l_root; + end; + end; / diff --git a/source/expectations/data_values/ut_cursor_details.tps b/source/expectations/data_values/ut_cursor_details.tps index c2aa98066..ce5aefbe7 100644 --- a/source/expectations/data_values/ut_cursor_details.tps +++ b/source/expectations/data_values/ut_cursor_details.tps @@ -16,7 +16,9 @@ create or replace type ut_cursor_details force authid current_user as object ( limitations under the License. */ cursor_columns_info ut_cursor_column_tab, - + + /*if type is anydata we need to skip level 1 on joinby / inlude / exclude as its artificial cursor*/ + is_anydata number(1,0), constructor function ut_cursor_details(self in out nocopy ut_cursor_details) return self as result, constructor function ut_cursor_details( self in out nocopy ut_cursor_details,a_cursor_number in number @@ -29,9 +31,12 @@ create or replace type ut_cursor_details force authid current_user as object ( a_level in integer, a_access_path in varchar2 ), - member function contains_collection return boolean, - member function get_missing_join_by_columns( a_expected_columns ut_varchar2_list ) return ut_varchar2_list, + member function contains_collection return boolean, + member function get_missing_join_by_columns( a_expected_columns ut_varchar2_list ) return ut_varchar2_list, member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options), - member function get_xml_children(a_parent_name varchar2 := null) return xmltype + member function get_xml_children(a_parent_name varchar2 := null) return xmltype, + member procedure has_anydata(self in out nocopy ut_cursor_details, a_is_anydata in boolean := false), + member function has_anydata return boolean, + member function get_root return varchar2 ) / diff --git a/source/expectations/data_values/ut_data_value_anydata.tpb b/source/expectations/data_values/ut_data_value_anydata.tpb index 19917633a..fa59ad67c 100644 --- a/source/expectations/data_values/ut_data_value_anydata.tpb +++ b/source/expectations/data_values/ut_data_value_anydata.tpb @@ -84,6 +84,7 @@ create or replace type body ut_data_value_anydata as self.extract_cursor(l_refcursor); l_cursor_number := dbms_sql.to_cursor_number(l_refcursor); self.cursor_details := ut_cursor_details(l_cursor_number); + self.cursor_details.has_anydata(true); dbms_sql.close_cursor(l_cursor_number); elsif not l_refcursor%isopen then raise cursor_not_open; @@ -139,5 +140,6 @@ create or replace type body ut_data_value_anydata as raise value_error; end if; end; + end; / diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index ee929d097..2aac626e3 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -95,6 +95,7 @@ create or replace type body ut_data_value_refcursor as extract_cursor(l_cursor); l_cursor_number := dbms_sql.to_cursor_number(l_cursor); self.cursor_details := ut_cursor_details(l_cursor_number); + self.cursor_details.has_anydata(false); dbms_sql.close_cursor(l_cursor_number); elsif not l_cursor%isopen then raise cursor_not_open; @@ -250,8 +251,14 @@ create or replace type body ut_data_value_refcursor as if l_diff_row_count > 0 then 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, a_match_options.join_by.items, a_match_options.unordered, - a_match_options.ordered_columns(), self.extract_path + l_diff_id, + case + 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 ); l_message := chr(10) ||'Rows: [ ' || l_diff_row_count ||' differences' @@ -359,17 +366,18 @@ create or replace type body ut_data_value_refcursor as l_other := treat(a_other as ut_data_value_refcursor); l_other.cursor_details.filter_columns( a_match_options ); l_self.cursor_details.filter_columns( a_match_options ); - + if a_match_options.join_by.items.count > 0 then 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; - + if l_result = 0 then 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 l_result := 1; end if; + l_diff_cursor_text := ut_compound_data_helper.gen_compare_sql( l_other, a_match_options.join_by.items, diff --git a/test/ut3_user/expectations/test_expectation_anydata.pkb b/test/ut3_user/expectations/test_expectation_anydata.pkb index dec64d30d..4838aabff 100644 --- a/test/ut3_user/expectations/test_expectation_anydata.pkb +++ b/test/ut3_user/expectations/test_expectation_anydata.pkb @@ -249,7 +249,7 @@ create or replace package body test_expectation_anydata is l_list ut3.ut_varchar2_list; begin --Arrange - l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','/TEST_DUMMY_OBJECT/ID'); + l_list := ut3.ut_varchar2_list('Value','/ID'); g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>3, "name"=>'A',"Value"=>'1') ); --Act @@ -262,7 +262,7 @@ create or replace package body test_expectation_anydata is l_list varchar2(100); begin --Arrange - l_list := 'TEST_DUMMY_OBJECT/Value,TEST_DUMMY_OBJECT/ID'; + l_list := 'Value,ID'; g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>2, "name"=>'A',"Value"=>'1') ); --Act @@ -275,7 +275,7 @@ create or replace package body test_expectation_anydata is l_xpath varchar2(100); begin --Arrange - l_xpath := '//TEST_DUMMY_OBJECT/Value|//TEST_DUMMY_OBJECT/ID'; + l_xpath := '//Value|//ID'; g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>2, "name"=>'A',"Value"=>'1') ); --Act @@ -301,7 +301,7 @@ create or replace package body test_expectation_anydata is l_list ut3.ut_varchar2_list; begin --Arrange - l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','TEST_DUMMY_OBJECT/ID'); + l_list := ut3.ut_varchar2_list('Value','ID'); g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'b',"Value"=>'0') ); --Act @@ -314,7 +314,7 @@ create or replace package body test_expectation_anydata is l_xpath varchar2(100); begin --Arrange - l_xpath := 'TEST_DUMMY_OBJECT/key,TEST_DUMMY_OBJECT/ID'; + l_xpath := 'key,ID'; g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); --Act @@ -327,7 +327,7 @@ create or replace package body test_expectation_anydata is l_xpath varchar2(100); begin --Arrange - l_xpath := '//TEST_DUMMY_OBJECT/key|//TEST_DUMMY_OBJECT/ID'; + l_xpath := '//key|//ID'; g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'0') ); g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); --Act @@ -340,7 +340,7 @@ create or replace package body test_expectation_anydata is l_include varchar2(100); begin --Arrange - l_include := ' BadAttributeName, TEST_DUMMY_OBJECT/ID '; + l_include := ' BadAttributeName, ID '; g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'B',"Value"=>'0') ); g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); --Act @@ -354,8 +354,8 @@ create or replace package body test_expectation_anydata is l_include varchar2(100); begin --Arrange - l_include := 'TEST_DUMMY_OBJECT/key,TEST_DUMMY_OBJECT/ID,TEST_DUMMY_OBJECT/Value'; - l_exclude := '//TEST_DUMMY_OBJECT/key|//TEST_DUMMY_OBJECT/Value'; + l_include := 'key,ID,Value'; + l_exclude := '//key|//Value'; g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'B',"Value"=>'0') ); g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); --Act @@ -371,8 +371,8 @@ create or replace package body test_expectation_anydata is l_actual varchar2(32767); begin --Arrange - l_include := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/key','TEST_DUMMY_OBJECT/ID','TEST_DUMMY_OBJECT/Value'); - l_exclude := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/key','TEST_DUMMY_OBJECT/Value'); + l_include := ut3.ut_varchar2_list('key','ID','Value'); + l_exclude := ut3.ut_varchar2_list('key','Value'); g_test_expected := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'B',"Value"=>'0') ); g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(id=>1, "name"=>'A',"Value"=>'1') ); --Act @@ -548,7 +548,7 @@ Rows: [ 60 differences, showing first 20 ] l_expected ut3_tester_helper.test_dummy_object_list; l_list ut3.ut_varchar2_list; begin - l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','TEST_DUMMY_OBJECT/ID'); + l_list := ut3.ut_varchar2_list('Value','ID'); --Arrange select ut3_tester_helper.test_dummy_object( rownum, 'SomethingsDifferent '||rownum, rownum) bulk collect into l_actual @@ -567,7 +567,7 @@ Rows: [ 60 differences, showing first 20 ] l_expected ut3_tester_helper.test_dummy_object_list; l_list ut3.ut_varchar2_list; begin - l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/Value','TEST_DUMMY_OBJECT/ID'); + l_list := ut3.ut_varchar2_list('Value','ID'); --Arrange select ut3_tester_helper.test_dummy_object( rownum*2, 'Something '||rownum, rownum*2) bulk collect into l_actual @@ -588,7 +588,7 @@ Rows: [ 60 differences, showing first 20 ] l_actual_message varchar2(32767); l_expected_message varchar2(32767); begin - l_list := ut3.ut_varchar2_list('TEST_DUMMY_OBJECT/name'); + l_list := ut3.ut_varchar2_list('name'); --Arrange select ut3_tester_helper.test_dummy_object( rownum, 'SomethingsDifferent '||rownum, rownum) bulk collect into l_actual @@ -602,7 +602,10 @@ Rows: [ 60 differences, showing first 20 ] l_expected_message := q'[%Actual: ut3_tester_helper.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 2 ] %Diff: %Rows: [ 2 differences ] -%All rows are different as the columns are not matching.]'; +%Row No. 1 - Actual: SomethingsDifferent 1 +%Row No. 1 - Expected: Something 1 +%Row No. 2 - Actual: SomethingsDifferent 2 +%Row No. 2 - Expected: Something 2]'; l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); --Assert ut.expect(l_actual_message).to_be_like(l_expected_message); @@ -841,7 +844,7 @@ Rows: [ 60 differences, showing first 20 ] from dual connect by level <=2 order by rownum desc; --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).join_by('TEST_DUMMY_OBJECT/ID'); + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).join_by('ID'); ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; @@ -860,7 +863,7 @@ Rows: [ 60 differences, showing first 20 ] from dual connect by level <=2 order by rownum desc; --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).join_by('TEST_DUMMY_OBJECT/ID'); + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).join_by('ID'); l_expected_message := q'[%Actual: ut3_tester_helper.test_dummy_object_list [ count = 2 ] was expected to equal: ut3_tester_helper.test_dummy_object_list [ count = 2 ] %Diff: %Rows: [ 3 differences ] @@ -928,7 +931,7 @@ Rows: [ 60 differences, showing first 20 ] g_test_actual := anydata.convertObject( ut3_tester_helper.test_dummy_object(1, 'A', '0') ); --Act - ut3.ut.expect(g_test_actual).to_equal(g_test_expected).join_by('TEST_DUMMY_OBJECT/ID'); + ut3.ut.expect(g_test_actual).to_equal(g_test_expected).join_by('ID'); ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); end; From 0af108dc022272ac67f57deebff7a42dba766082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Thu, 23 May 2019 08:58:31 +0100 Subject: [PATCH 130/181] Failure details in sonar test reporter are now CDATA --- source/reporters/ut_sonar_test_reporter.tpb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/source/reporters/ut_sonar_test_reporter.tpb b/source/reporters/ut_sonar_test_reporter.tpb index 1da349d83..01ad0538c 100644 --- a/source/reporters/ut_sonar_test_reporter.tpb +++ b/source/reporters/ut_sonar_test_reporter.tpb @@ -57,12 +57,11 @@ create or replace type body ut_sonar_test_reporter is ut_utils.append_to_list( l_results, ''); elsif a_test.result > ut_utils.gc_success then ut_utils.append_to_list( l_results, ''); + ut_utils.append_to_list( l_results, ''); ut_utils.append_to_list( l_results, ''); end if; ut_utils.append_to_list( l_results, ''); From 02b89bd74524ecebb5705b590b8cdd6496a4ea1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Thu, 23 May 2019 12:59:01 +0100 Subject: [PATCH 131/181] Update ut_junit_reporter.tpb --- source/reporters/ut_junit_reporter.tpb | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/source/reporters/ut_junit_reporter.tpb b/source/reporters/ut_junit_reporter.tpb index bc88aa8af..604bc420a 100644 --- a/source/reporters/ut_junit_reporter.tpb +++ b/source/reporters/ut_junit_reporter.tpb @@ -57,15 +57,11 @@ create or replace type body ut_junit_reporter is ut_utils.append_to_list( l_results, ''); elsif a_test.result > ut_utils.gc_success then ut_utils.append_to_list( l_results, ''); + ut_utils.append_to_list( l_results, c_cddata_tag_start); for i in 1 .. a_test.failed_expectations.count loop - - l_lines := a_test.failed_expectations(i).get_result_lines(); - - for j in 1 .. l_lines.count loop - ut_utils.append_to_list( l_results, dbms_xmlgen.convert(l_lines(j)) ); - end loop; - ut_utils.append_to_list( l_results, dbms_xmlgen.convert(a_test.failed_expectations(i).caller_info) ); + ut_utils.append_to_list( l_results, ut_utils.table_to_clob(a_test.failed_expectations(i).get_result_lines())); end loop; + ut_utils.append_to_list( l_results, c_cddata_tag_end); ut_utils.append_to_list( l_results, ''); end if; -- TODO - decide if we need/want to use the tag too From bee9c22818d48766139f562f7065698fd911bcf4 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Fri, 24 May 2019 00:55:27 +0100 Subject: [PATCH 132/181] Added handling of CDATA in failure messages for XML reporters. --- source/reporters/ut_junit_reporter.tpb | 40 ++++++++++-------- source/reporters/ut_sonar_test_reporter.tpb | 22 ++++++---- source/reporters/ut_tfs_junit_reporter.tpb | 22 ++++++---- test/ut3_user/reporters.pkb | 40 +++++++++++++++++- test/ut3_user/reporters.pks | 4 ++ .../reporters/test_documentation_reporter.pkb | 2 +- .../reporters/test_junit_reporter.pkb | 39 +---------------- .../reporters/test_junit_reporter.pks | 3 -- .../reporters/test_sonar_test_reporter.pkb | 5 +++ .../reporters/test_sonar_test_reporter.pks | 3 ++ .../reporters/test_tfs_junit_reporter.pkb | 42 +------------------ .../reporters/test_tfs_junit_reporter.pks | 3 -- 12 files changed, 105 insertions(+), 120 deletions(-) diff --git a/source/reporters/ut_junit_reporter.tpb b/source/reporters/ut_junit_reporter.tpb index 604bc420a..8b619ccc7 100644 --- a/source/reporters/ut_junit_reporter.tpb +++ b/source/reporters/ut_junit_reporter.tpb @@ -23,8 +23,9 @@ create or replace type body ut_junit_reporter is end; overriding member procedure after_calling_run(self in out nocopy ut_junit_reporter, a_run in ut_run) is - c_cddata_tag_start constant varchar2(30) := ''; + c_cdata_start_tag constant varchar2(30) := ''; + c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>'; l_suite_id integer := 0; 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; @@ -37,7 +38,7 @@ create or replace type body ut_junit_reporter is procedure print_test_elements(a_test ut_test) is l_results ut_varchar2_rows := ut_varchar2_rows(); l_lines ut_varchar2_list; - l_output clob; + l_output clob; begin ut_utils.append_to_list( l_results, @@ -51,26 +52,31 @@ create or replace type body ut_junit_reporter is end if; if a_test.result = ut_utils.gc_error then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cddata_tag_start); + ut_utils.append_to_list( l_results, c_cdata_start_tag); ut_utils.append_to_list( l_results, ut_utils.convert_collection(a_test.get_error_stack_traces()) ); - ut_utils.append_to_list( l_results, c_cddata_tag_end); + ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); elsif a_test.result > ut_utils.gc_success then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cddata_tag_start); + ut_utils.append_to_list( l_results, c_cdata_start_tag); for i in 1 .. a_test.failed_expectations.count loop - ut_utils.append_to_list( l_results, ut_utils.table_to_clob(a_test.failed_expectations(i).get_result_lines())); + l_lines := a_test.failed_expectations(i).get_result_lines(); + for j in 1 .. l_lines.count loop + --Encapsulate nested CDATA in results + ut_utils.append_to_list( l_results, replace( l_lines(j), c_cdata_end_tag, c_cdata_end_tag_wrap ) ); + end loop; + ut_utils.append_to_list( l_results, replace( a_test.failed_expectations(i).caller_info, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); end loop; - ut_utils.append_to_list( l_results, c_cddata_tag_end); + ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); end if; -- TODO - decide if we need/want to use the tag too l_output := a_test.get_serveroutputs(); if l_output is not null then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cddata_tag_start); - ut_utils.append_to_list( l_results, l_output); - ut_utils.append_to_list( l_results, c_cddata_tag_end ); + ut_utils.append_to_list( l_results, c_cdata_start_tag); + ut_utils.append_to_list( l_results, replace( l_output, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); + ut_utils.append_to_list( l_results, c_cdata_end_tag ); ut_utils.append_to_list( l_results, '' ); else ut_utils.append_to_list( l_results, ''); @@ -115,9 +121,9 @@ create or replace type body ut_junit_reporter is l_data := l_suite.get_serveroutputs(); if l_data is not null and l_data != empty_clob() then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cddata_tag_start); - ut_utils.append_to_list( l_results, l_data); - ut_utils.append_to_list( l_results, c_cddata_tag_end); + ut_utils.append_to_list( l_results, c_cdata_start_tag); + ut_utils.append_to_list( l_results, replace( l_data, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); + ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); else ut_utils.append_to_list( l_results, ''); @@ -126,9 +132,9 @@ create or replace type body ut_junit_reporter is l_errors := l_suite.get_error_stack_traces(); if l_errors is not empty then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cddata_tag_start); - ut_utils.append_to_list( l_results, ut_utils.table_to_clob(l_errors)); - ut_utils.append_to_list( l_results, c_cddata_tag_end); + ut_utils.append_to_list( l_results, c_cdata_start_tag); + ut_utils.append_to_list( l_results, replace( ut_utils.table_to_clob(l_errors), c_cdata_end_tag, c_cdata_end_tag_wrap ) ); + ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); else ut_utils.append_to_list( l_results, ''); diff --git a/source/reporters/ut_sonar_test_reporter.tpb b/source/reporters/ut_sonar_test_reporter.tpb index 01ad0538c..de4699058 100644 --- a/source/reporters/ut_sonar_test_reporter.tpb +++ b/source/reporters/ut_sonar_test_reporter.tpb @@ -43,25 +43,33 @@ create or replace type body ut_sonar_test_reporter is end; procedure print_test_results(a_test ut_test) is - l_results ut_varchar2_rows := ut_varchar2_rows(); - l_lines ut_varchar2_list; + c_cdata_start_tag constant varchar2(30) := ''; + c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>'; + l_results ut_varchar2_rows := ut_varchar2_rows(); + l_lines ut_varchar2_list; begin ut_utils.append_to_list( l_results, ''); if a_test.result = ut_utils.gc_disabled then ut_utils.append_to_list( l_results, ''); elsif a_test.result = ut_utils.gc_error then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, ''); + ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); elsif a_test.result > ut_utils.gc_success then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, ''); + ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); end if; ut_utils.append_to_list( l_results, ''); diff --git a/source/reporters/ut_tfs_junit_reporter.tpb b/source/reporters/ut_tfs_junit_reporter.tpb index 5f3770b23..814cb7230 100644 --- a/source/reporters/ut_tfs_junit_reporter.tpb +++ b/source/reporters/ut_tfs_junit_reporter.tpb @@ -28,6 +28,9 @@ create or replace type body ut_tfs_junit_reporter is end; member procedure junit_version_one(self in out nocopy ut_tfs_junit_reporter,a_run in ut_run) is + c_cdata_start_tag constant varchar2(30) := ''; + c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>'; l_suite_id integer := 0; 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; @@ -69,20 +72,23 @@ create or replace type body ut_tfs_junit_reporter is if a_test.result = ut_utils.gc_error then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, ''); + ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); -- Do not count error as failure elsif a_test.result = ut_utils.gc_failure then ut_utils.append_to_list( l_results, ''); + ut_utils.append_to_list( l_results, c_cdata_start_tag); for i in 1 .. a_test.failed_expectations.count loop l_lines := a_test.failed_expectations(i).get_result_lines(); for j in 1 .. l_lines.count loop - ut_utils.append_to_list( l_results, dbms_xmlgen.convert(l_lines(j))); + --Encapsulate nested CDATA in results + ut_utils.append_to_list( l_results, replace( l_lines(j), c_cdata_end_tag, c_cdata_end_tag_wrap ) ); end loop; - ut_utils.append_to_list( l_results, dbms_xmlgen.convert(a_test.failed_expectations(i).caller_info)); + ut_utils.append_to_list( l_results, replace( a_test.failed_expectations(i).caller_info, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); end loop; + ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); end if; @@ -120,9 +126,9 @@ create or replace type body ut_tfs_junit_reporter is l_outputs := l_suite.get_serveroutputs(); if l_outputs is not null and l_outputs != empty_clob() then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, ''); + ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); else ut_utils.append_to_list( l_results, ''); @@ -131,9 +137,9 @@ create or replace type body ut_tfs_junit_reporter is l_errors := l_suite.get_error_stack_traces(); if l_errors is not empty then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, ''); + ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); else ut_utils.append_to_list( l_results, ''); diff --git a/test/ut3_user/reporters.pkb b/test/ut3_user/reporters.pkb index 364566569..213d7eaa6 100644 --- a/test/ut3_user/reporters.pkb +++ b/test/ut3_user/reporters.pkb @@ -110,8 +110,24 @@ as dbms_output.put_line(''); end; -end;]'; - +end;]'; + + execute immediate q'[create or replace package check_fail_escape is + --%suitepath(core) + --%suite(Check JUNIT XML failure is escaped) + + --%test(Fail Miserably) + procedure fail_miserably; + + end;]'; + + execute immediate q'[create or replace package body check_fail_escape is + procedure fail_miserably is + begin + ut3.ut.expect('test').to_equal(''); + end; + end;]'; + end; procedure reporters_setup is @@ -122,6 +138,7 @@ end;]'; procedure drop_test_helper_package is begin execute immediate 'drop package test_reporters'; + execute immediate 'drop package check_fail_escape'; end; procedure reporters_cleanup is @@ -146,5 +163,24 @@ end;]'; ut.expect(l_actual).to_be_like('%'); end; + procedure check_xml_failure_escaped( + a_reporter ut3.ut_output_reporter_base + ) is + l_results ut3.ut_varchar2_list; + l_actual clob; + begin + --Act + select * + bulk collect into l_results + from table( ut3.ut.run( 'check_fail_escape', a_reporter ) ); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like('%' (varchar2)%]' + ||q'[at "UT3$USER#.CHECK_FAIL_ESCAPE.FAIL_MISERABLY", line % ut3.ut.expect('test').to_equal('');]' + ||'%]]>%' + ); + end; + end reporters; / diff --git a/test/ut3_user/reporters.pks b/test/ut3_user/reporters.pks index cb601cf3b..54800fa4a 100644 --- a/test/ut3_user/reporters.pks +++ b/test/ut3_user/reporters.pks @@ -14,5 +14,9 @@ create or replace package reporters is a_client_character_set varchar2 ); + procedure check_xml_failure_escaped( + a_reporter ut3.ut_output_reporter_base + ); + end reporters; / diff --git a/test/ut3_user/reporters/test_documentation_reporter.pkb b/test/ut3_user/reporters/test_documentation_reporter.pkb index 394594fa4..a1f895947 100644 --- a/test/ut3_user/reporters/test_documentation_reporter.pkb +++ b/test/ut3_user/reporters/test_documentation_reporter.pkb @@ -1 +1 @@ -create or replace package body test_documentation_reporter as procedure report_produces_expected_out is l_results ut3.ut_varchar2_list; l_actual clob; l_expected varchar2(32767):=q'[%org utplsql tests helpers A suite for testing different outcomes from reporters A description of some context passing_test [% sec] a test with failing assertion [% sec] (FAILED - 1) a test raising unhandled exception [% sec] (FAILED - 2) a disabled test [0 sec] (DISABLED) % Failures: % 1) failing_test "Fails as values are different" Actual: 'number [1] ' (varchar2) was expected to equal: 'number [2] ' (varchar2)% at "UT3$USER#.TEST_REPORTERS%", line 36 ut3.ut.expect('number [1] ','Fails as values are different').to_equal('number [2] '); % % 2) erroring_test ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at "UT3$USER#.TEST_REPORTERS", line 44% ORA-06512: at line 6 Finished in % seconds 4 tests, 1 failed, 1 errored, 1 disabled, 0 warning(s)%]'; begin select * bulk collect into l_results from table( ut3.ut.run( 'test_reporters', ut3.ut_documentation_reporter() ) ); l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like(l_expected); end; procedure check_encoding_included is begin reporters.check_xml_encoding_included(ut3.ut_sonar_test_reporter(), 'UTF-8'); end; end; / \ No newline at end of file +create or replace package body test_documentation_reporter as procedure report_produces_expected_out is l_results ut3.ut_varchar2_list; l_actual clob; l_expected varchar2(32767):=q'[%org utplsql tests helpers A suite for testing different outcomes from reporters A description of some context passing_test [% sec] a test with failing assertion [% sec] (FAILED - 1) a test raising unhandled exception [% sec] (FAILED - 2) a disabled test [0 sec] (DISABLED) % Failures: % 1) failing_test "Fails as values are different" Actual: 'number [1] ' (varchar2) was expected to equal: 'number [2] ' (varchar2)% at "UT3$USER#.TEST_REPORTERS%", line 36 ut3.ut.expect('number [1] ','Fails as values are different').to_equal('number [2] '); % % 2) erroring_test ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at "UT3$USER#.TEST_REPORTERS", line 44% ORA-06512: at line 6 Finished in % seconds 4 tests, 1 failed, 1 errored, 1 disabled, 0 warning(s)%]'; begin select * bulk collect into l_results from table( ut3.ut.run( 'test_reporters', ut3.ut_documentation_reporter() ) ); l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); ut.expect(l_actual).to_be_like(l_expected); end; end; / \ No newline at end of file diff --git a/test/ut3_user/reporters/test_junit_reporter.pkb b/test/ut3_user/reporters/test_junit_reporter.pkb index b86bb698c..e1b790156 100644 --- a/test/ut3_user/reporters/test_junit_reporter.pkb +++ b/test/ut3_user/reporters/test_junit_reporter.pkb @@ -72,23 +72,6 @@ create or replace package body test_junit_reporter as execute immediate q'[create or replace package body Tst_Fix_Case_Sensitive as procedure bUgFiX is begin ut.expect(1).to_equal(1); end; end;]'; - - execute immediate q'[create or replace package check_fail_escape is - --%suitepath(core) - --%suite(checkfailedescape) - --%displayname(Check JUNIT XML failure is escaped) - - --%test(Fail Miserably) - procedure fail_miserably; - - end;]'; - - execute immediate q'[create or replace package body check_fail_escape is - procedure fail_miserably is - begin - ut3.ut.expect('test').to_equal(''); - end; - end;]'; end; @@ -134,19 +117,6 @@ create or replace package body test_junit_reporter as ut.expect(l_actual).to_be_like('%Actual: 1 (number) was expected to equal: 2 (number)%'); end; - procedure reports_failed_line is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting',ut3.ut_junit_reporter())); - l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%at "%.CHECK_JUNIT_REPORTING%", line %'); - end; - procedure check_classname_suite is l_results ut3.ut_varchar2_list; l_actual clob; @@ -302,13 +272,7 @@ create or replace package body test_junit_reporter as l_results ut3.ut_varchar2_list; l_actual clob; begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_fail_escape',ut3.ut_junit_reporter())); - l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%Actual: 'test' (varchar2) was expected to equal: '<![CDATA[some stuff]]>' (varchar2)%'); + reporters.check_xml_failure_escaped(ut3.ut_junit_reporter()); end; procedure check_classname_is_populated is @@ -345,7 +309,6 @@ create or replace package body test_junit_reporter as execute immediate 'drop package check_junit_rep_suitepath'; execute immediate 'drop package tst_package_junit_nodesc'; execute immediate 'drop package tst_package_junit_nosuite'; - execute immediate 'drop package check_fail_escape'; execute immediate 'drop package Tst_Fix_Case_Sensitive'; end; diff --git a/test/ut3_user/reporters/test_junit_reporter.pks b/test/ut3_user/reporters/test_junit_reporter.pks index 8af2ba430..71443c180 100644 --- a/test/ut3_user/reporters/test_junit_reporter.pks +++ b/test/ut3_user/reporters/test_junit_reporter.pks @@ -15,9 +15,6 @@ create or replace package test_junit_reporter as --%test(Xunit Backward Compatibility - Reports only failed expectations and exceptions) procedure reports_xunit_only_fail_or_err; - --%test(Reports failed line of test) - procedure reports_failed_line; - --%test(Check that classname is returned correct suite) procedure check_classname_suite; diff --git a/test/ut3_user/reporters/test_sonar_test_reporter.pkb b/test/ut3_user/reporters/test_sonar_test_reporter.pkb index 76cec84c8..357eff0a2 100644 --- a/test/ut3_user/reporters/test_sonar_test_reporter.pkb +++ b/test/ut3_user/reporters/test_sonar_test_reporter.pkb @@ -32,5 +32,10 @@ create or replace package body test_sonar_test_reporter as reporters.check_xml_encoding_included(ut3.ut_sonar_test_reporter(), 'UTF-8'); end; + procedure check_failure_escaped is + begin + reporters.check_xml_failure_escaped(ut3.ut_sonar_test_reporter()); + end; + end; / diff --git a/test/ut3_user/reporters/test_sonar_test_reporter.pks b/test/ut3_user/reporters/test_sonar_test_reporter.pks index 0c2fdf70a..ade449dba 100644 --- a/test/ut3_user/reporters/test_sonar_test_reporter.pks +++ b/test/ut3_user/reporters/test_sonar_test_reporter.pks @@ -9,5 +9,8 @@ create or replace package test_sonar_test_reporter as --%test(Includes XML header with encoding when encoding provided) procedure check_encoding_included; + --%test( Validate that fail with special char are escaped ) + procedure check_failure_escaped; + end; / diff --git a/test/ut3_user/reporters/test_tfs_junit_reporter.pkb b/test/ut3_user/reporters/test_tfs_junit_reporter.pkb index 623dda51e..196a2ec08 100644 --- a/test/ut3_user/reporters/test_tfs_junit_reporter.pkb +++ b/test/ut3_user/reporters/test_tfs_junit_reporter.pkb @@ -48,25 +48,7 @@ create or replace package body test_tfs_junit_reporter as null; end; end;]'; - - execute immediate q'[create or replace package check_fail_escape is - --%suitepath(core) - --%suite(checkfailedescape) - --%displayname(Check JUNIT XML failure is escaped) - - --%test(Fail Miserably) - procedure fail_miserably; - - end;]'; - - execute immediate q'[create or replace package body check_fail_escape is - procedure fail_miserably is - begin - ut3.ut.expect('test').to_equal(''); - end; - end;]'; - end; @@ -98,19 +80,6 @@ create or replace package body test_tfs_junit_reporter as ut.expect(l_actual).to_be_like('%Actual: 1 (number) was expected to equal: 2 (number)%'); end; - procedure reports_failed_line is - l_results ut3.ut_varchar2_list; - l_actual clob; - begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_junit_reporting',ut3.ut_tfs_junit_reporter())); - l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%at "%.CHECK_JUNIT_REPORTING%", line %'); - end; - procedure check_classname_suite is l_results ut3.ut_varchar2_list; l_actual clob; @@ -165,16 +134,8 @@ create or replace package body test_tfs_junit_reporter as end; procedure check_failure_escaped is - l_results ut3.ut_varchar2_list; - l_actual clob; begin - --Act - select * - bulk collect into l_results - from table(ut3.ut.run('check_fail_escape',ut3.ut_tfs_junit_reporter())); - l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); - --Assert - ut.expect(l_actual).to_be_like('%Actual: 'test' (varchar2) was expected to equal: '<![CDATA[some stuff]]>' (varchar2)%'); + reporters.check_xml_failure_escaped(ut3.ut_tfs_junit_reporter()); end; procedure check_classname_suitepath is @@ -195,7 +156,6 @@ create or replace package body test_tfs_junit_reporter as execute immediate 'drop package check_junit_reporting'; execute immediate 'drop package check_junit_rep_suitepath'; execute immediate 'drop package check_junit_flat_suitepath'; - execute immediate 'drop package check_fail_escape'; end; procedure check_encoding_included is diff --git a/test/ut3_user/reporters/test_tfs_junit_reporter.pks b/test/ut3_user/reporters/test_tfs_junit_reporter.pks index af6227283..07acb4d21 100644 --- a/test/ut3_user/reporters/test_tfs_junit_reporter.pks +++ b/test/ut3_user/reporters/test_tfs_junit_reporter.pks @@ -12,9 +12,6 @@ create or replace package test_tfs_junit_reporter as --%test(Reports only failed expectations and exceptions) procedure reports_only_failed_or_errored; - --%test(Reports failed line of test) - procedure reports_failed_line; - --%test(Check that classname is returned correct suite) procedure check_classname_suite; From 7106a0e880782e35b85a3cdd7e32bcc91db6205a Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 24 May 2019 08:50:23 +0100 Subject: [PATCH 133/181] Fixing PR comments. --- docs/userguide/advanced_data_comparison.md | 38 +++++++++++++++++++ .../data_values/ut_cursor_details.tpb | 14 +++---- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index f2f296755..646f77ebf 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -126,6 +126,44 @@ end; ``` +Example of `include / exclude` for anydata.convertCollection + +```plsql +create or replace package ut_anydata_inc_exc IS + + --%suite(Anydata) + + --%test(Anydata include and exclude) + procedure ut_anydata_test; + +end ut_anydata_inc_exc; +/ + +create or replace package body ut_anydata_inc_exc IS + + procedure ut_refcursors1 IS + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + begin + --Arrange + select ut3_tester_helper.test_dummy_object( rownum, 'Something Name'||rownum, rownum) + bulk collect into l_actual + from dual connect by level <=2; + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=2 + order by rownum desc; + --Act + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).include('ID'); +ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).exclude('name'); + end; + +end ut_sample_test; +/ +``` + + + Only the columns 'RN', "A_Column" will be compared. Column 'SOME_COL' is excluded. This option can be useful in scenarios where you need to narrow-down the scope of test so that the test is only focused on very specific data. diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index d2bd56e14..99e1d4edc 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -146,10 +146,10 @@ create or replace type body ut_cursor_details as member function get_missing_join_by_columns( a_expected_columns ut_varchar2_list ) return ut_varchar2_list is l_result ut_varchar2_list; - l_prefix varchar2(125); + l_root varchar2(125); begin if self.is_anydata = 1 then - l_prefix := get_root; + l_root := get_root; end if; --regexp_replace(c.access_path,'^\/?([^\/]+\/){1}') select fl.column_value @@ -160,7 +160,7 @@ create or replace type body ut_cursor_details as where regexp_like(c.access_path,'^/?'|| case when self.is_anydata = 1 then - l_prefix||'/'||trim (leading '/' from fl.column_value) + l_root||'/'||trim (leading '/' from fl.column_value) else fl.column_value end||'($|/.*)' @@ -174,13 +174,13 @@ create or replace type body ut_cursor_details as l_result ut_cursor_details := self; l_column_tab ut_cursor_column_tab := ut_cursor_column_tab(); l_column ut_cursor_column; - l_prefix varchar2(125); + l_root varchar2(125); c_xpath_extract_reg constant varchar2(50) := '^((/ROW/)|^(//)|^(/\*/))?(.*)'; begin if l_result.cursor_columns_info is not null then if self.is_anydata = 1 then - l_prefix := get_root; + l_root := get_root; end if; --limit columns to those on the include items minus exclude items @@ -201,7 +201,7 @@ create or replace type body ut_cursor_details as select 1 from included_columns f where regexp_like(x.access_path,'^/?'|| case when self.is_anydata = 1 then - l_prefix||'/'||trim(leading '/' from f.col_names) + l_root||'/'||trim(leading '/' from f.col_names) else f.col_names end||'($|/.*)' @@ -221,7 +221,7 @@ create or replace type body ut_cursor_details as select 1 from excluded_columns f where regexp_like(x.access_path,'^/?'|| case when self.is_anydata = 1 then - l_prefix||'/'||trim(leading '/' from f.col_names) + l_root||'/'||trim(leading '/' from f.col_names) else f.col_names end||'($|/.*)' ) From f66445b7f693668f04568e30773093193763d970 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Fri, 24 May 2019 13:04:30 +0100 Subject: [PATCH 134/181] Update docs with sample --- docs/userguide/advanced_data_comparison.md | 50 ++++++++++++++++++---- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 646f77ebf..6179806e5 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -133,36 +133,70 @@ create or replace package ut_anydata_inc_exc IS --%suite(Anydata) - --%test(Anydata include and exclude) - procedure ut_anydata_test; + --%test(Anydata include) + procedure ut_anydata_test_inc; + + --%test(Anydata exclude) + procedure ut_anydata_test_exc; end ut_anydata_inc_exc; / create or replace package body ut_anydata_inc_exc IS - procedure ut_refcursors1 IS + procedure ut_anydata_test_inc IS + l_actual ut3_tester_helper.test_dummy_object_list; + l_expected ut3_tester_helper.test_dummy_object_list; + begin + --Arrange + select ut3_tester_helper.test_dummy_object( rownum, 'Something Name'||rownum, rownum) + bulk collect into l_actual + from dual connect by level <=2 + order by rownum asc; + select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) + bulk collect into l_expected + from dual connect by level <=2 + order by rownum asc; + --Act + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).include('ID,Value'); + end; + + procedure ut_anydata_test_exc IS l_actual ut3_tester_helper.test_dummy_object_list; l_expected ut3_tester_helper.test_dummy_object_list; begin --Arrange select ut3_tester_helper.test_dummy_object( rownum, 'Something Name'||rownum, rownum) bulk collect into l_actual - from dual connect by level <=2; + from dual connect by level <=2 + order by rownum asc; select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) bulk collect into l_expected from dual connect by level <=2 - order by rownum desc; + order by rownum asc; --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).include('ID'); -ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).exclude('name'); + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).exclude('name'); end; -end ut_sample_test; +end ut_anydata_inc_exc; / + ``` +will result in : + +```sql +Anydata + Anydata include [.07 sec] + Anydata exclude [.058 sec] + +Finished in .131218 seconds +2 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s) +``` + + +Example of exclude Only the columns 'RN', "A_Column" will be compared. Column 'SOME_COL' is excluded. From fbc53254cc239f56742ee627cdf7ea004ee72f05 Mon Sep 17 00:00:00 2001 From: LUKASZ104 Date: Fri, 24 May 2019 14:43:58 +0100 Subject: [PATCH 135/181] TAG: Phase2 Adding a new attribute filterpath that is used for filtering cursor in anydata / refcursor. This value will be different from cursor in anydata as we skip root element. --- source/core/ut_utils.pkb | 1644 +++++++++-------- source/core/ut_utils.pks | 796 ++++---- .../data_values/ut_cursor_column.tpb | 139 +- .../data_values/ut_cursor_column.tps | 103 +- .../data_values/ut_cursor_details.tpb | 543 +++--- .../data_values/ut_cursor_details.tps | 83 +- .../data_values/ut_data_value_anydata.tpb | 288 ++- .../data_values/ut_data_value_refcursor.tpb | 797 ++++---- 8 files changed, 2188 insertions(+), 2205 deletions(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 2e35229e6..5b80e1f59 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -1,817 +1,827 @@ -create or replace package body ut_utils is - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - /** - * Constants regex used to validate XML name - */ - gc_invalid_first_xml_char constant varchar2(50) := '[^_a-zA-Z]'; - gc_invalid_xml_char constant varchar2(50) := '[^_a-zA-Z0-9\.-]'; - 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 - 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 - if a_test_result = gc_success then - l_result := gc_success_char; - elsif a_test_result = gc_failure then - l_result := gc_failure_char; - elsif a_test_result = gc_error then - l_result := gc_error_char; - elsif a_test_result = gc_disabled then - l_result := gc_disabled_char; - else - l_result := 'Unknown(' || coalesce(to_char(a_test_result),'NULL') || ')'; - end if ; - return l_result; - end test_result_to_char; - - - function to_test_result(a_test boolean) return integer is - l_result integer; - begin - if a_test then - l_result := gc_success; - else - l_result := gc_failure; - end if; - return l_result; - end; - - function gen_savepoint_name return varchar2 is - begin - 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 - 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 - 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); - c_length constant integer := coalesce( length( a_value ), 0 ); - c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); - c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; - begin - if c_length = 0 then - l_result := gc_null_string; - elsif c_length <= c_max_input_string_length then - l_result := surround_with(a_value, a_quote_char); - else - l_result := surround_with(substr(a_value, 1, c_overflow_substr_len ), a_quote_char) || gc_more_data_string; - end if ; - 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); - c_length constant integer := coalesce(dbms_lob.getlength(a_value), 0); - c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); - c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; - begin - if a_value is null then - l_result := gc_null_string; - elsif c_length = 0 then - l_result := gc_empty_string; - elsif c_length <= c_max_input_string_length then - l_result := surround_with(a_value,a_quote_char); - else - l_result := surround_with(dbms_lob.substr(a_value, c_overflow_substr_len), a_quote_char) || gc_more_data_string; - end if; - 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); - c_length constant integer := coalesce(dbms_lob.getlength(a_value), 0); - c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); - c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; - begin - if a_value is null then - l_result := gc_null_string; - elsif c_length = 0 then - l_result := gc_empty_string; - elsif c_length <= c_max_input_string_length then - l_result := surround_with(rawtohex(a_value),a_quote_char); - else - l_result := to_string( rawtohex(dbms_lob.substr(a_value, c_overflow_substr_len)) ); - end if ; - return l_result; - end; - - function to_string(a_value boolean) return varchar2 is - begin - 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 - return coalesce(to_char(a_value,gc_number_format), gc_null_string); - end; - - function to_string(a_value date) return varchar2 is - begin - return coalesce(to_char(a_value,gc_date_format), gc_null_string); - end; - - function to_string(a_value timestamp_unconstrained) return varchar2 is - begin - 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 - 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 - return coalesce(to_char(a_value,gc_timestamp_format), gc_null_string); - end; - - function to_string(a_value yminterval_unconstrained) return varchar2 IS - begin - return coalesce(to_char(a_value), gc_null_string); - end; - - function to_string(a_value dsinterval_unconstrained) return varchar2 IS - begin - return coalesce(to_char(a_value), gc_null_string); - end; - - - function boolean_to_int(a_value boolean) return integer is - begin - 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 - 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 - l_offset integer := 1; - l_delimiter_position integer; - l_skip_leading_delimiter boolean := coalesce(a_skip_leading_delimiter = 'Y',false); - l_result ut_varchar2_list := ut_varchar2_list(); - begin - if a_string is null then - return l_result; - end if; - if a_delimiter is null then - return ut_varchar2_list(a_string); - end if; - - loop - l_delimiter_position := instr(a_string, a_delimiter, l_offset); - if not (l_delimiter_position = 1 and l_skip_leading_delimiter) then - l_result.extend; - if l_delimiter_position > 0 then - l_result(l_result.last) := substr(a_string, l_offset, l_delimiter_position - l_offset); - else - l_result(l_result.last) := substr(a_string, l_offset); - end if; - end if; - exit when l_delimiter_position = 0; - l_offset := l_delimiter_position + 1; - end loop; - 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 - l_offset integer := 1; - 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; - l_results ut_varchar2_list := ut_varchar2_list(); - l_has_last_line boolean; - l_skip_leading_delimiter varchar2(1) := 'N'; - begin - while l_offset <= l_length loop - l_amount := a_max_amount - coalesce( length(l_last_line), 0 ); - dbms_lob.read(a_clob, l_amount, l_offset, l_buffer); - l_offset := l_offset + l_amount; - - l_string_results := string_to_table( l_last_line || l_buffer, a_delimiter, l_skip_leading_delimiter ); - for i in 1 .. l_string_results.count loop - --if a split of lines was not done or not at the last line - if l_string_results.count = 1 or i < l_string_results.count then - l_results.extend; - 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 - if l_string_results.count = 1 then - l_has_last_line := false; - l_last_line := null; - elsif l_string_results.count > 1 then - l_has_last_line := true; - l_last_line := l_string_results(l_string_results.count); - end if; - - l_skip_leading_delimiter := 'Y'; - end loop; - if l_has_last_line then - l_results.extend; - l_results(l_results.last) := l_last_line; - end if; - 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; - l_table_rows integer := coalesce(cardinality(a_text_table),0); - begin - for i in 1 .. l_table_rows loop - if i < l_table_rows then - append_to_clob(l_result, a_text_table(i)||a_delimiter); - else - append_to_clob(l_result, a_text_table(i)); - end if; - end loop; - 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; - l_table_rows integer := coalesce(cardinality(a_integer_table),0); - begin - for i in 1 .. l_table_rows loop - if i < l_table_rows then - append_to_clob(l_result, a_integer_table(i)||a_delimiter); - else - append_to_clob(l_result, a_integer_table(i)); - end if; - end loop; - 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 - 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 - if a_include_first_line then - 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 - if a_item is not null then - if a_list is null then - a_list := ut_varchar2_list(); - end if; - a_list.extend; - 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 - if a_items is not null then - if a_list is null then - a_list := ut_varchar2_rows(); - end if; - for i in 1 .. a_items.count loop - a_list.extend; - 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 - 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 - if a_item is not null then - if a_list is null then - a_list := ut_varchar2_rows(); - end if; - 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 - a_list.extend; - 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 - if a_clob_table is not null and cardinality(a_clob_table) > 0 then - if a_src_clob is null then - dbms_lob.createtemporary(a_src_clob, true); - end if; - for i in 1 .. a_clob_table.count loop - dbms_lob.append(a_src_clob,a_clob_table(i)); - if i < a_clob_table.count then - 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 - if a_new_data is not null and dbms_lob.getlength(a_new_data) > 0 then - if a_src_clob is null then - dbms_lob.createtemporary(a_src_clob, true); - end if; - 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 - if a_new_data is not null then - if a_src_clob is null then - dbms_lob.createtemporary(a_src_clob, true); - end if; - 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 - if a_collection is not null then - l_result := ut_varchar2_rows(); - for i in 1 .. a_collection.count loop - l_result.extend(); - l_result(i) := substr(a_collection(i),1,gc_max_storage_varchar2_len); - end loop; - end if; - return l_result; - end; - - procedure set_action(a_text in varchar2) is - begin - dbms_application_info.set_module('utPLSQL', a_text); - end; - - procedure set_client_info(a_text in varchar2) is - begin - dbms_application_info.set_client_info(a_text); - 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 - if a_list is not null then - l_iter := a_list.first; - while l_iter is not null loop - l_item := trim(a_list(l_iter)); - if l_item is not null then - if l_item like '%,%' then - l_xpath := l_xpath || to_xpath( l_item, a_ancestors ) || '|'; - elsif l_item like '/%' then - l_xpath := l_xpath || l_item || '|'; - else - l_xpath := l_xpath || a_ancestors || l_item || '|'; - end if; - end if; - l_iter := a_list.next(l_iter); - end loop; - l_xpath := rtrim(l_xpath,',|'); - end if; - return l_xpath; - end; - - procedure cleanup_temp_tables is - begin - execute immediate 'delete from ut_compound_data_tmp'; - execute immediate 'delete from ut_compound_data_diff_tmp'; - end; - - function to_version(a_version_no varchar2) return t_version is - l_result t_version; - c_version_part_regex constant varchar2(20) := '[0-9]+'; - begin - - if regexp_like(a_version_no,'v?([0-9]+(\.|$)){1,4}') then - l_result.major := regexp_substr(a_version_no, c_version_part_regex, 1, 1); - l_result.minor := regexp_substr(a_version_no, c_version_part_regex, 1, 2); - l_result.bugfix := regexp_substr(a_version_no, c_version_part_regex, 1, 3); - l_result.build := regexp_substr(a_version_no, c_version_part_regex, 1, 4); - else - raise_application_error(gc_invalid_version_no, 'Version string "'||a_version_no||'" is not a valid version'); - end if; - return l_result; - end; - - procedure save_dbms_output_to_cache is - l_status number; - l_line varchar2(32767); - l_offset integer := 0; - l_lines ut_varchar2_rows := ut_varchar2_rows(); - c_lines_limit constant integer := 100; - pragma autonomous_transaction; - - procedure flush_lines(a_lines ut_varchar2_rows, a_offset integer) is - begin - insert into ut_dbms_output_cache (seq_no,text) - select rownum+a_offset, column_value - from table(a_lines); - end; - begin - loop - dbms_output.get_line(line => l_line, status => l_status); - exit when l_status = 1; - l_lines := l_lines multiset union all ut_utils.convert_collection(ut_utils.clob_to_table(l_line||chr(7),4000)); - if l_lines.count > c_lines_limit then - flush_lines(l_lines, l_offset); - l_offset := l_offset + l_lines.count; - l_lines.delete; - end if; - end loop; - flush_lines(l_lines, l_offset); - commit; - end; - - procedure read_cache_to_dbms_output is - l_lines_data sys_refcursor; - l_lines ut_varchar2_rows; - c_lines_limit constant integer := 100; - pragma autonomous_transaction; - begin - open l_lines_data for select text from ut_dbms_output_cache order by seq_no; - loop - fetch l_lines_data bulk collect into l_lines limit c_lines_limit; - for i in 1 .. l_lines.count loop - if substr(l_lines(i),-1) = chr(7) then - dbms_output.put_line(rtrim(l_lines(i),chr(7))); - else - dbms_output.put(l_lines(i)); - end if; - end loop; - exit when l_lines_data%notfound; - end loop; - delete from ut_dbms_output_cache; - commit; - end; - - function ut_owner return varchar2 is - begin - return sys_context('userenv','current_schema'); - end; - - function scale_cardinality(a_cardinality natural) return natural is - begin - return nvl(trunc(power(10,(floor(log(10,a_cardinality))+1))/3),0); - end; - - function build_depreciation_warning(a_old_syntax varchar2, a_new_syntax varchar2) return varchar2 is - begin - 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 - return to_char(a_value, gc_number_format, 'NLS_NUMERIC_CHARACTERS=''. '''); - end; - - function get_xml_header(a_encoding varchar2) return varchar2 is - begin - return - ''; - 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 - if a_list is not null then - l_trimmed_list := ut_varchar2_list(); - l_index := a_list.first; - - while (l_index is not null) loop - l_trimmed_list.extend; - l_trimmed_list(l_trimmed_list.count) := regexp_replace(a_list(l_index), '(^['||a_regexp_to_trim||']*)|(['||a_regexp_to_trim||']*$)'); - l_index := a_list.next(l_index); - end loop; - end if; - - 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 - if a_list is not null then - l_filtered_list := ut_varchar2_list(); - l_index := a_list.first; - - while (l_index is not null) loop - if regexp_like(a_list(l_index), a_regexp_filter) then - l_filtered_list.extend; - l_filtered_list(l_filtered_list.count) := a_list(l_index); - end if; - l_index := a_list.next(l_index); - end loop; - end if; - - 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; - l_ml_comment_start binary_integer := 1; - l_comment_start binary_integer := 1; - l_text_start binary_integer := 1; - l_escaped_text_start binary_integer := 1; - l_escaped_text_end_char varchar2(1 char); - l_end binary_integer := 1; - l_ml_comment clob; - l_newlines_count binary_integer; - l_offset binary_integer := 1; - l_length binary_integer := coalesce(dbms_lob.getlength(a_source), 0); - begin - l_ml_comment_start := instr(a_source,'/*'); - l_comment_start := instr(a_source,'--'); - l_text_start := instr(a_source,''''); - l_escaped_text_start := instr(a_source,q'[q']'); - while l_offset > 0 and l_ml_comment_start > 0 loop - - if l_ml_comment_start > 0 and (l_ml_comment_start < l_comment_start or l_comment_start = 0) - 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 - l_end := instr(a_source,'*/',l_ml_comment_start+2); - append_to_clob(l_result, dbms_lob.substr(a_source, l_ml_comment_start-l_offset, l_offset)); - if l_end > 0 then - l_ml_comment := substr(a_source, l_ml_comment_start, l_end-l_ml_comment_start); - l_newlines_count := length( l_ml_comment ) - length( translate( l_ml_comment, 'a'||chr(10), 'a') ); - if l_newlines_count > 0 then - append_to_clob(l_result, lpad( chr(10), l_newlines_count, chr(10) ) ); - end if; - l_end := l_end + 2; - end if; - else - - if l_comment_start > 0 and (l_comment_start < l_ml_comment_start or l_ml_comment_start = 0) - 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 - l_end := instr(a_source,chr(10),l_comment_start+2); - if l_end > 0 then - l_end := l_end + 1; - end if; - elsif l_text_start > 0 and (l_text_start < l_ml_comment_start or l_ml_comment_start = 0) - 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 - l_end := instr(a_source,q'[']',l_text_start+1); - - --skip double quotes while searching for end of quoted text - 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; - if l_end > 0 then - l_end := l_end + 1; - end if; - - elsif l_escaped_text_start > 0 and (l_escaped_text_start < l_ml_comment_start or l_ml_comment_start = 0) - 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 "]" - l_escaped_text_end_char := translate( substr(a_source, l_escaped_text_start + 2, 1), '[{(<', ']})>'); - l_end := instr(a_source,l_escaped_text_end_char||'''',l_escaped_text_start + 3 ); - if l_end > 0 then - l_end := l_end + 2; - end if; - end if; - - if l_end = 0 then - append_to_clob(l_result, substr(a_source, l_offset, l_length-l_offset)); - else - append_to_clob(l_result, substr(a_source, l_offset, l_end-l_offset)); - end if; - end if; - l_offset := l_end; - if l_offset >= l_ml_comment_start then - l_ml_comment_start := instr(a_source,'/*',l_offset); - end if; - if l_offset >= l_comment_start then - l_comment_start := instr(a_source,'--',l_offset); - end if; - if l_offset >= l_text_start then - l_text_start := instr(a_source,'''',l_offset); - end if; - if l_offset >= l_escaped_text_start then - l_escaped_text_start := instr(a_source,q'[q']',l_offset); - end if; - end loop; - append_to_clob(l_result, substr(a_source, l_end)); - return l_result; - end; - - function get_child_reporters(a_for_reporters ut_reporters_info := null) return ut_reporters_info is - l_for_reporters ut_reporters_info := a_for_reporters; - l_results ut_reporters_info; - begin - if l_for_reporters is null then - l_for_reporters := ut_reporters_info(ut_reporter_info('UT_REPORTER_BASE','N','N','N')); - end if; - - 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; - - 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); - l_ora_search_pattern varchar2(500) := '^ORA'||a_ora_code||': (.*)$'; - begin - l_caller_stack_line := regexp_replace(srcstr => a_error_stack - ,pattern => l_ora_search_pattern - ,replacestr => null - ,position => 1 - ,occurrence => 1 - ,modifier => 'm'); - return l_caller_stack_line; - end; - - /** - * Change string into unicode to match xmlgen format _00_ - * 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.7.2935-develop - */ - function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is - begin - 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 - 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 - if i.level_no = 1 and regexp_like(i.string_char,gc_invalid_first_xml_char) then - l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char); - elsif regexp_like(i.string_char,gc_invalid_xml_char) then - l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char); - else - l_post_processed := l_post_processed || i.string_char; - end if; - end loop; - return l_post_processed; - end; - - function get_valid_xml_name(a_name varchar2) return varchar2 is - l_valid_name varchar2(4000); - begin - if regexp_like(a_name,gc_full_valid_xml_name) then - l_valid_name := a_name; - else - l_valid_name := build_valid_xml_name(a_name); - end if; - return l_valid_name; - end; - - function add_prefix(a_list ut_varchar2_list, a_prefix varchar2, a_connector varchar2 := '/') return ut_varchar2_list is - l_result ut_varchar2_list := ut_varchar2_list(); - l_idx binary_integer; - begin - if a_prefix is not null then - l_idx := a_list.first; - while l_idx is not null loop - l_result.extend; - l_result(l_idx) := a_prefix||a_connector||trim(leading a_connector from a_list(l_idx)); - l_idx := a_list.next(l_idx); - end loop; - end if; - return l_result; - end; - -end ut_utils; -/ +create or replace package body ut_utils is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Constants regex used to validate XML name + */ + gc_invalid_first_xml_char constant varchar2(50) := '[^_a-zA-Z]'; + gc_invalid_xml_char constant varchar2(50) := '[^_a-zA-Z0-9\.-]'; + 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 + 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 + if a_test_result = gc_success then + l_result := gc_success_char; + elsif a_test_result = gc_failure then + l_result := gc_failure_char; + elsif a_test_result = gc_error then + l_result := gc_error_char; + elsif a_test_result = gc_disabled then + l_result := gc_disabled_char; + else + l_result := 'Unknown(' || coalesce(to_char(a_test_result),'NULL') || ')'; + end if ; + return l_result; + end test_result_to_char; + + + function to_test_result(a_test boolean) return integer is + l_result integer; + begin + if a_test then + l_result := gc_success; + else + l_result := gc_failure; + end if; + return l_result; + end; + + function gen_savepoint_name return varchar2 is + begin + 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 + 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 + 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); + c_length constant integer := coalesce( length( a_value ), 0 ); + c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); + c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; + begin + if c_length = 0 then + l_result := gc_null_string; + elsif c_length <= c_max_input_string_length then + l_result := surround_with(a_value, a_quote_char); + else + l_result := surround_with(substr(a_value, 1, c_overflow_substr_len ), a_quote_char) || gc_more_data_string; + end if ; + 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); + c_length constant integer := coalesce(dbms_lob.getlength(a_value), 0); + c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); + c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; + begin + if a_value is null then + l_result := gc_null_string; + elsif c_length = 0 then + l_result := gc_empty_string; + elsif c_length <= c_max_input_string_length then + l_result := surround_with(a_value,a_quote_char); + else + l_result := surround_with(dbms_lob.substr(a_value, c_overflow_substr_len), a_quote_char) || gc_more_data_string; + end if; + 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); + c_length constant integer := coalesce(dbms_lob.getlength(a_value), 0); + c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); + c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; + begin + if a_value is null then + l_result := gc_null_string; + elsif c_length = 0 then + l_result := gc_empty_string; + elsif c_length <= c_max_input_string_length then + l_result := surround_with(rawtohex(a_value),a_quote_char); + else + l_result := to_string( rawtohex(dbms_lob.substr(a_value, c_overflow_substr_len)) ); + end if ; + return l_result; + end; + + function to_string(a_value boolean) return varchar2 is + begin + 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 + return coalesce(to_char(a_value,gc_number_format), gc_null_string); + end; + + function to_string(a_value date) return varchar2 is + begin + return coalesce(to_char(a_value,gc_date_format), gc_null_string); + end; + + function to_string(a_value timestamp_unconstrained) return varchar2 is + begin + 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 + 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 + return coalesce(to_char(a_value,gc_timestamp_format), gc_null_string); + end; + + function to_string(a_value yminterval_unconstrained) return varchar2 IS + begin + return coalesce(to_char(a_value), gc_null_string); + end; + + function to_string(a_value dsinterval_unconstrained) return varchar2 IS + begin + return coalesce(to_char(a_value), gc_null_string); + end; + + + function boolean_to_int(a_value boolean) return integer is + begin + 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 + 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 + l_offset integer := 1; + l_delimiter_position integer; + l_skip_leading_delimiter boolean := coalesce(a_skip_leading_delimiter = 'Y',false); + l_result ut_varchar2_list := ut_varchar2_list(); + begin + if a_string is null then + return l_result; + end if; + if a_delimiter is null then + return ut_varchar2_list(a_string); + end if; + + loop + l_delimiter_position := instr(a_string, a_delimiter, l_offset); + if not (l_delimiter_position = 1 and l_skip_leading_delimiter) then + l_result.extend; + if l_delimiter_position > 0 then + l_result(l_result.last) := substr(a_string, l_offset, l_delimiter_position - l_offset); + else + l_result(l_result.last) := substr(a_string, l_offset); + end if; + end if; + exit when l_delimiter_position = 0; + l_offset := l_delimiter_position + 1; + end loop; + 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 + l_offset integer := 1; + 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; + l_results ut_varchar2_list := ut_varchar2_list(); + l_has_last_line boolean; + l_skip_leading_delimiter varchar2(1) := 'N'; + begin + while l_offset <= l_length loop + l_amount := a_max_amount - coalesce( length(l_last_line), 0 ); + dbms_lob.read(a_clob, l_amount, l_offset, l_buffer); + l_offset := l_offset + l_amount; + + l_string_results := string_to_table( l_last_line || l_buffer, a_delimiter, l_skip_leading_delimiter ); + for i in 1 .. l_string_results.count loop + --if a split of lines was not done or not at the last line + if l_string_results.count = 1 or i < l_string_results.count then + l_results.extend; + 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 + if l_string_results.count = 1 then + l_has_last_line := false; + l_last_line := null; + elsif l_string_results.count > 1 then + l_has_last_line := true; + l_last_line := l_string_results(l_string_results.count); + end if; + + l_skip_leading_delimiter := 'Y'; + end loop; + if l_has_last_line then + l_results.extend; + l_results(l_results.last) := l_last_line; + end if; + 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; + l_table_rows integer := coalesce(cardinality(a_text_table),0); + begin + for i in 1 .. l_table_rows loop + if i < l_table_rows then + append_to_clob(l_result, a_text_table(i)||a_delimiter); + else + append_to_clob(l_result, a_text_table(i)); + end if; + end loop; + 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; + l_table_rows integer := coalesce(cardinality(a_integer_table),0); + begin + for i in 1 .. l_table_rows loop + if i < l_table_rows then + append_to_clob(l_result, a_integer_table(i)||a_delimiter); + else + append_to_clob(l_result, a_integer_table(i)); + end if; + end loop; + 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 + 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 + if a_include_first_line then + 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 + if a_item is not null then + if a_list is null then + a_list := ut_varchar2_list(); + end if; + a_list.extend; + 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 + if a_items is not null then + if a_list is null then + a_list := ut_varchar2_rows(); + end if; + for i in 1 .. a_items.count loop + a_list.extend; + 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 + 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 + if a_item is not null then + if a_list is null then + a_list := ut_varchar2_rows(); + end if; + 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 + a_list.extend; + 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 + if a_clob_table is not null and cardinality(a_clob_table) > 0 then + if a_src_clob is null then + dbms_lob.createtemporary(a_src_clob, true); + end if; + for i in 1 .. a_clob_table.count loop + dbms_lob.append(a_src_clob,a_clob_table(i)); + if i < a_clob_table.count then + 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 + if a_new_data is not null and dbms_lob.getlength(a_new_data) > 0 then + if a_src_clob is null then + dbms_lob.createtemporary(a_src_clob, true); + end if; + 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 + if a_new_data is not null then + if a_src_clob is null then + dbms_lob.createtemporary(a_src_clob, true); + end if; + 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 + if a_collection is not null then + l_result := ut_varchar2_rows(); + for i in 1 .. a_collection.count loop + l_result.extend(); + l_result(i) := substr(a_collection(i),1,gc_max_storage_varchar2_len); + end loop; + end if; + return l_result; + end; + + procedure set_action(a_text in varchar2) is + begin + dbms_application_info.set_module('utPLSQL', a_text); + end; + + procedure set_client_info(a_text in varchar2) is + begin + dbms_application_info.set_client_info(a_text); + 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 + if a_list is not null then + l_iter := a_list.first; + while l_iter is not null loop + l_item := trim(a_list(l_iter)); + if l_item is not null then + if l_item like '%,%' then + l_xpath := l_xpath || to_xpath( l_item, a_ancestors ) || '|'; + elsif l_item like '/%' then + l_xpath := l_xpath || l_item || '|'; + else + l_xpath := l_xpath || a_ancestors || l_item || '|'; + end if; + end if; + l_iter := a_list.next(l_iter); + end loop; + l_xpath := rtrim(l_xpath,',|'); + end if; + return l_xpath; + end; + + procedure cleanup_temp_tables is + begin + execute immediate 'delete from ut_compound_data_tmp'; + execute immediate 'delete from ut_compound_data_diff_tmp'; + end; + + function to_version(a_version_no varchar2) return t_version is + l_result t_version; + c_version_part_regex constant varchar2(20) := '[0-9]+'; + begin + + if regexp_like(a_version_no,'v?([0-9]+(\.|$)){1,4}') then + l_result.major := regexp_substr(a_version_no, c_version_part_regex, 1, 1); + l_result.minor := regexp_substr(a_version_no, c_version_part_regex, 1, 2); + l_result.bugfix := regexp_substr(a_version_no, c_version_part_regex, 1, 3); + l_result.build := regexp_substr(a_version_no, c_version_part_regex, 1, 4); + else + raise_application_error(gc_invalid_version_no, 'Version string "'||a_version_no||'" is not a valid version'); + end if; + return l_result; + end; + + procedure save_dbms_output_to_cache is + l_status number; + l_line varchar2(32767); + l_offset integer := 0; + l_lines ut_varchar2_rows := ut_varchar2_rows(); + c_lines_limit constant integer := 100; + pragma autonomous_transaction; + + procedure flush_lines(a_lines ut_varchar2_rows, a_offset integer) is + begin + insert into ut_dbms_output_cache (seq_no,text) + select rownum+a_offset, column_value + from table(a_lines); + end; + begin + loop + dbms_output.get_line(line => l_line, status => l_status); + exit when l_status = 1; + l_lines := l_lines multiset union all ut_utils.convert_collection(ut_utils.clob_to_table(l_line||chr(7),4000)); + if l_lines.count > c_lines_limit then + flush_lines(l_lines, l_offset); + l_offset := l_offset + l_lines.count; + l_lines.delete; + end if; + end loop; + flush_lines(l_lines, l_offset); + commit; + end; + + procedure read_cache_to_dbms_output is + l_lines_data sys_refcursor; + l_lines ut_varchar2_rows; + c_lines_limit constant integer := 100; + pragma autonomous_transaction; + begin + open l_lines_data for select text from ut_dbms_output_cache order by seq_no; + loop + fetch l_lines_data bulk collect into l_lines limit c_lines_limit; + for i in 1 .. l_lines.count loop + if substr(l_lines(i),-1) = chr(7) then + dbms_output.put_line(rtrim(l_lines(i),chr(7))); + else + dbms_output.put(l_lines(i)); + end if; + end loop; + exit when l_lines_data%notfound; + end loop; + delete from ut_dbms_output_cache; + commit; + end; + + function ut_owner return varchar2 is + begin + return sys_context('userenv','current_schema'); + end; + + function scale_cardinality(a_cardinality natural) return natural is + begin + return nvl(trunc(power(10,(floor(log(10,a_cardinality))+1))/3),0); + end; + + function build_depreciation_warning(a_old_syntax varchar2, a_new_syntax varchar2) return varchar2 is + begin + 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 + return to_char(a_value, gc_number_format, 'NLS_NUMERIC_CHARACTERS=''. '''); + end; + + function get_xml_header(a_encoding varchar2) return varchar2 is + begin + return + ''; + 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 + if a_list is not null then + l_trimmed_list := ut_varchar2_list(); + l_index := a_list.first; + + while (l_index is not null) loop + l_trimmed_list.extend; + l_trimmed_list(l_trimmed_list.count) := regexp_replace(a_list(l_index), '(^['||a_regexp_to_trim||']*)|(['||a_regexp_to_trim||']*$)'); + l_index := a_list.next(l_index); + end loop; + end if; + + 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 + if a_list is not null then + l_filtered_list := ut_varchar2_list(); + l_index := a_list.first; + + while (l_index is not null) loop + if regexp_like(a_list(l_index), a_regexp_filter) then + l_filtered_list.extend; + l_filtered_list(l_filtered_list.count) := a_list(l_index); + end if; + l_index := a_list.next(l_index); + end loop; + end if; + + 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; + l_ml_comment_start binary_integer := 1; + l_comment_start binary_integer := 1; + l_text_start binary_integer := 1; + l_escaped_text_start binary_integer := 1; + l_escaped_text_end_char varchar2(1 char); + l_end binary_integer := 1; + l_ml_comment clob; + l_newlines_count binary_integer; + l_offset binary_integer := 1; + l_length binary_integer := coalesce(dbms_lob.getlength(a_source), 0); + begin + l_ml_comment_start := instr(a_source,'/*'); + l_comment_start := instr(a_source,'--'); + l_text_start := instr(a_source,''''); + l_escaped_text_start := instr(a_source,q'[q']'); + while l_offset > 0 and l_ml_comment_start > 0 loop + + if l_ml_comment_start > 0 and (l_ml_comment_start < l_comment_start or l_comment_start = 0) + 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 + l_end := instr(a_source,'*/',l_ml_comment_start+2); + append_to_clob(l_result, dbms_lob.substr(a_source, l_ml_comment_start-l_offset, l_offset)); + if l_end > 0 then + l_ml_comment := substr(a_source, l_ml_comment_start, l_end-l_ml_comment_start); + l_newlines_count := length( l_ml_comment ) - length( translate( l_ml_comment, 'a'||chr(10), 'a') ); + if l_newlines_count > 0 then + append_to_clob(l_result, lpad( chr(10), l_newlines_count, chr(10) ) ); + end if; + l_end := l_end + 2; + end if; + else + + if l_comment_start > 0 and (l_comment_start < l_ml_comment_start or l_ml_comment_start = 0) + 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 + l_end := instr(a_source,chr(10),l_comment_start+2); + if l_end > 0 then + l_end := l_end + 1; + end if; + elsif l_text_start > 0 and (l_text_start < l_ml_comment_start or l_ml_comment_start = 0) + 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 + l_end := instr(a_source,q'[']',l_text_start+1); + + --skip double quotes while searching for end of quoted text + 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; + if l_end > 0 then + l_end := l_end + 1; + end if; + + elsif l_escaped_text_start > 0 and (l_escaped_text_start < l_ml_comment_start or l_ml_comment_start = 0) + 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 "]" + l_escaped_text_end_char := translate( substr(a_source, l_escaped_text_start + 2, 1), '[{(<', ']})>'); + l_end := instr(a_source,l_escaped_text_end_char||'''',l_escaped_text_start + 3 ); + if l_end > 0 then + l_end := l_end + 2; + end if; + end if; + + if l_end = 0 then + append_to_clob(l_result, substr(a_source, l_offset, l_length-l_offset)); + else + append_to_clob(l_result, substr(a_source, l_offset, l_end-l_offset)); + end if; + end if; + l_offset := l_end; + if l_offset >= l_ml_comment_start then + l_ml_comment_start := instr(a_source,'/*',l_offset); + end if; + if l_offset >= l_comment_start then + l_comment_start := instr(a_source,'--',l_offset); + end if; + if l_offset >= l_text_start then + l_text_start := instr(a_source,'''',l_offset); + end if; + if l_offset >= l_escaped_text_start then + l_escaped_text_start := instr(a_source,q'[q']',l_offset); + end if; + end loop; + append_to_clob(l_result, substr(a_source, l_end)); + return l_result; + end; + + function get_child_reporters(a_for_reporters ut_reporters_info := null) return ut_reporters_info is + l_for_reporters ut_reporters_info := a_for_reporters; + l_results ut_reporters_info; + begin + if l_for_reporters is null then + l_for_reporters := ut_reporters_info(ut_reporter_info('UT_REPORTER_BASE','N','N','N')); + end if; + + 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; + + 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); + l_ora_search_pattern varchar2(500) := '^ORA'||a_ora_code||': (.*)$'; + begin + l_caller_stack_line := regexp_replace(srcstr => a_error_stack + ,pattern => l_ora_search_pattern + ,replacestr => null + ,position => 1 + ,occurrence => 1 + ,modifier => 'm'); + return l_caller_stack_line; + end; + + /** + * Change string into unicode to match xmlgen format _00_ + * 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.7.2935-develop + */ + function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is + begin + 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 + 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 + if i.level_no = 1 and regexp_like(i.string_char,gc_invalid_first_xml_char) then + l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char); + elsif regexp_like(i.string_char,gc_invalid_xml_char) then + l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char); + else + l_post_processed := l_post_processed || i.string_char; + end if; + end loop; + return l_post_processed; + end; + + function get_valid_xml_name(a_name varchar2) return varchar2 is + l_valid_name varchar2(4000); + begin + if regexp_like(a_name,gc_full_valid_xml_name) then + l_valid_name := a_name; + else + l_valid_name := build_valid_xml_name(a_name); + end if; + return l_valid_name; + end; + + function add_prefix(a_list ut_varchar2_list, a_prefix varchar2, a_connector varchar2 := '/') return ut_varchar2_list is + l_result ut_varchar2_list := ut_varchar2_list(); + l_idx binary_integer; + begin + if a_prefix is not null then + l_idx := a_list.first; + while l_idx is not null loop + l_result.extend; + l_result(l_idx) := add_prefix(a_list(l_idx), a_prefix, a_connector); + l_idx := a_list.next(l_idx); + end loop; + end if; + return l_result; + end; + + function add_prefix(a_item varchar2, a_prefix varchar2, a_connector varchar2 := '/') return varchar2 is + begin + 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 + return regexp_replace(a_item,a_prefix||a_connector); + end; + +end ut_utils; +/ diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 3739819fb..03e553ef2 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -1,396 +1,400 @@ -create or replace package ut_utils authid definer is - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - /** - * Common utilities and constants used throughout utPLSQL framework - * - */ - - gc_version constant varchar2(50) := 'v3.1.7.2935-develop'; - - subtype t_executable_type is varchar2(30); - gc_before_all constant t_executable_type := 'beforeall'; - gc_before_each constant t_executable_type := 'beforeeach'; - gc_before_test constant t_executable_type := 'beforetest'; - gc_test_execute constant t_executable_type := 'test'; - gc_after_test constant t_executable_type := 'aftertest'; - gc_after_each constant t_executable_type := 'aftereach'; - gc_after_all constant t_executable_type := 'afterall'; - - /* Constants: Test Results */ - subtype t_test_result is binary_integer range 0 .. 3; - gc_disabled constant t_test_result := 0; -- test/suite was disabled - gc_success constant t_test_result := 1; -- test passed - gc_failure constant t_test_result := 2; -- one or more expectations failed - gc_error constant t_test_result := 3; -- exception was raised - - gc_disabled_char constant varchar2(8) := 'Disabled'; -- test/suite was disabled - gc_success_char constant varchar2(7) := 'Success'; -- test passed - gc_failure_char constant varchar2(7) := 'Failure'; -- one or more expectations failed - gc_error_char constant varchar2(5) := 'Error'; -- exception was raised - - /* - Constants: Rollback type for ut_test_object - */ - subtype t_rollback_type is binary_integer range 0 .. 1; - gc_rollback_auto constant t_rollback_type := 0; -- rollback after each test and suite - gc_rollback_manual constant t_rollback_type := 1; -- leave transaction control manual - gc_rollback_default constant t_rollback_type := gc_rollback_auto; - - ex_unsupported_rollback_type exception; - gc_unsupported_rollback_type constant pls_integer := -20200; - pragma exception_init(ex_unsupported_rollback_type, -20200); - - ex_path_list_is_empty exception; - gc_path_list_is_empty constant pls_integer := -20201; - pragma exception_init(ex_path_list_is_empty, -20201); - - ex_invalid_path_format exception; - gc_invalid_path_format constant pls_integer := -20202; - pragma exception_init(ex_invalid_path_format, -20202); - - ex_suite_package_not_found exception; - gc_suite_package_not_found constant pls_integer := -20204; - pragma exception_init(ex_suite_package_not_found, -20204); - - -- Reporting event time not supported - ex_invalid_rep_event_time exception; - gc_invalid_rep_event_time constant pls_integer := -20210; - pragma exception_init(ex_invalid_rep_event_time, -20210); - - -- Reporting event name not supported - ex_invalid_rep_event_name exception; - gc_invalid_rep_event_name constant pls_integer := -20211; - pragma exception_init(ex_invalid_rep_event_name, -20211); - - -- Any of tests failed - ex_some_tests_failed exception; - gc_some_tests_failed constant pls_integer := -20213; - pragma exception_init(ex_some_tests_failed, -20213); - - -- Version number provided is not in valid format - ex_invalid_version_no exception; - gc_invalid_version_no constant pls_integer := -20214; - pragma exception_init(ex_invalid_version_no, -20214); - - -- Version number provided is not in valid format - ex_out_buffer_timeout exception; - gc_out_buffer_timeout constant pls_integer := -20215; - pragma exception_init(ex_out_buffer_timeout, -20215); - - ex_invalid_package exception; - gc_invalid_package constant pls_integer := -6550; - pragma exception_init(ex_invalid_package, -6550); - - ex_failure_for_all exception; - gc_failure_for_all constant pls_integer := -24381; - pragma exception_init (ex_failure_for_all, -24381); - - ex_dml_for_all exception; - gc_dml_for_all constant pls_integer := -20216; - pragma exception_init (ex_dml_for_all, -20216); - - ex_value_too_large exception; - gc_value_too_large constant pls_integer := -20217; - pragma exception_init (ex_value_too_large, -20217); - - ex_xml_processing exception; - gc_xml_processing constant pls_integer := -19202; - pragma exception_init (ex_xml_processing, -19202); - - ex_failed_open_cur exception; - gc_failed_open_cur constant pls_integer := -20218; - pragma exception_init (ex_failed_open_cur, -20218); - - gc_max_storage_varchar2_len constant integer := 4000; - gc_max_output_string_length constant integer := 4000; - gc_more_data_string constant varchar2(5) := '[...]'; - gc_more_data_string_len constant integer := length( gc_more_data_string ); - gc_number_format constant varchar2(100) := 'TM9'; - gc_date_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ss'; - gc_timestamp_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ssxff'; - gc_timestamp_tz_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ssxff tzh:tzm'; - gc_null_string constant varchar2(4) := 'NULL'; - gc_empty_string constant varchar2(5) := 'EMPTY'; - - gc_bc_fetch_limit constant integer := 1000; - gc_diff_max_rows constant integer := 20; - - type t_version is record( - major natural, - minor natural, - bugfix natural, - build natural - ); - - type t_clob_tab is table of clob; - - /** - * Converts test results into strings - * - * @param a_test_result numeric representation of test result - * - * @return a string representation of a test_result. - */ - function test_result_to_char(a_test_result integer) return varchar2; - - function to_test_result(a_test boolean) return integer; - - /** - * Generates a unique name for a savepoint - * Uses sys_guid, as timestamp gives only miliseconds on Windows and is not unique - * Issue: #506 for details on the implementation approach - */ - function gen_savepoint_name return varchar2; - - procedure debug_log(a_message varchar2); - - procedure debug_log(a_message clob); - - function to_string( - a_value varchar2, - a_quote_char varchar2 := '''', - a_max_output_len in number := gc_max_output_string_length - ) return varchar2; - - function to_string( - a_value clob, - a_quote_char varchar2 := '''', - a_max_output_len in number := gc_max_output_string_length - ) return varchar2; - - function to_string( - a_value blob, - a_quote_char varchar2 := '''', - a_max_output_len in number := gc_max_output_string_length - ) return varchar2; - - function to_string(a_value boolean) return varchar2; - - function to_string(a_value number) return varchar2; - - function to_string(a_value date) return varchar2; - - function to_string(a_value timestamp_unconstrained) return varchar2; - - function to_string(a_value timestamp_tz_unconstrained) return varchar2; - - function to_string(a_value timestamp_ltz_unconstrained) return varchar2; - - function to_string(a_value yminterval_unconstrained) return varchar2; - - function to_string(a_value dsinterval_unconstrained) return varchar2; - - function boolean_to_int(a_value boolean) return integer; - - function int_to_boolean(a_value integer) return boolean; - - /** - * - * Splits a given string into table of string by delimiter. - * The delimiter gets removed. - * If null passed as any of the parameters, empty table is returned. - * If no occurence of a_delimiter found in a_text then text is returned as a single row of the table. - * If no text between delimiters found then an empty row is returned, example: - * string_to_table( 'a,,b', ',' ) gives table ut_varchar2_list( 'a', null, 'b' ); - * - * @param a_string the text to be split. - * @param a_delimiter the delimiter character or string - * @param a_skip_leading_delimiter determines if the leading delimiter should be ignored, used by clob_to_table - * - * @return table of varchar2 values - */ - function string_to_table(a_string varchar2, a_delimiter varchar2:= chr(10), a_skip_leading_delimiter varchar2 := 'N') return ut_varchar2_list; - - /** - * Splits a given string into table of string by delimiter. - * Default value of a_max_amount is 8191 because of code can contains multibyte character. - * The delimiter gets removed. - * If null passed as any of the parameters, empty table is returned. - * If split text is longer than a_max_amount it gets split into pieces of a_max_amount. - * If no text between delimiters found then an empty row is returned, example: - * string_to_table( 'a,,b', ',' ) gives table ut_varchar2_list( 'a', null, 'b' ); - * - * @param a_clob the text to be split. - * @param a_delimiter the delimiter character or string (default chr(10) ) - * @param a_max_amount the maximum length of returned string (default 8191) - * @return table of varchar2 values - */ - function clob_to_table(a_clob clob, a_max_amount integer := 8191, a_delimiter varchar2:= chr(10)) return ut_varchar2_list; - - function table_to_clob(a_text_table ut_varchar2_list, a_delimiter varchar2:= chr(10)) return clob; - - function table_to_clob(a_integer_table ut_integer_list, a_delimiter varchar2:= chr(10)) return clob; - - /** - * Returns time difference in seconds (with miliseconds) between given timestamps - */ - function time_diff(a_start_time timestamp with time zone, a_end_time timestamp with time zone) return number; - - /** - * Returns a text indented with spaces except the first line. - */ - function indent_lines(a_text varchar2, a_indent_size integer := 4, a_include_first_line boolean := false) return varchar2; - - - /** - * Returns a list of object that are part of utPLSQL framework - */ - function get_utplsql_objects_list return ut_object_names; - - /** - * Append a item to the end of ut_varchar2_list - */ - procedure append_to_list(a_list in out nocopy ut_varchar2_list, a_item varchar2); - - /** - * Append a item to the end of ut_varchar2_rows - */ - procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item varchar2); - - /** - * Append a item to the end of ut_varchar2_rows - */ - procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item clob); - - /** - * Append a list of items to the end of ut_varchar2_rows - */ - procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_items ut_varchar2_rows); - - procedure append_to_clob(a_src_clob in out nocopy clob, a_clob_table t_clob_tab, a_delimiter varchar2 := chr(10)); - - procedure append_to_clob(a_src_clob in out nocopy clob, a_new_data clob); - - procedure append_to_clob(a_src_clob in out nocopy clob, a_new_data varchar2); - - function convert_collection(a_collection ut_varchar2_list) return ut_varchar2_rows; - - /** - * Set session's action and module using dbms_application_info - */ - procedure set_action(a_text in varchar2); - - /** - * Set session's client info using dbms_application_info - */ - procedure set_client_info(a_text in varchar2); - - function to_xpath(a_list varchar2, a_ancestors varchar2 := '/*/') return varchar2; - - function to_xpath(a_list ut_varchar2_list, a_ancestors varchar2 := '/*/') return varchar2; - - procedure cleanup_temp_tables; - - /** - * Converts version string into version record - * - * @param a_version_no string representation of version in format vX.X.X.X where X is a positive integer - * @return t_version record with up to four positive numbers containing version - * @throws 20214 if passed version string is not matching version pattern - */ - function to_version(a_version_no varchar2) return t_version; - - - /** - * Saves data from dbms_output buffer into a global temporary table (cache) - * used to store dbms_output buffer captured before the run - * - */ - procedure save_dbms_output_to_cache; - - /** - * Reads data from global temporary table (cache) abd puts it back into dbms_output - * used to recover dbms_output buffer data after a run is complete - * - */ - procedure read_cache_to_dbms_output; - - - /** - * Function is used to reference to utPLSQL owned objects in dynamic sql statements executed from packages with invoker rights - * - * @return the name of the utPSQL schema owner - */ - function ut_owner return varchar2; - - - /** - * Used in dynamic sql select statements to maintain balance between - * number of hard-parses and optimiser accurancy for cardinality of collections - * - * - * @return 3, for inputs of: 1-9; 33 for input of 10 - 99; 333 for (100 - 999) - */ - function scale_cardinality(a_cardinality natural) return natural; - - function build_depreciation_warning(a_old_syntax varchar2, a_new_syntax varchar2) return varchar2; - - /** - * Returns number as string. The value is represented as decimal according to XML standard: - * https://www.w3.org/TR/xmlschema-2/#decimal - */ - function to_xml_number_format(a_value number) return varchar2; - - - /** - * Returns xml header. If a_encoding is not null, header will include encoding attribute with provided value - */ - function get_xml_header(a_encoding varchar2) return varchar2; - - - /** - * Takes a collection of type ut_varchar2_list and it trims the characters passed as arguments for every element - */ - function trim_list_elements(a_list IN ut_varchar2_list, a_regexp_to_trim in varchar2 default '[:space:]') return ut_varchar2_list; - - /** - * Takes a collection of type ut_varchar2_list and it only returns the elements which meets the regular expression - */ - function filter_list(a_list IN ut_varchar2_list, a_regexp_filter in varchar2) return ut_varchar2_list; - - -- Generates XMLGEN escaped string - function xmlgen_escaped_string(a_string in varchar2) return varchar2; - - /** - * Replaces multi-line comments in given source-code with empty lines - */ - function replace_multiline_comments(a_source clob) return clob; - - /** - * Returns list of sub-type reporters for given list of super-type reporters - */ - function get_child_reporters(a_for_reporters ut_reporters_info := null) return ut_reporters_info; - - /** - * Remove given ORA error from stack - */ - function remove_error_from_stack(a_error_stack varchar2, a_ora_code number) return varchar2; - - /** - * Check if xml name is valid if not build a valid name - */ - function get_valid_xml_name(a_name varchar2) return varchar2; - - /** - * Add prefix word to elements of list - */ - function add_prefix(a_list ut_varchar2_list, a_prefix varchar2, a_connector varchar2 := '/') return ut_varchar2_list; - -end ut_utils; -/ +create or replace package ut_utils authid definer is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Common utilities and constants used throughout utPLSQL framework + * + */ + + gc_version constant varchar2(50) := 'v3.1.7.2935-develop'; + + subtype t_executable_type is varchar2(30); + gc_before_all constant t_executable_type := 'beforeall'; + gc_before_each constant t_executable_type := 'beforeeach'; + gc_before_test constant t_executable_type := 'beforetest'; + gc_test_execute constant t_executable_type := 'test'; + gc_after_test constant t_executable_type := 'aftertest'; + gc_after_each constant t_executable_type := 'aftereach'; + gc_after_all constant t_executable_type := 'afterall'; + + /* Constants: Test Results */ + subtype t_test_result is binary_integer range 0 .. 3; + gc_disabled constant t_test_result := 0; -- test/suite was disabled + gc_success constant t_test_result := 1; -- test passed + gc_failure constant t_test_result := 2; -- one or more expectations failed + gc_error constant t_test_result := 3; -- exception was raised + + gc_disabled_char constant varchar2(8) := 'Disabled'; -- test/suite was disabled + gc_success_char constant varchar2(7) := 'Success'; -- test passed + gc_failure_char constant varchar2(7) := 'Failure'; -- one or more expectations failed + gc_error_char constant varchar2(5) := 'Error'; -- exception was raised + + /* + Constants: Rollback type for ut_test_object + */ + subtype t_rollback_type is binary_integer range 0 .. 1; + gc_rollback_auto constant t_rollback_type := 0; -- rollback after each test and suite + gc_rollback_manual constant t_rollback_type := 1; -- leave transaction control manual + gc_rollback_default constant t_rollback_type := gc_rollback_auto; + + ex_unsupported_rollback_type exception; + gc_unsupported_rollback_type constant pls_integer := -20200; + pragma exception_init(ex_unsupported_rollback_type, -20200); + + ex_path_list_is_empty exception; + gc_path_list_is_empty constant pls_integer := -20201; + pragma exception_init(ex_path_list_is_empty, -20201); + + ex_invalid_path_format exception; + gc_invalid_path_format constant pls_integer := -20202; + pragma exception_init(ex_invalid_path_format, -20202); + + ex_suite_package_not_found exception; + gc_suite_package_not_found constant pls_integer := -20204; + pragma exception_init(ex_suite_package_not_found, -20204); + + -- Reporting event time not supported + ex_invalid_rep_event_time exception; + gc_invalid_rep_event_time constant pls_integer := -20210; + pragma exception_init(ex_invalid_rep_event_time, -20210); + + -- Reporting event name not supported + ex_invalid_rep_event_name exception; + gc_invalid_rep_event_name constant pls_integer := -20211; + pragma exception_init(ex_invalid_rep_event_name, -20211); + + -- Any of tests failed + ex_some_tests_failed exception; + gc_some_tests_failed constant pls_integer := -20213; + pragma exception_init(ex_some_tests_failed, -20213); + + -- Version number provided is not in valid format + ex_invalid_version_no exception; + gc_invalid_version_no constant pls_integer := -20214; + pragma exception_init(ex_invalid_version_no, -20214); + + -- Version number provided is not in valid format + ex_out_buffer_timeout exception; + gc_out_buffer_timeout constant pls_integer := -20215; + pragma exception_init(ex_out_buffer_timeout, -20215); + + ex_invalid_package exception; + gc_invalid_package constant pls_integer := -6550; + pragma exception_init(ex_invalid_package, -6550); + + ex_failure_for_all exception; + gc_failure_for_all constant pls_integer := -24381; + pragma exception_init (ex_failure_for_all, -24381); + + ex_dml_for_all exception; + gc_dml_for_all constant pls_integer := -20216; + pragma exception_init (ex_dml_for_all, -20216); + + ex_value_too_large exception; + gc_value_too_large constant pls_integer := -20217; + pragma exception_init (ex_value_too_large, -20217); + + ex_xml_processing exception; + gc_xml_processing constant pls_integer := -19202; + pragma exception_init (ex_xml_processing, -19202); + + ex_failed_open_cur exception; + gc_failed_open_cur constant pls_integer := -20218; + pragma exception_init (ex_failed_open_cur, -20218); + + gc_max_storage_varchar2_len constant integer := 4000; + gc_max_output_string_length constant integer := 4000; + gc_more_data_string constant varchar2(5) := '[...]'; + gc_more_data_string_len constant integer := length( gc_more_data_string ); + gc_number_format constant varchar2(100) := 'TM9'; + gc_date_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ss'; + gc_timestamp_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ssxff'; + gc_timestamp_tz_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ssxff tzh:tzm'; + gc_null_string constant varchar2(4) := 'NULL'; + gc_empty_string constant varchar2(5) := 'EMPTY'; + + gc_bc_fetch_limit constant integer := 1000; + gc_diff_max_rows constant integer := 20; + + type t_version is record( + major natural, + minor natural, + bugfix natural, + build natural + ); + + type t_clob_tab is table of clob; + + /** + * Converts test results into strings + * + * @param a_test_result numeric representation of test result + * + * @return a string representation of a test_result. + */ + function test_result_to_char(a_test_result integer) return varchar2; + + function to_test_result(a_test boolean) return integer; + + /** + * Generates a unique name for a savepoint + * Uses sys_guid, as timestamp gives only miliseconds on Windows and is not unique + * Issue: #506 for details on the implementation approach + */ + function gen_savepoint_name return varchar2; + + procedure debug_log(a_message varchar2); + + procedure debug_log(a_message clob); + + function to_string( + a_value varchar2, + a_quote_char varchar2 := '''', + a_max_output_len in number := gc_max_output_string_length + ) return varchar2; + + function to_string( + a_value clob, + a_quote_char varchar2 := '''', + a_max_output_len in number := gc_max_output_string_length + ) return varchar2; + + function to_string( + a_value blob, + a_quote_char varchar2 := '''', + a_max_output_len in number := gc_max_output_string_length + ) return varchar2; + + function to_string(a_value boolean) return varchar2; + + function to_string(a_value number) return varchar2; + + function to_string(a_value date) return varchar2; + + function to_string(a_value timestamp_unconstrained) return varchar2; + + function to_string(a_value timestamp_tz_unconstrained) return varchar2; + + function to_string(a_value timestamp_ltz_unconstrained) return varchar2; + + function to_string(a_value yminterval_unconstrained) return varchar2; + + function to_string(a_value dsinterval_unconstrained) return varchar2; + + function boolean_to_int(a_value boolean) return integer; + + function int_to_boolean(a_value integer) return boolean; + + /** + * + * Splits a given string into table of string by delimiter. + * The delimiter gets removed. + * If null passed as any of the parameters, empty table is returned. + * If no occurence of a_delimiter found in a_text then text is returned as a single row of the table. + * If no text between delimiters found then an empty row is returned, example: + * string_to_table( 'a,,b', ',' ) gives table ut_varchar2_list( 'a', null, 'b' ); + * + * @param a_string the text to be split. + * @param a_delimiter the delimiter character or string + * @param a_skip_leading_delimiter determines if the leading delimiter should be ignored, used by clob_to_table + * + * @return table of varchar2 values + */ + function string_to_table(a_string varchar2, a_delimiter varchar2:= chr(10), a_skip_leading_delimiter varchar2 := 'N') return ut_varchar2_list; + + /** + * Splits a given string into table of string by delimiter. + * Default value of a_max_amount is 8191 because of code can contains multibyte character. + * The delimiter gets removed. + * If null passed as any of the parameters, empty table is returned. + * If split text is longer than a_max_amount it gets split into pieces of a_max_amount. + * If no text between delimiters found then an empty row is returned, example: + * string_to_table( 'a,,b', ',' ) gives table ut_varchar2_list( 'a', null, 'b' ); + * + * @param a_clob the text to be split. + * @param a_delimiter the delimiter character or string (default chr(10) ) + * @param a_max_amount the maximum length of returned string (default 8191) + * @return table of varchar2 values + */ + function clob_to_table(a_clob clob, a_max_amount integer := 8191, a_delimiter varchar2:= chr(10)) return ut_varchar2_list; + + function table_to_clob(a_text_table ut_varchar2_list, a_delimiter varchar2:= chr(10)) return clob; + + function table_to_clob(a_integer_table ut_integer_list, a_delimiter varchar2:= chr(10)) return clob; + + /** + * Returns time difference in seconds (with miliseconds) between given timestamps + */ + function time_diff(a_start_time timestamp with time zone, a_end_time timestamp with time zone) return number; + + /** + * Returns a text indented with spaces except the first line. + */ + function indent_lines(a_text varchar2, a_indent_size integer := 4, a_include_first_line boolean := false) return varchar2; + + + /** + * Returns a list of object that are part of utPLSQL framework + */ + function get_utplsql_objects_list return ut_object_names; + + /** + * Append a item to the end of ut_varchar2_list + */ + procedure append_to_list(a_list in out nocopy ut_varchar2_list, a_item varchar2); + + /** + * Append a item to the end of ut_varchar2_rows + */ + procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item varchar2); + + /** + * Append a item to the end of ut_varchar2_rows + */ + procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item clob); + + /** + * Append a list of items to the end of ut_varchar2_rows + */ + procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_items ut_varchar2_rows); + + procedure append_to_clob(a_src_clob in out nocopy clob, a_clob_table t_clob_tab, a_delimiter varchar2 := chr(10)); + + procedure append_to_clob(a_src_clob in out nocopy clob, a_new_data clob); + + procedure append_to_clob(a_src_clob in out nocopy clob, a_new_data varchar2); + + function convert_collection(a_collection ut_varchar2_list) return ut_varchar2_rows; + + /** + * Set session's action and module using dbms_application_info + */ + procedure set_action(a_text in varchar2); + + /** + * Set session's client info using dbms_application_info + */ + procedure set_client_info(a_text in varchar2); + + function to_xpath(a_list varchar2, a_ancestors varchar2 := '/*/') return varchar2; + + function to_xpath(a_list ut_varchar2_list, a_ancestors varchar2 := '/*/') return varchar2; + + procedure cleanup_temp_tables; + + /** + * Converts version string into version record + * + * @param a_version_no string representation of version in format vX.X.X.X where X is a positive integer + * @return t_version record with up to four positive numbers containing version + * @throws 20214 if passed version string is not matching version pattern + */ + function to_version(a_version_no varchar2) return t_version; + + + /** + * Saves data from dbms_output buffer into a global temporary table (cache) + * used to store dbms_output buffer captured before the run + * + */ + procedure save_dbms_output_to_cache; + + /** + * Reads data from global temporary table (cache) abd puts it back into dbms_output + * used to recover dbms_output buffer data after a run is complete + * + */ + procedure read_cache_to_dbms_output; + + + /** + * Function is used to reference to utPLSQL owned objects in dynamic sql statements executed from packages with invoker rights + * + * @return the name of the utPSQL schema owner + */ + function ut_owner return varchar2; + + + /** + * Used in dynamic sql select statements to maintain balance between + * number of hard-parses and optimiser accurancy for cardinality of collections + * + * + * @return 3, for inputs of: 1-9; 33 for input of 10 - 99; 333 for (100 - 999) + */ + function scale_cardinality(a_cardinality natural) return natural; + + function build_depreciation_warning(a_old_syntax varchar2, a_new_syntax varchar2) return varchar2; + + /** + * Returns number as string. The value is represented as decimal according to XML standard: + * https://www.w3.org/TR/xmlschema-2/#decimal + */ + function to_xml_number_format(a_value number) return varchar2; + + + /** + * Returns xml header. If a_encoding is not null, header will include encoding attribute with provided value + */ + function get_xml_header(a_encoding varchar2) return varchar2; + + + /** + * Takes a collection of type ut_varchar2_list and it trims the characters passed as arguments for every element + */ + function trim_list_elements(a_list IN ut_varchar2_list, a_regexp_to_trim in varchar2 default '[:space:]') return ut_varchar2_list; + + /** + * Takes a collection of type ut_varchar2_list and it only returns the elements which meets the regular expression + */ + function filter_list(a_list IN ut_varchar2_list, a_regexp_filter in varchar2) return ut_varchar2_list; + + -- Generates XMLGEN escaped string + function xmlgen_escaped_string(a_string in varchar2) return varchar2; + + /** + * Replaces multi-line comments in given source-code with empty lines + */ + function replace_multiline_comments(a_source clob) return clob; + + /** + * Returns list of sub-type reporters for given list of super-type reporters + */ + function get_child_reporters(a_for_reporters ut_reporters_info := null) return ut_reporters_info; + + /** + * Remove given ORA error from stack + */ + function remove_error_from_stack(a_error_stack varchar2, a_ora_code number) return varchar2; + + /** + * Check if xml name is valid if not build a valid name + */ + function get_valid_xml_name(a_name varchar2) return varchar2; + + /** + * Add prefix word to elements of list + */ + function add_prefix(a_list ut_varchar2_list, a_prefix varchar2, a_connector varchar2 := '/') return ut_varchar2_list; + + function add_prefix(a_item varchar2, a_prefix varchar2, a_connector varchar2 := '/') return varchar2; + + function strip_prefix(a_item varchar2, a_prefix varchar2, a_connector varchar2 := '/') return varchar2; + +end ut_utils; +/ diff --git a/source/expectations/data_values/ut_cursor_column.tpb b/source/expectations/data_values/ut_cursor_column.tpb index 3c6931a5d..cb395e54a 100644 --- a/source/expectations/data_values/ut_cursor_column.tpb +++ b/source/expectations/data_values/ut_cursor_column.tpb @@ -1,69 +1,70 @@ -create or replace 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 - self.parent_name := a_parent_name; --Name of the parent if its nested - self.hierarchy_level := a_hierarchy_level; --Hierarchy level - self.column_position := a_col_position; --Position of the column in cursor/ type - self.column_len := a_col_max_len; --length of column - self.column_precision := a_col_precision; - self.column_scale := a_col_scale; - self.column_name := TRIM( BOTH '''' FROM a_col_name); --name of the column - self.column_type_name := coalesce(a_col_type_name,a_col_type); --type name e.g. test_dummy_object or varchar2 - self.xml_valid_name := ut_utils.get_valid_xml_name(self.column_name); - 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 - 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 incldue exclude eg/ TEST_DUMMY_OBJECT/VARCHAR2 - 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)||'"' - 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 - self.column_type := a_col_type; --column type e.g. user_defined , varchar2 - self.column_schema := a_col_schema_name; -- schema name - self.is_sql_diffable := case - when lower(self.column_type) = 'user_defined_type' then - 0 - -- Due to bug in 11g/12.1 collection fails on varchar 4000+ - 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 - self.is_collection := a_collection; - 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 - 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); - return; - end; - - constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result is - begin - return; - end; -end; -/ +create or replace 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 + self.parent_name := a_parent_name; --Name of the parent if its nested + self.hierarchy_level := a_hierarchy_level; --Hierarchy level + self.column_position := a_col_position; --Position of the column in cursor/ type + self.column_len := a_col_max_len; --length of column + self.column_precision := a_col_precision; + self.column_scale := a_col_scale; + self.column_name := TRIM( BOTH '''' FROM a_col_name); --name of the column + self.column_type_name := coalesce(a_col_type_name,a_col_type); --type name e.g. test_dummy_object or varchar2 + self.xml_valid_name := ut_utils.get_valid_xml_name(self.column_name); + 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 + 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 + self.filter_path := self.access_path; --Filter path will differ from access path in anydata type + 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)||'"' + 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 + self.column_type := a_col_type; --column type e.g. user_defined , varchar2 + self.column_schema := a_col_schema_name; -- schema name + self.is_sql_diffable := case + when lower(self.column_type) = 'user_defined_type' then + 0 + -- Due to bug in 11g/12.1 collection fails on varchar 4000+ + 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 + self.is_collection := a_collection; + 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 + 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); + return; + end; + + constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result is + begin + return; + end; +end; +/ diff --git a/source/expectations/data_values/ut_cursor_column.tps b/source/expectations/data_values/ut_cursor_column.tps index db9cbd3ae..da3c004f2 100644 --- a/source/expectations/data_values/ut_cursor_column.tps +++ b/source/expectations/data_values/ut_cursor_column.tps @@ -1,51 +1,52 @@ -create or replace type ut_cursor_column force authid current_user as object ( - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - parent_name varchar2(4000), - access_path varchar2(4000), - display_path varchar2(4000), - has_nested_col number(1,0), - transformed_name varchar2(2000), - hierarchy_level number, - column_position number, - xml_valid_name varchar2(2000), - column_name varchar2(2000), - column_type varchar2(128), - column_type_name varchar2(128), - column_schema varchar2(128), - column_len integer, - column_precision integer, - column_scale integer, - is_sql_diffable number(1, 0), - is_collection number(1, 0), - - 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 in varchar2, a_collection integer,a_access_path in varchar2, a_col_precision in integer, - a_col_scale integer), - - 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, - - constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result -) -/ +create or replace type ut_cursor_column authid current_user as object ( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + parent_name varchar2(4000), + access_path varchar2(4000), + filter_path varchar2(4000), + display_path varchar2(4000), + has_nested_col number(1,0), + transformed_name varchar2(2000), + hierarchy_level number, + column_position number, + xml_valid_name varchar2(2000), + column_name varchar2(2000), + column_type varchar2(128), + column_type_name varchar2(128), + column_schema varchar2(128), + column_len integer, + column_precision integer, + column_scale integer, + is_sql_diffable number(1, 0), + is_collection number(1, 0), + + 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 in varchar2, a_collection integer,a_access_path in varchar2, a_col_precision in integer, + a_col_scale integer), + + 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, + + constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result +) +/ diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index 99e1d4edc..2a70a51dd 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -1,286 +1,257 @@ -create or replace 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 - 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; - 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 - 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 - l_elements_info := ut_metadata.get_anytype_members_info( a_compound_data ); - l_is_collection := ut_metadata.is_collection(l_elements_info.type_code); - if l_elements_info.elements_count is null then - l_element_info := ut_metadata.get_attr_elem_info( a_compound_data ); - self.cursor_columns_info.extend; - 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 - ); - if l_element_info.attr_elt_type is not null then - 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 - while l_idx <= l_elements_info.elements_count loop - l_element_info := ut_metadata.get_attr_elem_info( a_compound_data, l_idx ); - - self.cursor_columns_info.extend; - 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 - ); - if l_element_info.attr_elt_type is not null then - 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; - 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 - self.cursor_columns_info := ut_cursor_column_tab(); - 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; - l_hierarchy_level integer := 1; - begin - self.cursor_columns_info := ut_cursor_column_tab(); - 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); - **/ - for pos in 1 .. l_columns_count loop - l_is_collection := ut_metadata.is_collection( l_columns_desc(pos).col_schema_name, l_columns_desc(pos).col_type_name ); - self.cursor_columns_info.extend; - 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 - ); - - if l_columns_desc(pos).col_type = dbms_sql.user_defined_type or l_is_collection then - 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; - return; - end; - - member function contains_collection return boolean is - l_collection_elements number; - begin - select count(1) into l_collection_elements - from table(cursor_columns_info) c - where c.is_collection = 1 and rownum = 1; - 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; - l_root varchar2(125); - begin - if self.is_anydata = 1 then - l_root := get_root; - end if; - --regexp_replace(c.access_path,'^\/?([^\/]+\/){1}') - 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.access_path,'^/?'|| - case - when self.is_anydata = 1 then - l_root||'/'||trim (leading '/' from fl.column_value) - else - fl.column_value - end||'($|/.*)' - ) - ) - order by fl.column_value; - return l_result; - end; - - member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options) is - l_result ut_cursor_details := self; - l_column_tab ut_cursor_column_tab := ut_cursor_column_tab(); - l_column ut_cursor_column; - l_root varchar2(125); - c_xpath_extract_reg constant varchar2(50) := '^((/ROW/)|^(//)|^(/\*/))?(.*)'; - begin - if l_result.cursor_columns_info is not null then - - if self.is_anydata = 1 then - l_root := get_root; - end if; - - --limit columns to those on the include items minus exclude items - if a_match_options.include.items.count > 0 then - -- if include - exclude = 0 then keep all columns - if a_match_options.include.items != a_match_options.exclude.items then - 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.access_path,'^/?'|| - case - when self.is_anydata = 1 then - l_root||'/'||trim(leading '/' from f.col_names) - else - f.col_names - end||'($|/.*)' - ) - ) - or x.hierarchy_level = case when self.is_anydata = 1 then 1 else 0 end ; - end if; - elsif a_match_options.exclude.items.count > 0 then - 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.access_path,'^/?'|| - case - when self.is_anydata = 1 then - l_root||'/'||trim(leading '/' from f.col_names) - else - f.col_names - end||'($|/.*)' ) - ); - end if; - - --Rewrite column order after columns been excluded - for i in ( - 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 - l_column := i.col_info; - l_column.column_position := i.new_position; - l_column_tab.extend; - l_column_tab(l_column_tab.last) := l_column; - end loop; - - l_result.cursor_columns_info := l_column_tab; - self := l_result; - end if; - end; - - member function get_xml_children(a_parent_name varchar2 := null) return xmltype is - l_result xmltype; - begin - 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; - return l_result; - end; - - member procedure has_anydata(self in out nocopy ut_cursor_details, a_is_anydata in boolean :=false) is - begin - self.is_anydata := case when nvl(a_is_anydata,false) then 1 else 0 end; - end; - - member function has_anydata return boolean is - begin - return ut_utils.int_to_boolean(nvl(self.is_anydata,0)); - end; - - member function get_root return varchar2 is - l_root varchar2(250); - begin - if self.cursor_columns_info.count > 0 then - select x.access_path into l_root from table(self.cursor_columns_info) x - where x.hierarchy_level = 1; - else - l_root := null; - end if; - return l_root; - end; - -end; -/ +create or replace 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 + 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; + 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 + 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 + l_elements_info := ut_metadata.get_anytype_members_info( a_compound_data ); + l_is_collection := ut_metadata.is_collection(l_elements_info.type_code); + if l_elements_info.elements_count is null then + l_element_info := ut_metadata.get_attr_elem_info( a_compound_data ); + self.cursor_columns_info.extend; + 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 + ); + if l_element_info.attr_elt_type is not null then + 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 + while l_idx <= l_elements_info.elements_count loop + l_element_info := ut_metadata.get_attr_elem_info( a_compound_data, l_idx ); + + self.cursor_columns_info.extend; + 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 + ); + if l_element_info.attr_elt_type is not null then + 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; + 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 + self.cursor_columns_info := ut_cursor_column_tab(); + 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; + l_hierarchy_level integer := 1; + begin + self.cursor_columns_info := ut_cursor_column_tab(); + self.is_anydata := 0; + 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); + **/ + for pos in 1 .. l_columns_count loop + l_is_collection := ut_metadata.is_collection( l_columns_desc(pos).col_schema_name, l_columns_desc(pos).col_type_name ); + self.cursor_columns_info.extend; + 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 + ); + + if l_columns_desc(pos).col_type = dbms_sql.user_defined_type or l_is_collection then + 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; + return; + end; + + member function contains_collection return boolean is + l_collection_elements number; + begin + select count(1) into l_collection_elements + from table(cursor_columns_info) c + where c.is_collection = 1 and rownum = 1; + 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}') + 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; + return l_result; + end; + + member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options) is + l_result ut_cursor_details := self; + l_column_tab ut_cursor_column_tab := ut_cursor_column_tab(); + l_column ut_cursor_column; + c_xpath_extract_reg constant varchar2(50) := '^((/ROW/)|^(//)|^(/\*/))?(.*)'; + begin + if l_result.cursor_columns_info is not null then + + --limit columns to those on the include items minus exclude items + if a_match_options.include.items.count > 0 then + -- if include - exclude = 0 then keep all columns + if a_match_options.include.items != a_match_options.exclude.items then + 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; + elsif a_match_options.exclude.items.count > 0 then + 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 + for i in ( + 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 + l_column := i.col_info; + l_column.column_position := i.new_position; + l_column_tab.extend; + l_column_tab(l_column_tab.last) := l_column; + end loop; + + l_result.cursor_columns_info := l_column_tab; + self := l_result; + end if; + end; + + member function get_xml_children(a_parent_name varchar2 := null) return xmltype is + l_result xmltype; + begin + 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; + return l_result; + end; + + member function get_root return varchar2 is + l_root varchar2(250); + begin + if self.cursor_columns_info.count > 0 then + select x.access_path into l_root from table(self.cursor_columns_info) x + where x.hierarchy_level = 1; + else + l_root := null; + end if; + return l_root; + end; + + member procedure strip_root_from_anydata(self in out nocopy ut_cursor_details) is + l_root varchar2(250) := get_root(); + begin + self.is_anydata := 1; + for i in 1..cursor_columns_info.count loop + self.cursor_columns_info(i).filter_path := ut_utils.strip_prefix(self.cursor_columns_info(i).access_path,l_root); + end loop; + end; + +end; +/ diff --git a/source/expectations/data_values/ut_cursor_details.tps b/source/expectations/data_values/ut_cursor_details.tps index ce5aefbe7..e6c80a3b5 100644 --- a/source/expectations/data_values/ut_cursor_details.tps +++ b/source/expectations/data_values/ut_cursor_details.tps @@ -1,42 +1,41 @@ -create or replace type ut_cursor_details force authid current_user as object ( - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - cursor_columns_info ut_cursor_column_tab, - - /*if type is anydata we need to skip level 1 on joinby / inlude / exclude as its artificial cursor*/ - is_anydata number(1,0), - constructor function ut_cursor_details(self in out nocopy ut_cursor_details) return self as result, - constructor function ut_cursor_details( - self in out nocopy ut_cursor_details,a_cursor_number in number - ) return self as result, - member function equals(a_other ut_cursor_details, a_match_options ut_matcher_options) return boolean, - 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 - ), - member function contains_collection return boolean, - member function get_missing_join_by_columns( a_expected_columns ut_varchar2_list ) return ut_varchar2_list, - member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options), - member function get_xml_children(a_parent_name varchar2 := null) return xmltype, - member procedure has_anydata(self in out nocopy ut_cursor_details, a_is_anydata in boolean := false), - member function has_anydata return boolean, - member function get_root return varchar2 -) -/ +create or replace type ut_cursor_details authid current_user as object ( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + cursor_columns_info ut_cursor_column_tab, + + /*if type is anydata we need to skip level 1 on joinby / inlude / exclude as its artificial cursor*/ + is_anydata number(1,0), + constructor function ut_cursor_details(self in out nocopy ut_cursor_details) return self as result, + constructor function ut_cursor_details( + self in out nocopy ut_cursor_details,a_cursor_number in number + ) return self as result, + member function equals(a_other ut_cursor_details, a_match_options ut_matcher_options) return boolean, + 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 + ), + member function contains_collection return boolean, + member function get_missing_join_by_columns( a_expected_columns ut_varchar2_list ) return ut_varchar2_list, + member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options), + member function get_xml_children(a_parent_name varchar2 := null) return xmltype, + member function get_root return varchar2, + member procedure strip_root_from_anydata(self in out nocopy ut_cursor_details) +) +/ diff --git a/source/expectations/data_values/ut_data_value_anydata.tpb b/source/expectations/data_values/ut_data_value_anydata.tpb index fa59ad67c..808e52197 100644 --- a/source/expectations/data_values/ut_data_value_anydata.tpb +++ b/source/expectations/data_values/ut_data_value_anydata.tpb @@ -1,145 +1,143 @@ -create or replace type body ut_data_value_anydata as - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - overriding member function get_object_info return varchar2 is - begin - return self.data_type || case when self.compound_type = 'collection' then ' [ count = '||self.elements_count||' ]' else null end; - end; - - member function get_extract_path(a_data_value anydata) return varchar2 is - l_path varchar2(10); - begin - if self.compound_type = 'object' then - l_path := '/*/*'; - else - case when ut_metadata.has_collection_members(a_data_value) then - l_path := '/*/*'; - else - l_path := '/*'; - end case; - end if; - return l_path; - end; - - member function get_cursor_sql_from_anydata(a_data_value anydata) return varchar2 is - l_cursor_sql varchar2(32767); - begin - 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); '|| - 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;'; - return l_cursor_sql; - end; - - member procedure init(self in out nocopy ut_data_value_anydata, a_value anydata) is - l_refcursor sys_refcursor; - l_ctx number; - l_ut_owner varchar2(250) := ut_utils.ut_owner; - cursor_not_open exception; - l_cursor_number number; - l_anydata_sql varchar2(32767); - begin - self.data_type := ut_metadata.get_anydata_typename(a_value); - self.compound_type := get_instance(a_value); - self.is_data_null := ut_metadata.is_anytype_null(a_value,self.compound_type); - self.data_id := sys_guid(); - self.self_type := $$plsql_unit; - self.cursor_details := ut_cursor_details(); - - ut_compound_data_helper.cleanup_diff; - - if not self.is_null() then - self.extract_path := get_extract_path(a_value); - l_anydata_sql := get_cursor_sql_from_anydata(a_value); - execute immediate l_anydata_sql using in a_value, in out l_refcursor; - if l_refcursor%isopen then - self.extract_cursor(l_refcursor); - l_cursor_number := dbms_sql.to_cursor_number(l_refcursor); - self.cursor_details := ut_cursor_details(l_cursor_number); - self.cursor_details.has_anydata(true); - 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 - l_result := ut_metadata.get_anydata_compound_type(a_data_value); - 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; - 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 - init(a_value); - 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 - l_result integer := 0; - begin - if not a_other is of (ut_data_value_anydata) then - raise value_error; - end if; - l_result := l_result + (self as ut_data_value_refcursor).compare_implementation(a_other,a_match_options,a_inclusion_compare,a_is_negated); - return l_result; - end; - - overriding member function is_empty return boolean is - begin - if self.compound_type = 'collection' then - return self.elements_count = 0; - else - raise value_error; - end if; - end; - -end; -/ +create or replace type body ut_data_value_anydata as + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + overriding member function get_object_info return varchar2 is + begin + return self.data_type || case when self.compound_type = 'collection' then ' [ count = '||self.elements_count||' ]' else null end; + end; + + member function get_extract_path(a_data_value anydata) return varchar2 is + l_path varchar2(10); + begin + if self.compound_type = 'object' then + l_path := '/*/*'; + else + case when ut_metadata.has_collection_members(a_data_value) then + l_path := '/*/*'; + else + l_path := '/*'; + end case; + end if; + return l_path; + end; + + member function get_cursor_sql_from_anydata(a_data_value anydata) return varchar2 is + l_cursor_sql varchar2(32767); + begin + 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); '|| + 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;'; + 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 + self.data_type := ut_metadata.get_anydata_typename(a_value); + self.compound_type := get_instance(a_value); + self.is_data_null := ut_metadata.is_anytype_null(a_value,self.compound_type); + self.data_id := sys_guid(); + self.self_type := $$plsql_unit; + self.cursor_details := ut_cursor_details(); + + ut_compound_data_helper.cleanup_diff; + + if not self.is_null() then + self.extract_path := get_extract_path(a_value); + l_anydata_sql := get_cursor_sql_from_anydata(a_value); + execute immediate l_anydata_sql using in a_value, in out l_refcursor; + if l_refcursor%isopen then + self.extract_cursor(l_refcursor); + l_cursor_number := dbms_sql.to_cursor_number(l_refcursor); + self.cursor_details := ut_cursor_details(l_cursor_number); + self.cursor_details.strip_root_from_anydata; + 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 + l_result := ut_metadata.get_anydata_compound_type(a_data_value); + 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; + 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 + init(a_value); + 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 + l_result integer := 0; + begin + if not a_other is of (ut_data_value_anydata) then + raise value_error; + end if; + l_result := l_result + (self as ut_data_value_refcursor).compare_implementation(a_other,a_match_options,a_inclusion_compare,a_is_negated); + return l_result; + end; + + overriding member function is_empty return boolean is + begin + if self.compound_type = 'collection' then + return self.elements_count = 0; + else + raise value_error; + end if; + end; + +end; +/ diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index 2aac626e3..b93158cf1 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -1,399 +1,398 @@ -create or replace type body ut_data_value_refcursor as - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - constructor function ut_data_value_refcursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) - return self as result is - begin - init(a_value); - return; - end; - - member procedure extract_cursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) - is - c_bulk_rows constant integer := 10000; - l_cursor sys_refcursor := a_value; - l_ctx number; - l_xml xmltype; - l_ut_owner varchar2(250) := ut_utils.ut_owner; - l_set_id integer := 0; - 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. - ut_expectation_processor.set_xml_nls_params(); - l_ctx := dbms_xmlgen.newContext(l_cursor); - dbms_xmlgen.setNullHandling(l_ctx, dbms_xmlgen.empty_tag); - dbms_xmlgen.setMaxRows(l_ctx, c_bulk_rows); - loop - l_xml := dbms_xmlgen.getxmltype(l_ctx); - 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 - l_xml := xmltype( replace(l_xml.getClobVal(),' 0 then - ut_utils.append_to_clob( l_result, self.cursor_details.get_xml_children().getclobval() ); - end if; - ut_utils.append_to_clob(l_result,chr(10)||(self as ut_compound_data_value).to_string()); - l_result_string := ut_utils.to_string(l_result,null); - dbms_lob.freetemporary(l_result); - end if; - 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; - l_results ut_utils.t_clob_tab := ut_utils.t_clob_tab(); - l_result_string varchar2(32767); - l_other ut_data_value_refcursor; - 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; - - l_act_missing_pk ut_varchar2_list := ut_varchar2_list(); - l_exp_missing_pk ut_varchar2_list := ut_varchar2_list(); - - c_max_rows integer := ut_utils.gc_diff_max_rows; - l_diff_id ut_compound_data_helper.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 - return - case a_col.diff_type - when '-' then - ' Column <'||a_col.expected_name||'> [data-type: '||a_col.expected_type||'] is missing. Expected column position: '||a_col.expected_pos||'.' - when '+' then - ' Column <'||a_col.actual_name||'> [position: '||a_col.actual_pos||', data-type: '||a_col.actual_type||'] is not expected in results.' - when 't' then - ' Column <'||a_col.actual_name||'> data-type is invalid. Expected: '||a_col.expected_type||',' ||' actual: '||a_col.actual_type||'.' - 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 - l_missing_cols ut_varchar2_list := ut_varchar2_list(); - l_result ut_cursor_column_tab; - begin - for i in 1 .. a_column_diffs.count loop - if a_column_diffs(i).diff_type in ('-','+') then - l_missing_cols.extend; - l_missing_cols(l_missing_cols.last) := coalesce(a_column_diffs(i).expected_name, a_column_diffs(i).actual_name); - end if; - end loop; - 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 - ); - 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 - if a_is_unordered then - if a_row_diff.pk_value is not null then - return ' PK '||a_row_diff.pk_value||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; - else - return rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; - end if; - else - return ' Row No. '||a_row_diff.rn||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; - end if; - end; - - begin - if not a_other is of (ut_data_value_refcursor) then - raise value_error; - end if; - l_other := treat(a_other as ut_data_value_refcursor); - l_other.cursor_details.filter_columns(a_match_options); - l_self.cursor_details.filter_columns(a_match_options); - - l_other_cols := l_other.cursor_details.cursor_columns_info; - l_self_cols := l_self.cursor_details.cursor_columns_info; - - dbms_lob.createtemporary(l_result,true); - --diff columns - if not l_self.is_null and not l_other.is_null then - 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() - ); - - if l_column_diffs.count > 0 then - ut_utils.append_to_clob(l_result,chr(10) || 'Columns:' || chr(10)); - l_other_cols := remove_incomparable_cols( l_other_cols, l_column_diffs ); - l_self_cols := remove_incomparable_cols( l_self_cols, l_column_diffs ); - for i in 1 .. l_column_diffs.count loop - l_results.extend; - l_results(l_results.last) := get_col_diff_text(l_column_diffs(i)); - end loop; - ut_utils.append_to_clob(l_result, l_results); - end if; - end if; - - --check for missing pk - if a_match_options.join_by.items.count > 0 then - l_act_missing_pk := l_other.cursor_details.get_missing_join_by_columns( a_match_options.join_by.items ); - 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 - if l_act_missing_pk.count + l_exp_missing_pk.count = 0 then - l_diff_id := ut_compound_data_helper.get_hash( l_self.data_id || l_other.data_id ); - - -- First tell how many rows are different - l_diff_row_count := ut_compound_data_helper.get_rows_diff_count; - if l_diff_row_count > 0 then - 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, - case - 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 - ); - l_message := chr(10) - ||'Rows: [ ' || l_diff_row_count ||' differences' - || case when l_diff_row_count > c_max_rows and l_row_diffs.count > 0 then ', showing first '||c_max_rows end - ||' ]'||chr(10)|| case when l_row_diffs.count = 0 then ' All rows are different as the columns are not matching.' else null end; - ut_utils.append_to_clob( l_result, l_message ); - l_results := ut_utils.t_clob_tab(); - for i in 1 .. l_row_diffs.count loop - l_results.extend; - l_results(l_results.last) := get_diff_message(l_row_diffs(i),a_match_options.unordered); - end loop; - ut_utils.append_to_clob(l_result,l_results); - else - l_message:= chr(10)||'Rows: [ all different ]'||chr(10)||' All rows are different as the columns position is not matching.'; - ut_utils.append_to_clob( l_result, l_message ); - end if; - else - ut_utils.append_to_clob(l_result,chr(10) || 'Unable to join sets:' || chr(10)); - - for i in 1 .. l_exp_missing_pk.count loop - ut_utils.append_to_clob(l_result, ' Join key '||l_exp_missing_pk(i)||' does not exists in expected'||chr(10)); - end loop; - - for i in 1 .. l_act_missing_pk.count loop - ut_utils.append_to_clob(l_result, ' Join key '||l_act_missing_pk(i)||' does not exists in actual'||chr(10)); - end loop; - - if l_self.cursor_details.contains_collection() or l_other.cursor_details.contains_collection() then - 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; - - l_result_string := ut_utils.to_string(l_result,null); - dbms_lob.freetemporary(l_result); - 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 - l_result integer := 0; - 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_compound_data_helper.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; - l_diif_rowcount integer :=0; - begin - l_diff_id := ut_compound_data_helper.get_hash(a_self.data_id||a_other.data_id); - - begin - 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 - 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; - - ut_compound_data_helper.insert_diffs_result( l_diff_tab, l_diff_id ); - --fetch rows for count only - loop - exit when l_diff_tab.count = 0; - l_diif_rowcount := l_diif_rowcount + l_diff_tab.count; - fetch l_cursor bulk collect into l_diff_tab limit ut_utils.gc_bc_fetch_limit; - end loop; - - ut_compound_data_helper.set_rows_diff(l_diif_rowcount); - - --result is OK only if both are same - if l_diif_rowcount = 0 and a_self.is_null = a_other.is_null then - l_result := 0; - else - l_result := 1; - end if; - close l_cursor; - return l_result; - end; - begin - if not a_other is of (ut_data_value_refcursor) then - raise value_error; - end if; - - l_other := treat(a_other as ut_data_value_refcursor); - l_other.cursor_details.filter_columns( a_match_options ); - l_self.cursor_details.filter_columns( a_match_options ); - - if a_match_options.join_by.items.count > 0 then - 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; - - if l_result = 0 then - 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 - l_result := 1; - end if; - - 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 - ); - l_result := l_result + compare_data( l_self, l_other, l_diff_cursor_text ); - end if; - return l_result; - end; - - overriding member function is_empty return boolean is - begin - return self.elements_count = 0; - end; - -end; -/ +create or replace type body ut_data_value_refcursor as + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + constructor function ut_data_value_refcursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) + return self as result is + begin + init(a_value); + return; + end; + + member procedure extract_cursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) + is + c_bulk_rows constant integer := 10000; + l_cursor sys_refcursor := a_value; + l_ctx number; + l_xml xmltype; + l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_set_id integer := 0; + 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. + ut_expectation_processor.set_xml_nls_params(); + l_ctx := dbms_xmlgen.newContext(l_cursor); + dbms_xmlgen.setNullHandling(l_ctx, dbms_xmlgen.empty_tag); + dbms_xmlgen.setMaxRows(l_ctx, c_bulk_rows); + loop + l_xml := dbms_xmlgen.getxmltype(l_ctx); + 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 + l_xml := xmltype( replace(l_xml.getClobVal(),' 0 then + ut_utils.append_to_clob( l_result, self.cursor_details.get_xml_children().getclobval() ); + end if; + ut_utils.append_to_clob(l_result,chr(10)||(self as ut_compound_data_value).to_string()); + l_result_string := ut_utils.to_string(l_result,null); + dbms_lob.freetemporary(l_result); + end if; + 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; + l_results ut_utils.t_clob_tab := ut_utils.t_clob_tab(); + l_result_string varchar2(32767); + l_other ut_data_value_refcursor; + 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; + + l_act_missing_pk ut_varchar2_list := ut_varchar2_list(); + l_exp_missing_pk ut_varchar2_list := ut_varchar2_list(); + + c_max_rows integer := ut_utils.gc_diff_max_rows; + l_diff_id ut_compound_data_helper.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 + return + case a_col.diff_type + when '-' then + ' Column <'||a_col.expected_name||'> [data-type: '||a_col.expected_type||'] is missing. Expected column position: '||a_col.expected_pos||'.' + when '+' then + ' Column <'||a_col.actual_name||'> [position: '||a_col.actual_pos||', data-type: '||a_col.actual_type||'] is not expected in results.' + when 't' then + ' Column <'||a_col.actual_name||'> data-type is invalid. Expected: '||a_col.expected_type||',' ||' actual: '||a_col.actual_type||'.' + 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 + l_missing_cols ut_varchar2_list := ut_varchar2_list(); + l_result ut_cursor_column_tab; + begin + for i in 1 .. a_column_diffs.count loop + if a_column_diffs(i).diff_type in ('-','+') then + l_missing_cols.extend; + l_missing_cols(l_missing_cols.last) := coalesce(a_column_diffs(i).expected_name, a_column_diffs(i).actual_name); + end if; + end loop; + 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 + ); + 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 + if a_is_unordered then + if a_row_diff.pk_value is not null then + return ' PK '||a_row_diff.pk_value||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; + else + return rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; + end if; + else + return ' Row No. '||a_row_diff.rn||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; + end if; + end; + + begin + if not a_other is of (ut_data_value_refcursor) then + raise value_error; + end if; + l_other := treat(a_other as ut_data_value_refcursor); + l_other.cursor_details.filter_columns(a_match_options); + l_self.cursor_details.filter_columns(a_match_options); + + l_other_cols := l_other.cursor_details.cursor_columns_info; + l_self_cols := l_self.cursor_details.cursor_columns_info; + + dbms_lob.createtemporary(l_result,true); + --diff columns + if not l_self.is_null and not l_other.is_null then + 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() + ); + + if l_column_diffs.count > 0 then + ut_utils.append_to_clob(l_result,chr(10) || 'Columns:' || chr(10)); + l_other_cols := remove_incomparable_cols( l_other_cols, l_column_diffs ); + l_self_cols := remove_incomparable_cols( l_self_cols, l_column_diffs ); + for i in 1 .. l_column_diffs.count loop + l_results.extend; + l_results(l_results.last) := get_col_diff_text(l_column_diffs(i)); + end loop; + ut_utils.append_to_clob(l_result, l_results); + end if; + end if; + + --check for missing pk + if a_match_options.join_by.items.count > 0 then + l_act_missing_pk := l_other.cursor_details.get_missing_join_by_columns( a_match_options.join_by.items ); + 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 + if l_act_missing_pk.count + l_exp_missing_pk.count = 0 then + l_diff_id := ut_compound_data_helper.get_hash( l_self.data_id || l_other.data_id ); + + -- First tell how many rows are different + l_diff_row_count := ut_compound_data_helper.get_rows_diff_count; + if l_diff_row_count > 0 then + 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, + case + 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 + ); + l_message := chr(10) + ||'Rows: [ ' || l_diff_row_count ||' differences' + || case when l_diff_row_count > c_max_rows and l_row_diffs.count > 0 then ', showing first '||c_max_rows end + ||' ]'||chr(10)|| case when l_row_diffs.count = 0 then ' All rows are different as the columns are not matching.' else null end; + ut_utils.append_to_clob( l_result, l_message ); + l_results := ut_utils.t_clob_tab(); + for i in 1 .. l_row_diffs.count loop + l_results.extend; + l_results(l_results.last) := get_diff_message(l_row_diffs(i),a_match_options.unordered); + end loop; + ut_utils.append_to_clob(l_result,l_results); + else + l_message:= chr(10)||'Rows: [ all different ]'||chr(10)||' All rows are different as the columns position is not matching.'; + ut_utils.append_to_clob( l_result, l_message ); + end if; + else + ut_utils.append_to_clob(l_result,chr(10) || 'Unable to join sets:' || chr(10)); + + for i in 1 .. l_exp_missing_pk.count loop + ut_utils.append_to_clob(l_result, ' Join key '||l_exp_missing_pk(i)||' does not exists in expected'||chr(10)); + end loop; + + for i in 1 .. l_act_missing_pk.count loop + ut_utils.append_to_clob(l_result, ' Join key '||l_act_missing_pk(i)||' does not exists in actual'||chr(10)); + end loop; + + if l_self.cursor_details.contains_collection() or l_other.cursor_details.contains_collection() then + 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; + + l_result_string := ut_utils.to_string(l_result,null); + dbms_lob.freetemporary(l_result); + 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 + l_result integer := 0; + 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_compound_data_helper.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; + l_diif_rowcount integer :=0; + begin + l_diff_id := ut_compound_data_helper.get_hash(a_self.data_id||a_other.data_id); + + begin + 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 + 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; + + ut_compound_data_helper.insert_diffs_result( l_diff_tab, l_diff_id ); + --fetch rows for count only + loop + exit when l_diff_tab.count = 0; + l_diif_rowcount := l_diif_rowcount + l_diff_tab.count; + fetch l_cursor bulk collect into l_diff_tab limit ut_utils.gc_bc_fetch_limit; + end loop; + + ut_compound_data_helper.set_rows_diff(l_diif_rowcount); + + --result is OK only if both are same + if l_diif_rowcount = 0 and a_self.is_null = a_other.is_null then + l_result := 0; + else + l_result := 1; + end if; + close l_cursor; + return l_result; + end; + begin + if not a_other is of (ut_data_value_refcursor) then + raise value_error; + end if; + + l_other := treat(a_other as ut_data_value_refcursor); + l_other.cursor_details.filter_columns( a_match_options ); + l_self.cursor_details.filter_columns( a_match_options ); + + if a_match_options.join_by.items.count > 0 then + 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; + + if l_result = 0 then + 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 + l_result := 1; + end if; + + 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 + ); + l_result := l_result + compare_data( l_self, l_other, l_diff_cursor_text ); + end if; + return l_result; + end; + + overriding member function is_empty return boolean is + begin + return self.elements_count = 0; + end; + +end; +/ From 7d27d3a4ffba48d1b0ab3f8fd3022b7c8268e0a6 Mon Sep 17 00:00:00 2001 From: LUKASZ104 Date: Fri, 24 May 2019 14:43:58 +0100 Subject: [PATCH 136/181] TAG: Phase2 Adding a new attribute filterpath that is used for filtering cursor in anydata / refcursor. This value will be different from cursor in anydata as we skip root element. --- source/core/ut_utils.pkb | 1644 +++++++++-------- source/core/ut_utils.pks | 796 ++++---- .../data_values/ut_compound_data_helper.pkb | 1388 +++++++------- .../data_values/ut_cursor_column.tpb | 139 +- .../data_values/ut_cursor_column.tps | 103 +- .../data_values/ut_cursor_details.tpb | 543 +++--- .../data_values/ut_cursor_details.tps | 83 +- .../data_values/ut_data_value_anydata.tpb | 288 ++- .../data_values/ut_data_value_refcursor.tpb | 797 ++++---- 9 files changed, 2882 insertions(+), 2899 deletions(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 2e35229e6..5b80e1f59 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -1,817 +1,827 @@ -create or replace package body ut_utils is - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - /** - * Constants regex used to validate XML name - */ - gc_invalid_first_xml_char constant varchar2(50) := '[^_a-zA-Z]'; - gc_invalid_xml_char constant varchar2(50) := '[^_a-zA-Z0-9\.-]'; - 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 - 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 - if a_test_result = gc_success then - l_result := gc_success_char; - elsif a_test_result = gc_failure then - l_result := gc_failure_char; - elsif a_test_result = gc_error then - l_result := gc_error_char; - elsif a_test_result = gc_disabled then - l_result := gc_disabled_char; - else - l_result := 'Unknown(' || coalesce(to_char(a_test_result),'NULL') || ')'; - end if ; - return l_result; - end test_result_to_char; - - - function to_test_result(a_test boolean) return integer is - l_result integer; - begin - if a_test then - l_result := gc_success; - else - l_result := gc_failure; - end if; - return l_result; - end; - - function gen_savepoint_name return varchar2 is - begin - 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 - 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 - 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); - c_length constant integer := coalesce( length( a_value ), 0 ); - c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); - c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; - begin - if c_length = 0 then - l_result := gc_null_string; - elsif c_length <= c_max_input_string_length then - l_result := surround_with(a_value, a_quote_char); - else - l_result := surround_with(substr(a_value, 1, c_overflow_substr_len ), a_quote_char) || gc_more_data_string; - end if ; - 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); - c_length constant integer := coalesce(dbms_lob.getlength(a_value), 0); - c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); - c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; - begin - if a_value is null then - l_result := gc_null_string; - elsif c_length = 0 then - l_result := gc_empty_string; - elsif c_length <= c_max_input_string_length then - l_result := surround_with(a_value,a_quote_char); - else - l_result := surround_with(dbms_lob.substr(a_value, c_overflow_substr_len), a_quote_char) || gc_more_data_string; - end if; - 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); - c_length constant integer := coalesce(dbms_lob.getlength(a_value), 0); - c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); - c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; - begin - if a_value is null then - l_result := gc_null_string; - elsif c_length = 0 then - l_result := gc_empty_string; - elsif c_length <= c_max_input_string_length then - l_result := surround_with(rawtohex(a_value),a_quote_char); - else - l_result := to_string( rawtohex(dbms_lob.substr(a_value, c_overflow_substr_len)) ); - end if ; - return l_result; - end; - - function to_string(a_value boolean) return varchar2 is - begin - 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 - return coalesce(to_char(a_value,gc_number_format), gc_null_string); - end; - - function to_string(a_value date) return varchar2 is - begin - return coalesce(to_char(a_value,gc_date_format), gc_null_string); - end; - - function to_string(a_value timestamp_unconstrained) return varchar2 is - begin - 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 - 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 - return coalesce(to_char(a_value,gc_timestamp_format), gc_null_string); - end; - - function to_string(a_value yminterval_unconstrained) return varchar2 IS - begin - return coalesce(to_char(a_value), gc_null_string); - end; - - function to_string(a_value dsinterval_unconstrained) return varchar2 IS - begin - return coalesce(to_char(a_value), gc_null_string); - end; - - - function boolean_to_int(a_value boolean) return integer is - begin - 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 - 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 - l_offset integer := 1; - l_delimiter_position integer; - l_skip_leading_delimiter boolean := coalesce(a_skip_leading_delimiter = 'Y',false); - l_result ut_varchar2_list := ut_varchar2_list(); - begin - if a_string is null then - return l_result; - end if; - if a_delimiter is null then - return ut_varchar2_list(a_string); - end if; - - loop - l_delimiter_position := instr(a_string, a_delimiter, l_offset); - if not (l_delimiter_position = 1 and l_skip_leading_delimiter) then - l_result.extend; - if l_delimiter_position > 0 then - l_result(l_result.last) := substr(a_string, l_offset, l_delimiter_position - l_offset); - else - l_result(l_result.last) := substr(a_string, l_offset); - end if; - end if; - exit when l_delimiter_position = 0; - l_offset := l_delimiter_position + 1; - end loop; - 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 - l_offset integer := 1; - 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; - l_results ut_varchar2_list := ut_varchar2_list(); - l_has_last_line boolean; - l_skip_leading_delimiter varchar2(1) := 'N'; - begin - while l_offset <= l_length loop - l_amount := a_max_amount - coalesce( length(l_last_line), 0 ); - dbms_lob.read(a_clob, l_amount, l_offset, l_buffer); - l_offset := l_offset + l_amount; - - l_string_results := string_to_table( l_last_line || l_buffer, a_delimiter, l_skip_leading_delimiter ); - for i in 1 .. l_string_results.count loop - --if a split of lines was not done or not at the last line - if l_string_results.count = 1 or i < l_string_results.count then - l_results.extend; - 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 - if l_string_results.count = 1 then - l_has_last_line := false; - l_last_line := null; - elsif l_string_results.count > 1 then - l_has_last_line := true; - l_last_line := l_string_results(l_string_results.count); - end if; - - l_skip_leading_delimiter := 'Y'; - end loop; - if l_has_last_line then - l_results.extend; - l_results(l_results.last) := l_last_line; - end if; - 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; - l_table_rows integer := coalesce(cardinality(a_text_table),0); - begin - for i in 1 .. l_table_rows loop - if i < l_table_rows then - append_to_clob(l_result, a_text_table(i)||a_delimiter); - else - append_to_clob(l_result, a_text_table(i)); - end if; - end loop; - 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; - l_table_rows integer := coalesce(cardinality(a_integer_table),0); - begin - for i in 1 .. l_table_rows loop - if i < l_table_rows then - append_to_clob(l_result, a_integer_table(i)||a_delimiter); - else - append_to_clob(l_result, a_integer_table(i)); - end if; - end loop; - 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 - 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 - if a_include_first_line then - 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 - if a_item is not null then - if a_list is null then - a_list := ut_varchar2_list(); - end if; - a_list.extend; - 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 - if a_items is not null then - if a_list is null then - a_list := ut_varchar2_rows(); - end if; - for i in 1 .. a_items.count loop - a_list.extend; - 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 - 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 - if a_item is not null then - if a_list is null then - a_list := ut_varchar2_rows(); - end if; - 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 - a_list.extend; - 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 - if a_clob_table is not null and cardinality(a_clob_table) > 0 then - if a_src_clob is null then - dbms_lob.createtemporary(a_src_clob, true); - end if; - for i in 1 .. a_clob_table.count loop - dbms_lob.append(a_src_clob,a_clob_table(i)); - if i < a_clob_table.count then - 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 - if a_new_data is not null and dbms_lob.getlength(a_new_data) > 0 then - if a_src_clob is null then - dbms_lob.createtemporary(a_src_clob, true); - end if; - 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 - if a_new_data is not null then - if a_src_clob is null then - dbms_lob.createtemporary(a_src_clob, true); - end if; - 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 - if a_collection is not null then - l_result := ut_varchar2_rows(); - for i in 1 .. a_collection.count loop - l_result.extend(); - l_result(i) := substr(a_collection(i),1,gc_max_storage_varchar2_len); - end loop; - end if; - return l_result; - end; - - procedure set_action(a_text in varchar2) is - begin - dbms_application_info.set_module('utPLSQL', a_text); - end; - - procedure set_client_info(a_text in varchar2) is - begin - dbms_application_info.set_client_info(a_text); - 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 - if a_list is not null then - l_iter := a_list.first; - while l_iter is not null loop - l_item := trim(a_list(l_iter)); - if l_item is not null then - if l_item like '%,%' then - l_xpath := l_xpath || to_xpath( l_item, a_ancestors ) || '|'; - elsif l_item like '/%' then - l_xpath := l_xpath || l_item || '|'; - else - l_xpath := l_xpath || a_ancestors || l_item || '|'; - end if; - end if; - l_iter := a_list.next(l_iter); - end loop; - l_xpath := rtrim(l_xpath,',|'); - end if; - return l_xpath; - end; - - procedure cleanup_temp_tables is - begin - execute immediate 'delete from ut_compound_data_tmp'; - execute immediate 'delete from ut_compound_data_diff_tmp'; - end; - - function to_version(a_version_no varchar2) return t_version is - l_result t_version; - c_version_part_regex constant varchar2(20) := '[0-9]+'; - begin - - if regexp_like(a_version_no,'v?([0-9]+(\.|$)){1,4}') then - l_result.major := regexp_substr(a_version_no, c_version_part_regex, 1, 1); - l_result.minor := regexp_substr(a_version_no, c_version_part_regex, 1, 2); - l_result.bugfix := regexp_substr(a_version_no, c_version_part_regex, 1, 3); - l_result.build := regexp_substr(a_version_no, c_version_part_regex, 1, 4); - else - raise_application_error(gc_invalid_version_no, 'Version string "'||a_version_no||'" is not a valid version'); - end if; - return l_result; - end; - - procedure save_dbms_output_to_cache is - l_status number; - l_line varchar2(32767); - l_offset integer := 0; - l_lines ut_varchar2_rows := ut_varchar2_rows(); - c_lines_limit constant integer := 100; - pragma autonomous_transaction; - - procedure flush_lines(a_lines ut_varchar2_rows, a_offset integer) is - begin - insert into ut_dbms_output_cache (seq_no,text) - select rownum+a_offset, column_value - from table(a_lines); - end; - begin - loop - dbms_output.get_line(line => l_line, status => l_status); - exit when l_status = 1; - l_lines := l_lines multiset union all ut_utils.convert_collection(ut_utils.clob_to_table(l_line||chr(7),4000)); - if l_lines.count > c_lines_limit then - flush_lines(l_lines, l_offset); - l_offset := l_offset + l_lines.count; - l_lines.delete; - end if; - end loop; - flush_lines(l_lines, l_offset); - commit; - end; - - procedure read_cache_to_dbms_output is - l_lines_data sys_refcursor; - l_lines ut_varchar2_rows; - c_lines_limit constant integer := 100; - pragma autonomous_transaction; - begin - open l_lines_data for select text from ut_dbms_output_cache order by seq_no; - loop - fetch l_lines_data bulk collect into l_lines limit c_lines_limit; - for i in 1 .. l_lines.count loop - if substr(l_lines(i),-1) = chr(7) then - dbms_output.put_line(rtrim(l_lines(i),chr(7))); - else - dbms_output.put(l_lines(i)); - end if; - end loop; - exit when l_lines_data%notfound; - end loop; - delete from ut_dbms_output_cache; - commit; - end; - - function ut_owner return varchar2 is - begin - return sys_context('userenv','current_schema'); - end; - - function scale_cardinality(a_cardinality natural) return natural is - begin - return nvl(trunc(power(10,(floor(log(10,a_cardinality))+1))/3),0); - end; - - function build_depreciation_warning(a_old_syntax varchar2, a_new_syntax varchar2) return varchar2 is - begin - 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 - return to_char(a_value, gc_number_format, 'NLS_NUMERIC_CHARACTERS=''. '''); - end; - - function get_xml_header(a_encoding varchar2) return varchar2 is - begin - return - ''; - 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 - if a_list is not null then - l_trimmed_list := ut_varchar2_list(); - l_index := a_list.first; - - while (l_index is not null) loop - l_trimmed_list.extend; - l_trimmed_list(l_trimmed_list.count) := regexp_replace(a_list(l_index), '(^['||a_regexp_to_trim||']*)|(['||a_regexp_to_trim||']*$)'); - l_index := a_list.next(l_index); - end loop; - end if; - - 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 - if a_list is not null then - l_filtered_list := ut_varchar2_list(); - l_index := a_list.first; - - while (l_index is not null) loop - if regexp_like(a_list(l_index), a_regexp_filter) then - l_filtered_list.extend; - l_filtered_list(l_filtered_list.count) := a_list(l_index); - end if; - l_index := a_list.next(l_index); - end loop; - end if; - - 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; - l_ml_comment_start binary_integer := 1; - l_comment_start binary_integer := 1; - l_text_start binary_integer := 1; - l_escaped_text_start binary_integer := 1; - l_escaped_text_end_char varchar2(1 char); - l_end binary_integer := 1; - l_ml_comment clob; - l_newlines_count binary_integer; - l_offset binary_integer := 1; - l_length binary_integer := coalesce(dbms_lob.getlength(a_source), 0); - begin - l_ml_comment_start := instr(a_source,'/*'); - l_comment_start := instr(a_source,'--'); - l_text_start := instr(a_source,''''); - l_escaped_text_start := instr(a_source,q'[q']'); - while l_offset > 0 and l_ml_comment_start > 0 loop - - if l_ml_comment_start > 0 and (l_ml_comment_start < l_comment_start or l_comment_start = 0) - 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 - l_end := instr(a_source,'*/',l_ml_comment_start+2); - append_to_clob(l_result, dbms_lob.substr(a_source, l_ml_comment_start-l_offset, l_offset)); - if l_end > 0 then - l_ml_comment := substr(a_source, l_ml_comment_start, l_end-l_ml_comment_start); - l_newlines_count := length( l_ml_comment ) - length( translate( l_ml_comment, 'a'||chr(10), 'a') ); - if l_newlines_count > 0 then - append_to_clob(l_result, lpad( chr(10), l_newlines_count, chr(10) ) ); - end if; - l_end := l_end + 2; - end if; - else - - if l_comment_start > 0 and (l_comment_start < l_ml_comment_start or l_ml_comment_start = 0) - 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 - l_end := instr(a_source,chr(10),l_comment_start+2); - if l_end > 0 then - l_end := l_end + 1; - end if; - elsif l_text_start > 0 and (l_text_start < l_ml_comment_start or l_ml_comment_start = 0) - 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 - l_end := instr(a_source,q'[']',l_text_start+1); - - --skip double quotes while searching for end of quoted text - 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; - if l_end > 0 then - l_end := l_end + 1; - end if; - - elsif l_escaped_text_start > 0 and (l_escaped_text_start < l_ml_comment_start or l_ml_comment_start = 0) - 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 "]" - l_escaped_text_end_char := translate( substr(a_source, l_escaped_text_start + 2, 1), '[{(<', ']})>'); - l_end := instr(a_source,l_escaped_text_end_char||'''',l_escaped_text_start + 3 ); - if l_end > 0 then - l_end := l_end + 2; - end if; - end if; - - if l_end = 0 then - append_to_clob(l_result, substr(a_source, l_offset, l_length-l_offset)); - else - append_to_clob(l_result, substr(a_source, l_offset, l_end-l_offset)); - end if; - end if; - l_offset := l_end; - if l_offset >= l_ml_comment_start then - l_ml_comment_start := instr(a_source,'/*',l_offset); - end if; - if l_offset >= l_comment_start then - l_comment_start := instr(a_source,'--',l_offset); - end if; - if l_offset >= l_text_start then - l_text_start := instr(a_source,'''',l_offset); - end if; - if l_offset >= l_escaped_text_start then - l_escaped_text_start := instr(a_source,q'[q']',l_offset); - end if; - end loop; - append_to_clob(l_result, substr(a_source, l_end)); - return l_result; - end; - - function get_child_reporters(a_for_reporters ut_reporters_info := null) return ut_reporters_info is - l_for_reporters ut_reporters_info := a_for_reporters; - l_results ut_reporters_info; - begin - if l_for_reporters is null then - l_for_reporters := ut_reporters_info(ut_reporter_info('UT_REPORTER_BASE','N','N','N')); - end if; - - 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; - - 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); - l_ora_search_pattern varchar2(500) := '^ORA'||a_ora_code||': (.*)$'; - begin - l_caller_stack_line := regexp_replace(srcstr => a_error_stack - ,pattern => l_ora_search_pattern - ,replacestr => null - ,position => 1 - ,occurrence => 1 - ,modifier => 'm'); - return l_caller_stack_line; - end; - - /** - * Change string into unicode to match xmlgen format _00_ - * 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.7.2935-develop - */ - function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is - begin - 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 - 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 - if i.level_no = 1 and regexp_like(i.string_char,gc_invalid_first_xml_char) then - l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char); - elsif regexp_like(i.string_char,gc_invalid_xml_char) then - l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char); - else - l_post_processed := l_post_processed || i.string_char; - end if; - end loop; - return l_post_processed; - end; - - function get_valid_xml_name(a_name varchar2) return varchar2 is - l_valid_name varchar2(4000); - begin - if regexp_like(a_name,gc_full_valid_xml_name) then - l_valid_name := a_name; - else - l_valid_name := build_valid_xml_name(a_name); - end if; - return l_valid_name; - end; - - function add_prefix(a_list ut_varchar2_list, a_prefix varchar2, a_connector varchar2 := '/') return ut_varchar2_list is - l_result ut_varchar2_list := ut_varchar2_list(); - l_idx binary_integer; - begin - if a_prefix is not null then - l_idx := a_list.first; - while l_idx is not null loop - l_result.extend; - l_result(l_idx) := a_prefix||a_connector||trim(leading a_connector from a_list(l_idx)); - l_idx := a_list.next(l_idx); - end loop; - end if; - return l_result; - end; - -end ut_utils; -/ +create or replace package body ut_utils is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Constants regex used to validate XML name + */ + gc_invalid_first_xml_char constant varchar2(50) := '[^_a-zA-Z]'; + gc_invalid_xml_char constant varchar2(50) := '[^_a-zA-Z0-9\.-]'; + 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 + 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 + if a_test_result = gc_success then + l_result := gc_success_char; + elsif a_test_result = gc_failure then + l_result := gc_failure_char; + elsif a_test_result = gc_error then + l_result := gc_error_char; + elsif a_test_result = gc_disabled then + l_result := gc_disabled_char; + else + l_result := 'Unknown(' || coalesce(to_char(a_test_result),'NULL') || ')'; + end if ; + return l_result; + end test_result_to_char; + + + function to_test_result(a_test boolean) return integer is + l_result integer; + begin + if a_test then + l_result := gc_success; + else + l_result := gc_failure; + end if; + return l_result; + end; + + function gen_savepoint_name return varchar2 is + begin + 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 + 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 + 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); + c_length constant integer := coalesce( length( a_value ), 0 ); + c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); + c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; + begin + if c_length = 0 then + l_result := gc_null_string; + elsif c_length <= c_max_input_string_length then + l_result := surround_with(a_value, a_quote_char); + else + l_result := surround_with(substr(a_value, 1, c_overflow_substr_len ), a_quote_char) || gc_more_data_string; + end if ; + 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); + c_length constant integer := coalesce(dbms_lob.getlength(a_value), 0); + c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); + c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; + begin + if a_value is null then + l_result := gc_null_string; + elsif c_length = 0 then + l_result := gc_empty_string; + elsif c_length <= c_max_input_string_length then + l_result := surround_with(a_value,a_quote_char); + else + l_result := surround_with(dbms_lob.substr(a_value, c_overflow_substr_len), a_quote_char) || gc_more_data_string; + end if; + 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); + c_length constant integer := coalesce(dbms_lob.getlength(a_value), 0); + c_max_input_string_length constant integer := a_max_output_len - coalesce( length( a_quote_char ) * 2, 0 ); + c_overflow_substr_len constant integer := c_max_input_string_length - gc_more_data_string_len; + begin + if a_value is null then + l_result := gc_null_string; + elsif c_length = 0 then + l_result := gc_empty_string; + elsif c_length <= c_max_input_string_length then + l_result := surround_with(rawtohex(a_value),a_quote_char); + else + l_result := to_string( rawtohex(dbms_lob.substr(a_value, c_overflow_substr_len)) ); + end if ; + return l_result; + end; + + function to_string(a_value boolean) return varchar2 is + begin + 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 + return coalesce(to_char(a_value,gc_number_format), gc_null_string); + end; + + function to_string(a_value date) return varchar2 is + begin + return coalesce(to_char(a_value,gc_date_format), gc_null_string); + end; + + function to_string(a_value timestamp_unconstrained) return varchar2 is + begin + 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 + 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 + return coalesce(to_char(a_value,gc_timestamp_format), gc_null_string); + end; + + function to_string(a_value yminterval_unconstrained) return varchar2 IS + begin + return coalesce(to_char(a_value), gc_null_string); + end; + + function to_string(a_value dsinterval_unconstrained) return varchar2 IS + begin + return coalesce(to_char(a_value), gc_null_string); + end; + + + function boolean_to_int(a_value boolean) return integer is + begin + 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 + 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 + l_offset integer := 1; + l_delimiter_position integer; + l_skip_leading_delimiter boolean := coalesce(a_skip_leading_delimiter = 'Y',false); + l_result ut_varchar2_list := ut_varchar2_list(); + begin + if a_string is null then + return l_result; + end if; + if a_delimiter is null then + return ut_varchar2_list(a_string); + end if; + + loop + l_delimiter_position := instr(a_string, a_delimiter, l_offset); + if not (l_delimiter_position = 1 and l_skip_leading_delimiter) then + l_result.extend; + if l_delimiter_position > 0 then + l_result(l_result.last) := substr(a_string, l_offset, l_delimiter_position - l_offset); + else + l_result(l_result.last) := substr(a_string, l_offset); + end if; + end if; + exit when l_delimiter_position = 0; + l_offset := l_delimiter_position + 1; + end loop; + 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 + l_offset integer := 1; + 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; + l_results ut_varchar2_list := ut_varchar2_list(); + l_has_last_line boolean; + l_skip_leading_delimiter varchar2(1) := 'N'; + begin + while l_offset <= l_length loop + l_amount := a_max_amount - coalesce( length(l_last_line), 0 ); + dbms_lob.read(a_clob, l_amount, l_offset, l_buffer); + l_offset := l_offset + l_amount; + + l_string_results := string_to_table( l_last_line || l_buffer, a_delimiter, l_skip_leading_delimiter ); + for i in 1 .. l_string_results.count loop + --if a split of lines was not done or not at the last line + if l_string_results.count = 1 or i < l_string_results.count then + l_results.extend; + 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 + if l_string_results.count = 1 then + l_has_last_line := false; + l_last_line := null; + elsif l_string_results.count > 1 then + l_has_last_line := true; + l_last_line := l_string_results(l_string_results.count); + end if; + + l_skip_leading_delimiter := 'Y'; + end loop; + if l_has_last_line then + l_results.extend; + l_results(l_results.last) := l_last_line; + end if; + 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; + l_table_rows integer := coalesce(cardinality(a_text_table),0); + begin + for i in 1 .. l_table_rows loop + if i < l_table_rows then + append_to_clob(l_result, a_text_table(i)||a_delimiter); + else + append_to_clob(l_result, a_text_table(i)); + end if; + end loop; + 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; + l_table_rows integer := coalesce(cardinality(a_integer_table),0); + begin + for i in 1 .. l_table_rows loop + if i < l_table_rows then + append_to_clob(l_result, a_integer_table(i)||a_delimiter); + else + append_to_clob(l_result, a_integer_table(i)); + end if; + end loop; + 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 + 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 + if a_include_first_line then + 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 + if a_item is not null then + if a_list is null then + a_list := ut_varchar2_list(); + end if; + a_list.extend; + 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 + if a_items is not null then + if a_list is null then + a_list := ut_varchar2_rows(); + end if; + for i in 1 .. a_items.count loop + a_list.extend; + 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 + 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 + if a_item is not null then + if a_list is null then + a_list := ut_varchar2_rows(); + end if; + 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 + a_list.extend; + 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 + if a_clob_table is not null and cardinality(a_clob_table) > 0 then + if a_src_clob is null then + dbms_lob.createtemporary(a_src_clob, true); + end if; + for i in 1 .. a_clob_table.count loop + dbms_lob.append(a_src_clob,a_clob_table(i)); + if i < a_clob_table.count then + 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 + if a_new_data is not null and dbms_lob.getlength(a_new_data) > 0 then + if a_src_clob is null then + dbms_lob.createtemporary(a_src_clob, true); + end if; + 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 + if a_new_data is not null then + if a_src_clob is null then + dbms_lob.createtemporary(a_src_clob, true); + end if; + 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 + if a_collection is not null then + l_result := ut_varchar2_rows(); + for i in 1 .. a_collection.count loop + l_result.extend(); + l_result(i) := substr(a_collection(i),1,gc_max_storage_varchar2_len); + end loop; + end if; + return l_result; + end; + + procedure set_action(a_text in varchar2) is + begin + dbms_application_info.set_module('utPLSQL', a_text); + end; + + procedure set_client_info(a_text in varchar2) is + begin + dbms_application_info.set_client_info(a_text); + 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 + if a_list is not null then + l_iter := a_list.first; + while l_iter is not null loop + l_item := trim(a_list(l_iter)); + if l_item is not null then + if l_item like '%,%' then + l_xpath := l_xpath || to_xpath( l_item, a_ancestors ) || '|'; + elsif l_item like '/%' then + l_xpath := l_xpath || l_item || '|'; + else + l_xpath := l_xpath || a_ancestors || l_item || '|'; + end if; + end if; + l_iter := a_list.next(l_iter); + end loop; + l_xpath := rtrim(l_xpath,',|'); + end if; + return l_xpath; + end; + + procedure cleanup_temp_tables is + begin + execute immediate 'delete from ut_compound_data_tmp'; + execute immediate 'delete from ut_compound_data_diff_tmp'; + end; + + function to_version(a_version_no varchar2) return t_version is + l_result t_version; + c_version_part_regex constant varchar2(20) := '[0-9]+'; + begin + + if regexp_like(a_version_no,'v?([0-9]+(\.|$)){1,4}') then + l_result.major := regexp_substr(a_version_no, c_version_part_regex, 1, 1); + l_result.minor := regexp_substr(a_version_no, c_version_part_regex, 1, 2); + l_result.bugfix := regexp_substr(a_version_no, c_version_part_regex, 1, 3); + l_result.build := regexp_substr(a_version_no, c_version_part_regex, 1, 4); + else + raise_application_error(gc_invalid_version_no, 'Version string "'||a_version_no||'" is not a valid version'); + end if; + return l_result; + end; + + procedure save_dbms_output_to_cache is + l_status number; + l_line varchar2(32767); + l_offset integer := 0; + l_lines ut_varchar2_rows := ut_varchar2_rows(); + c_lines_limit constant integer := 100; + pragma autonomous_transaction; + + procedure flush_lines(a_lines ut_varchar2_rows, a_offset integer) is + begin + insert into ut_dbms_output_cache (seq_no,text) + select rownum+a_offset, column_value + from table(a_lines); + end; + begin + loop + dbms_output.get_line(line => l_line, status => l_status); + exit when l_status = 1; + l_lines := l_lines multiset union all ut_utils.convert_collection(ut_utils.clob_to_table(l_line||chr(7),4000)); + if l_lines.count > c_lines_limit then + flush_lines(l_lines, l_offset); + l_offset := l_offset + l_lines.count; + l_lines.delete; + end if; + end loop; + flush_lines(l_lines, l_offset); + commit; + end; + + procedure read_cache_to_dbms_output is + l_lines_data sys_refcursor; + l_lines ut_varchar2_rows; + c_lines_limit constant integer := 100; + pragma autonomous_transaction; + begin + open l_lines_data for select text from ut_dbms_output_cache order by seq_no; + loop + fetch l_lines_data bulk collect into l_lines limit c_lines_limit; + for i in 1 .. l_lines.count loop + if substr(l_lines(i),-1) = chr(7) then + dbms_output.put_line(rtrim(l_lines(i),chr(7))); + else + dbms_output.put(l_lines(i)); + end if; + end loop; + exit when l_lines_data%notfound; + end loop; + delete from ut_dbms_output_cache; + commit; + end; + + function ut_owner return varchar2 is + begin + return sys_context('userenv','current_schema'); + end; + + function scale_cardinality(a_cardinality natural) return natural is + begin + return nvl(trunc(power(10,(floor(log(10,a_cardinality))+1))/3),0); + end; + + function build_depreciation_warning(a_old_syntax varchar2, a_new_syntax varchar2) return varchar2 is + begin + 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 + return to_char(a_value, gc_number_format, 'NLS_NUMERIC_CHARACTERS=''. '''); + end; + + function get_xml_header(a_encoding varchar2) return varchar2 is + begin + return + ''; + 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 + if a_list is not null then + l_trimmed_list := ut_varchar2_list(); + l_index := a_list.first; + + while (l_index is not null) loop + l_trimmed_list.extend; + l_trimmed_list(l_trimmed_list.count) := regexp_replace(a_list(l_index), '(^['||a_regexp_to_trim||']*)|(['||a_regexp_to_trim||']*$)'); + l_index := a_list.next(l_index); + end loop; + end if; + + 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 + if a_list is not null then + l_filtered_list := ut_varchar2_list(); + l_index := a_list.first; + + while (l_index is not null) loop + if regexp_like(a_list(l_index), a_regexp_filter) then + l_filtered_list.extend; + l_filtered_list(l_filtered_list.count) := a_list(l_index); + end if; + l_index := a_list.next(l_index); + end loop; + end if; + + 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; + l_ml_comment_start binary_integer := 1; + l_comment_start binary_integer := 1; + l_text_start binary_integer := 1; + l_escaped_text_start binary_integer := 1; + l_escaped_text_end_char varchar2(1 char); + l_end binary_integer := 1; + l_ml_comment clob; + l_newlines_count binary_integer; + l_offset binary_integer := 1; + l_length binary_integer := coalesce(dbms_lob.getlength(a_source), 0); + begin + l_ml_comment_start := instr(a_source,'/*'); + l_comment_start := instr(a_source,'--'); + l_text_start := instr(a_source,''''); + l_escaped_text_start := instr(a_source,q'[q']'); + while l_offset > 0 and l_ml_comment_start > 0 loop + + if l_ml_comment_start > 0 and (l_ml_comment_start < l_comment_start or l_comment_start = 0) + 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 + l_end := instr(a_source,'*/',l_ml_comment_start+2); + append_to_clob(l_result, dbms_lob.substr(a_source, l_ml_comment_start-l_offset, l_offset)); + if l_end > 0 then + l_ml_comment := substr(a_source, l_ml_comment_start, l_end-l_ml_comment_start); + l_newlines_count := length( l_ml_comment ) - length( translate( l_ml_comment, 'a'||chr(10), 'a') ); + if l_newlines_count > 0 then + append_to_clob(l_result, lpad( chr(10), l_newlines_count, chr(10) ) ); + end if; + l_end := l_end + 2; + end if; + else + + if l_comment_start > 0 and (l_comment_start < l_ml_comment_start or l_ml_comment_start = 0) + 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 + l_end := instr(a_source,chr(10),l_comment_start+2); + if l_end > 0 then + l_end := l_end + 1; + end if; + elsif l_text_start > 0 and (l_text_start < l_ml_comment_start or l_ml_comment_start = 0) + 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 + l_end := instr(a_source,q'[']',l_text_start+1); + + --skip double quotes while searching for end of quoted text + 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; + if l_end > 0 then + l_end := l_end + 1; + end if; + + elsif l_escaped_text_start > 0 and (l_escaped_text_start < l_ml_comment_start or l_ml_comment_start = 0) + 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 "]" + l_escaped_text_end_char := translate( substr(a_source, l_escaped_text_start + 2, 1), '[{(<', ']})>'); + l_end := instr(a_source,l_escaped_text_end_char||'''',l_escaped_text_start + 3 ); + if l_end > 0 then + l_end := l_end + 2; + end if; + end if; + + if l_end = 0 then + append_to_clob(l_result, substr(a_source, l_offset, l_length-l_offset)); + else + append_to_clob(l_result, substr(a_source, l_offset, l_end-l_offset)); + end if; + end if; + l_offset := l_end; + if l_offset >= l_ml_comment_start then + l_ml_comment_start := instr(a_source,'/*',l_offset); + end if; + if l_offset >= l_comment_start then + l_comment_start := instr(a_source,'--',l_offset); + end if; + if l_offset >= l_text_start then + l_text_start := instr(a_source,'''',l_offset); + end if; + if l_offset >= l_escaped_text_start then + l_escaped_text_start := instr(a_source,q'[q']',l_offset); + end if; + end loop; + append_to_clob(l_result, substr(a_source, l_end)); + return l_result; + end; + + function get_child_reporters(a_for_reporters ut_reporters_info := null) return ut_reporters_info is + l_for_reporters ut_reporters_info := a_for_reporters; + l_results ut_reporters_info; + begin + if l_for_reporters is null then + l_for_reporters := ut_reporters_info(ut_reporter_info('UT_REPORTER_BASE','N','N','N')); + end if; + + 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; + + 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); + l_ora_search_pattern varchar2(500) := '^ORA'||a_ora_code||': (.*)$'; + begin + l_caller_stack_line := regexp_replace(srcstr => a_error_stack + ,pattern => l_ora_search_pattern + ,replacestr => null + ,position => 1 + ,occurrence => 1 + ,modifier => 'm'); + return l_caller_stack_line; + end; + + /** + * Change string into unicode to match xmlgen format _00_ + * 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.7.2935-develop + */ + function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is + begin + 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 + 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 + if i.level_no = 1 and regexp_like(i.string_char,gc_invalid_first_xml_char) then + l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char); + elsif regexp_like(i.string_char,gc_invalid_xml_char) then + l_post_processed := l_post_processed || char_to_xmlgen_unicode(i.string_char); + else + l_post_processed := l_post_processed || i.string_char; + end if; + end loop; + return l_post_processed; + end; + + function get_valid_xml_name(a_name varchar2) return varchar2 is + l_valid_name varchar2(4000); + begin + if regexp_like(a_name,gc_full_valid_xml_name) then + l_valid_name := a_name; + else + l_valid_name := build_valid_xml_name(a_name); + end if; + return l_valid_name; + end; + + function add_prefix(a_list ut_varchar2_list, a_prefix varchar2, a_connector varchar2 := '/') return ut_varchar2_list is + l_result ut_varchar2_list := ut_varchar2_list(); + l_idx binary_integer; + begin + if a_prefix is not null then + l_idx := a_list.first; + while l_idx is not null loop + l_result.extend; + l_result(l_idx) := add_prefix(a_list(l_idx), a_prefix, a_connector); + l_idx := a_list.next(l_idx); + end loop; + end if; + return l_result; + end; + + function add_prefix(a_item varchar2, a_prefix varchar2, a_connector varchar2 := '/') return varchar2 is + begin + 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 + return regexp_replace(a_item,a_prefix||a_connector); + end; + +end ut_utils; +/ diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 3739819fb..03e553ef2 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -1,396 +1,400 @@ -create or replace package ut_utils authid definer is - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - /** - * Common utilities and constants used throughout utPLSQL framework - * - */ - - gc_version constant varchar2(50) := 'v3.1.7.2935-develop'; - - subtype t_executable_type is varchar2(30); - gc_before_all constant t_executable_type := 'beforeall'; - gc_before_each constant t_executable_type := 'beforeeach'; - gc_before_test constant t_executable_type := 'beforetest'; - gc_test_execute constant t_executable_type := 'test'; - gc_after_test constant t_executable_type := 'aftertest'; - gc_after_each constant t_executable_type := 'aftereach'; - gc_after_all constant t_executable_type := 'afterall'; - - /* Constants: Test Results */ - subtype t_test_result is binary_integer range 0 .. 3; - gc_disabled constant t_test_result := 0; -- test/suite was disabled - gc_success constant t_test_result := 1; -- test passed - gc_failure constant t_test_result := 2; -- one or more expectations failed - gc_error constant t_test_result := 3; -- exception was raised - - gc_disabled_char constant varchar2(8) := 'Disabled'; -- test/suite was disabled - gc_success_char constant varchar2(7) := 'Success'; -- test passed - gc_failure_char constant varchar2(7) := 'Failure'; -- one or more expectations failed - gc_error_char constant varchar2(5) := 'Error'; -- exception was raised - - /* - Constants: Rollback type for ut_test_object - */ - subtype t_rollback_type is binary_integer range 0 .. 1; - gc_rollback_auto constant t_rollback_type := 0; -- rollback after each test and suite - gc_rollback_manual constant t_rollback_type := 1; -- leave transaction control manual - gc_rollback_default constant t_rollback_type := gc_rollback_auto; - - ex_unsupported_rollback_type exception; - gc_unsupported_rollback_type constant pls_integer := -20200; - pragma exception_init(ex_unsupported_rollback_type, -20200); - - ex_path_list_is_empty exception; - gc_path_list_is_empty constant pls_integer := -20201; - pragma exception_init(ex_path_list_is_empty, -20201); - - ex_invalid_path_format exception; - gc_invalid_path_format constant pls_integer := -20202; - pragma exception_init(ex_invalid_path_format, -20202); - - ex_suite_package_not_found exception; - gc_suite_package_not_found constant pls_integer := -20204; - pragma exception_init(ex_suite_package_not_found, -20204); - - -- Reporting event time not supported - ex_invalid_rep_event_time exception; - gc_invalid_rep_event_time constant pls_integer := -20210; - pragma exception_init(ex_invalid_rep_event_time, -20210); - - -- Reporting event name not supported - ex_invalid_rep_event_name exception; - gc_invalid_rep_event_name constant pls_integer := -20211; - pragma exception_init(ex_invalid_rep_event_name, -20211); - - -- Any of tests failed - ex_some_tests_failed exception; - gc_some_tests_failed constant pls_integer := -20213; - pragma exception_init(ex_some_tests_failed, -20213); - - -- Version number provided is not in valid format - ex_invalid_version_no exception; - gc_invalid_version_no constant pls_integer := -20214; - pragma exception_init(ex_invalid_version_no, -20214); - - -- Version number provided is not in valid format - ex_out_buffer_timeout exception; - gc_out_buffer_timeout constant pls_integer := -20215; - pragma exception_init(ex_out_buffer_timeout, -20215); - - ex_invalid_package exception; - gc_invalid_package constant pls_integer := -6550; - pragma exception_init(ex_invalid_package, -6550); - - ex_failure_for_all exception; - gc_failure_for_all constant pls_integer := -24381; - pragma exception_init (ex_failure_for_all, -24381); - - ex_dml_for_all exception; - gc_dml_for_all constant pls_integer := -20216; - pragma exception_init (ex_dml_for_all, -20216); - - ex_value_too_large exception; - gc_value_too_large constant pls_integer := -20217; - pragma exception_init (ex_value_too_large, -20217); - - ex_xml_processing exception; - gc_xml_processing constant pls_integer := -19202; - pragma exception_init (ex_xml_processing, -19202); - - ex_failed_open_cur exception; - gc_failed_open_cur constant pls_integer := -20218; - pragma exception_init (ex_failed_open_cur, -20218); - - gc_max_storage_varchar2_len constant integer := 4000; - gc_max_output_string_length constant integer := 4000; - gc_more_data_string constant varchar2(5) := '[...]'; - gc_more_data_string_len constant integer := length( gc_more_data_string ); - gc_number_format constant varchar2(100) := 'TM9'; - gc_date_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ss'; - gc_timestamp_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ssxff'; - gc_timestamp_tz_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ssxff tzh:tzm'; - gc_null_string constant varchar2(4) := 'NULL'; - gc_empty_string constant varchar2(5) := 'EMPTY'; - - gc_bc_fetch_limit constant integer := 1000; - gc_diff_max_rows constant integer := 20; - - type t_version is record( - major natural, - minor natural, - bugfix natural, - build natural - ); - - type t_clob_tab is table of clob; - - /** - * Converts test results into strings - * - * @param a_test_result numeric representation of test result - * - * @return a string representation of a test_result. - */ - function test_result_to_char(a_test_result integer) return varchar2; - - function to_test_result(a_test boolean) return integer; - - /** - * Generates a unique name for a savepoint - * Uses sys_guid, as timestamp gives only miliseconds on Windows and is not unique - * Issue: #506 for details on the implementation approach - */ - function gen_savepoint_name return varchar2; - - procedure debug_log(a_message varchar2); - - procedure debug_log(a_message clob); - - function to_string( - a_value varchar2, - a_quote_char varchar2 := '''', - a_max_output_len in number := gc_max_output_string_length - ) return varchar2; - - function to_string( - a_value clob, - a_quote_char varchar2 := '''', - a_max_output_len in number := gc_max_output_string_length - ) return varchar2; - - function to_string( - a_value blob, - a_quote_char varchar2 := '''', - a_max_output_len in number := gc_max_output_string_length - ) return varchar2; - - function to_string(a_value boolean) return varchar2; - - function to_string(a_value number) return varchar2; - - function to_string(a_value date) return varchar2; - - function to_string(a_value timestamp_unconstrained) return varchar2; - - function to_string(a_value timestamp_tz_unconstrained) return varchar2; - - function to_string(a_value timestamp_ltz_unconstrained) return varchar2; - - function to_string(a_value yminterval_unconstrained) return varchar2; - - function to_string(a_value dsinterval_unconstrained) return varchar2; - - function boolean_to_int(a_value boolean) return integer; - - function int_to_boolean(a_value integer) return boolean; - - /** - * - * Splits a given string into table of string by delimiter. - * The delimiter gets removed. - * If null passed as any of the parameters, empty table is returned. - * If no occurence of a_delimiter found in a_text then text is returned as a single row of the table. - * If no text between delimiters found then an empty row is returned, example: - * string_to_table( 'a,,b', ',' ) gives table ut_varchar2_list( 'a', null, 'b' ); - * - * @param a_string the text to be split. - * @param a_delimiter the delimiter character or string - * @param a_skip_leading_delimiter determines if the leading delimiter should be ignored, used by clob_to_table - * - * @return table of varchar2 values - */ - function string_to_table(a_string varchar2, a_delimiter varchar2:= chr(10), a_skip_leading_delimiter varchar2 := 'N') return ut_varchar2_list; - - /** - * Splits a given string into table of string by delimiter. - * Default value of a_max_amount is 8191 because of code can contains multibyte character. - * The delimiter gets removed. - * If null passed as any of the parameters, empty table is returned. - * If split text is longer than a_max_amount it gets split into pieces of a_max_amount. - * If no text between delimiters found then an empty row is returned, example: - * string_to_table( 'a,,b', ',' ) gives table ut_varchar2_list( 'a', null, 'b' ); - * - * @param a_clob the text to be split. - * @param a_delimiter the delimiter character or string (default chr(10) ) - * @param a_max_amount the maximum length of returned string (default 8191) - * @return table of varchar2 values - */ - function clob_to_table(a_clob clob, a_max_amount integer := 8191, a_delimiter varchar2:= chr(10)) return ut_varchar2_list; - - function table_to_clob(a_text_table ut_varchar2_list, a_delimiter varchar2:= chr(10)) return clob; - - function table_to_clob(a_integer_table ut_integer_list, a_delimiter varchar2:= chr(10)) return clob; - - /** - * Returns time difference in seconds (with miliseconds) between given timestamps - */ - function time_diff(a_start_time timestamp with time zone, a_end_time timestamp with time zone) return number; - - /** - * Returns a text indented with spaces except the first line. - */ - function indent_lines(a_text varchar2, a_indent_size integer := 4, a_include_first_line boolean := false) return varchar2; - - - /** - * Returns a list of object that are part of utPLSQL framework - */ - function get_utplsql_objects_list return ut_object_names; - - /** - * Append a item to the end of ut_varchar2_list - */ - procedure append_to_list(a_list in out nocopy ut_varchar2_list, a_item varchar2); - - /** - * Append a item to the end of ut_varchar2_rows - */ - procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item varchar2); - - /** - * Append a item to the end of ut_varchar2_rows - */ - procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item clob); - - /** - * Append a list of items to the end of ut_varchar2_rows - */ - procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_items ut_varchar2_rows); - - procedure append_to_clob(a_src_clob in out nocopy clob, a_clob_table t_clob_tab, a_delimiter varchar2 := chr(10)); - - procedure append_to_clob(a_src_clob in out nocopy clob, a_new_data clob); - - procedure append_to_clob(a_src_clob in out nocopy clob, a_new_data varchar2); - - function convert_collection(a_collection ut_varchar2_list) return ut_varchar2_rows; - - /** - * Set session's action and module using dbms_application_info - */ - procedure set_action(a_text in varchar2); - - /** - * Set session's client info using dbms_application_info - */ - procedure set_client_info(a_text in varchar2); - - function to_xpath(a_list varchar2, a_ancestors varchar2 := '/*/') return varchar2; - - function to_xpath(a_list ut_varchar2_list, a_ancestors varchar2 := '/*/') return varchar2; - - procedure cleanup_temp_tables; - - /** - * Converts version string into version record - * - * @param a_version_no string representation of version in format vX.X.X.X where X is a positive integer - * @return t_version record with up to four positive numbers containing version - * @throws 20214 if passed version string is not matching version pattern - */ - function to_version(a_version_no varchar2) return t_version; - - - /** - * Saves data from dbms_output buffer into a global temporary table (cache) - * used to store dbms_output buffer captured before the run - * - */ - procedure save_dbms_output_to_cache; - - /** - * Reads data from global temporary table (cache) abd puts it back into dbms_output - * used to recover dbms_output buffer data after a run is complete - * - */ - procedure read_cache_to_dbms_output; - - - /** - * Function is used to reference to utPLSQL owned objects in dynamic sql statements executed from packages with invoker rights - * - * @return the name of the utPSQL schema owner - */ - function ut_owner return varchar2; - - - /** - * Used in dynamic sql select statements to maintain balance between - * number of hard-parses and optimiser accurancy for cardinality of collections - * - * - * @return 3, for inputs of: 1-9; 33 for input of 10 - 99; 333 for (100 - 999) - */ - function scale_cardinality(a_cardinality natural) return natural; - - function build_depreciation_warning(a_old_syntax varchar2, a_new_syntax varchar2) return varchar2; - - /** - * Returns number as string. The value is represented as decimal according to XML standard: - * https://www.w3.org/TR/xmlschema-2/#decimal - */ - function to_xml_number_format(a_value number) return varchar2; - - - /** - * Returns xml header. If a_encoding is not null, header will include encoding attribute with provided value - */ - function get_xml_header(a_encoding varchar2) return varchar2; - - - /** - * Takes a collection of type ut_varchar2_list and it trims the characters passed as arguments for every element - */ - function trim_list_elements(a_list IN ut_varchar2_list, a_regexp_to_trim in varchar2 default '[:space:]') return ut_varchar2_list; - - /** - * Takes a collection of type ut_varchar2_list and it only returns the elements which meets the regular expression - */ - function filter_list(a_list IN ut_varchar2_list, a_regexp_filter in varchar2) return ut_varchar2_list; - - -- Generates XMLGEN escaped string - function xmlgen_escaped_string(a_string in varchar2) return varchar2; - - /** - * Replaces multi-line comments in given source-code with empty lines - */ - function replace_multiline_comments(a_source clob) return clob; - - /** - * Returns list of sub-type reporters for given list of super-type reporters - */ - function get_child_reporters(a_for_reporters ut_reporters_info := null) return ut_reporters_info; - - /** - * Remove given ORA error from stack - */ - function remove_error_from_stack(a_error_stack varchar2, a_ora_code number) return varchar2; - - /** - * Check if xml name is valid if not build a valid name - */ - function get_valid_xml_name(a_name varchar2) return varchar2; - - /** - * Add prefix word to elements of list - */ - function add_prefix(a_list ut_varchar2_list, a_prefix varchar2, a_connector varchar2 := '/') return ut_varchar2_list; - -end ut_utils; -/ +create or replace package ut_utils authid definer is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Common utilities and constants used throughout utPLSQL framework + * + */ + + gc_version constant varchar2(50) := 'v3.1.7.2935-develop'; + + subtype t_executable_type is varchar2(30); + gc_before_all constant t_executable_type := 'beforeall'; + gc_before_each constant t_executable_type := 'beforeeach'; + gc_before_test constant t_executable_type := 'beforetest'; + gc_test_execute constant t_executable_type := 'test'; + gc_after_test constant t_executable_type := 'aftertest'; + gc_after_each constant t_executable_type := 'aftereach'; + gc_after_all constant t_executable_type := 'afterall'; + + /* Constants: Test Results */ + subtype t_test_result is binary_integer range 0 .. 3; + gc_disabled constant t_test_result := 0; -- test/suite was disabled + gc_success constant t_test_result := 1; -- test passed + gc_failure constant t_test_result := 2; -- one or more expectations failed + gc_error constant t_test_result := 3; -- exception was raised + + gc_disabled_char constant varchar2(8) := 'Disabled'; -- test/suite was disabled + gc_success_char constant varchar2(7) := 'Success'; -- test passed + gc_failure_char constant varchar2(7) := 'Failure'; -- one or more expectations failed + gc_error_char constant varchar2(5) := 'Error'; -- exception was raised + + /* + Constants: Rollback type for ut_test_object + */ + subtype t_rollback_type is binary_integer range 0 .. 1; + gc_rollback_auto constant t_rollback_type := 0; -- rollback after each test and suite + gc_rollback_manual constant t_rollback_type := 1; -- leave transaction control manual + gc_rollback_default constant t_rollback_type := gc_rollback_auto; + + ex_unsupported_rollback_type exception; + gc_unsupported_rollback_type constant pls_integer := -20200; + pragma exception_init(ex_unsupported_rollback_type, -20200); + + ex_path_list_is_empty exception; + gc_path_list_is_empty constant pls_integer := -20201; + pragma exception_init(ex_path_list_is_empty, -20201); + + ex_invalid_path_format exception; + gc_invalid_path_format constant pls_integer := -20202; + pragma exception_init(ex_invalid_path_format, -20202); + + ex_suite_package_not_found exception; + gc_suite_package_not_found constant pls_integer := -20204; + pragma exception_init(ex_suite_package_not_found, -20204); + + -- Reporting event time not supported + ex_invalid_rep_event_time exception; + gc_invalid_rep_event_time constant pls_integer := -20210; + pragma exception_init(ex_invalid_rep_event_time, -20210); + + -- Reporting event name not supported + ex_invalid_rep_event_name exception; + gc_invalid_rep_event_name constant pls_integer := -20211; + pragma exception_init(ex_invalid_rep_event_name, -20211); + + -- Any of tests failed + ex_some_tests_failed exception; + gc_some_tests_failed constant pls_integer := -20213; + pragma exception_init(ex_some_tests_failed, -20213); + + -- Version number provided is not in valid format + ex_invalid_version_no exception; + gc_invalid_version_no constant pls_integer := -20214; + pragma exception_init(ex_invalid_version_no, -20214); + + -- Version number provided is not in valid format + ex_out_buffer_timeout exception; + gc_out_buffer_timeout constant pls_integer := -20215; + pragma exception_init(ex_out_buffer_timeout, -20215); + + ex_invalid_package exception; + gc_invalid_package constant pls_integer := -6550; + pragma exception_init(ex_invalid_package, -6550); + + ex_failure_for_all exception; + gc_failure_for_all constant pls_integer := -24381; + pragma exception_init (ex_failure_for_all, -24381); + + ex_dml_for_all exception; + gc_dml_for_all constant pls_integer := -20216; + pragma exception_init (ex_dml_for_all, -20216); + + ex_value_too_large exception; + gc_value_too_large constant pls_integer := -20217; + pragma exception_init (ex_value_too_large, -20217); + + ex_xml_processing exception; + gc_xml_processing constant pls_integer := -19202; + pragma exception_init (ex_xml_processing, -19202); + + ex_failed_open_cur exception; + gc_failed_open_cur constant pls_integer := -20218; + pragma exception_init (ex_failed_open_cur, -20218); + + gc_max_storage_varchar2_len constant integer := 4000; + gc_max_output_string_length constant integer := 4000; + gc_more_data_string constant varchar2(5) := '[...]'; + gc_more_data_string_len constant integer := length( gc_more_data_string ); + gc_number_format constant varchar2(100) := 'TM9'; + gc_date_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ss'; + gc_timestamp_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ssxff'; + gc_timestamp_tz_format constant varchar2(100) := 'yyyy-mm-dd"T"hh24:mi:ssxff tzh:tzm'; + gc_null_string constant varchar2(4) := 'NULL'; + gc_empty_string constant varchar2(5) := 'EMPTY'; + + gc_bc_fetch_limit constant integer := 1000; + gc_diff_max_rows constant integer := 20; + + type t_version is record( + major natural, + minor natural, + bugfix natural, + build natural + ); + + type t_clob_tab is table of clob; + + /** + * Converts test results into strings + * + * @param a_test_result numeric representation of test result + * + * @return a string representation of a test_result. + */ + function test_result_to_char(a_test_result integer) return varchar2; + + function to_test_result(a_test boolean) return integer; + + /** + * Generates a unique name for a savepoint + * Uses sys_guid, as timestamp gives only miliseconds on Windows and is not unique + * Issue: #506 for details on the implementation approach + */ + function gen_savepoint_name return varchar2; + + procedure debug_log(a_message varchar2); + + procedure debug_log(a_message clob); + + function to_string( + a_value varchar2, + a_quote_char varchar2 := '''', + a_max_output_len in number := gc_max_output_string_length + ) return varchar2; + + function to_string( + a_value clob, + a_quote_char varchar2 := '''', + a_max_output_len in number := gc_max_output_string_length + ) return varchar2; + + function to_string( + a_value blob, + a_quote_char varchar2 := '''', + a_max_output_len in number := gc_max_output_string_length + ) return varchar2; + + function to_string(a_value boolean) return varchar2; + + function to_string(a_value number) return varchar2; + + function to_string(a_value date) return varchar2; + + function to_string(a_value timestamp_unconstrained) return varchar2; + + function to_string(a_value timestamp_tz_unconstrained) return varchar2; + + function to_string(a_value timestamp_ltz_unconstrained) return varchar2; + + function to_string(a_value yminterval_unconstrained) return varchar2; + + function to_string(a_value dsinterval_unconstrained) return varchar2; + + function boolean_to_int(a_value boolean) return integer; + + function int_to_boolean(a_value integer) return boolean; + + /** + * + * Splits a given string into table of string by delimiter. + * The delimiter gets removed. + * If null passed as any of the parameters, empty table is returned. + * If no occurence of a_delimiter found in a_text then text is returned as a single row of the table. + * If no text between delimiters found then an empty row is returned, example: + * string_to_table( 'a,,b', ',' ) gives table ut_varchar2_list( 'a', null, 'b' ); + * + * @param a_string the text to be split. + * @param a_delimiter the delimiter character or string + * @param a_skip_leading_delimiter determines if the leading delimiter should be ignored, used by clob_to_table + * + * @return table of varchar2 values + */ + function string_to_table(a_string varchar2, a_delimiter varchar2:= chr(10), a_skip_leading_delimiter varchar2 := 'N') return ut_varchar2_list; + + /** + * Splits a given string into table of string by delimiter. + * Default value of a_max_amount is 8191 because of code can contains multibyte character. + * The delimiter gets removed. + * If null passed as any of the parameters, empty table is returned. + * If split text is longer than a_max_amount it gets split into pieces of a_max_amount. + * If no text between delimiters found then an empty row is returned, example: + * string_to_table( 'a,,b', ',' ) gives table ut_varchar2_list( 'a', null, 'b' ); + * + * @param a_clob the text to be split. + * @param a_delimiter the delimiter character or string (default chr(10) ) + * @param a_max_amount the maximum length of returned string (default 8191) + * @return table of varchar2 values + */ + function clob_to_table(a_clob clob, a_max_amount integer := 8191, a_delimiter varchar2:= chr(10)) return ut_varchar2_list; + + function table_to_clob(a_text_table ut_varchar2_list, a_delimiter varchar2:= chr(10)) return clob; + + function table_to_clob(a_integer_table ut_integer_list, a_delimiter varchar2:= chr(10)) return clob; + + /** + * Returns time difference in seconds (with miliseconds) between given timestamps + */ + function time_diff(a_start_time timestamp with time zone, a_end_time timestamp with time zone) return number; + + /** + * Returns a text indented with spaces except the first line. + */ + function indent_lines(a_text varchar2, a_indent_size integer := 4, a_include_first_line boolean := false) return varchar2; + + + /** + * Returns a list of object that are part of utPLSQL framework + */ + function get_utplsql_objects_list return ut_object_names; + + /** + * Append a item to the end of ut_varchar2_list + */ + procedure append_to_list(a_list in out nocopy ut_varchar2_list, a_item varchar2); + + /** + * Append a item to the end of ut_varchar2_rows + */ + procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item varchar2); + + /** + * Append a item to the end of ut_varchar2_rows + */ + procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_item clob); + + /** + * Append a list of items to the end of ut_varchar2_rows + */ + procedure append_to_list(a_list in out nocopy ut_varchar2_rows, a_items ut_varchar2_rows); + + procedure append_to_clob(a_src_clob in out nocopy clob, a_clob_table t_clob_tab, a_delimiter varchar2 := chr(10)); + + procedure append_to_clob(a_src_clob in out nocopy clob, a_new_data clob); + + procedure append_to_clob(a_src_clob in out nocopy clob, a_new_data varchar2); + + function convert_collection(a_collection ut_varchar2_list) return ut_varchar2_rows; + + /** + * Set session's action and module using dbms_application_info + */ + procedure set_action(a_text in varchar2); + + /** + * Set session's client info using dbms_application_info + */ + procedure set_client_info(a_text in varchar2); + + function to_xpath(a_list varchar2, a_ancestors varchar2 := '/*/') return varchar2; + + function to_xpath(a_list ut_varchar2_list, a_ancestors varchar2 := '/*/') return varchar2; + + procedure cleanup_temp_tables; + + /** + * Converts version string into version record + * + * @param a_version_no string representation of version in format vX.X.X.X where X is a positive integer + * @return t_version record with up to four positive numbers containing version + * @throws 20214 if passed version string is not matching version pattern + */ + function to_version(a_version_no varchar2) return t_version; + + + /** + * Saves data from dbms_output buffer into a global temporary table (cache) + * used to store dbms_output buffer captured before the run + * + */ + procedure save_dbms_output_to_cache; + + /** + * Reads data from global temporary table (cache) abd puts it back into dbms_output + * used to recover dbms_output buffer data after a run is complete + * + */ + procedure read_cache_to_dbms_output; + + + /** + * Function is used to reference to utPLSQL owned objects in dynamic sql statements executed from packages with invoker rights + * + * @return the name of the utPSQL schema owner + */ + function ut_owner return varchar2; + + + /** + * Used in dynamic sql select statements to maintain balance between + * number of hard-parses and optimiser accurancy for cardinality of collections + * + * + * @return 3, for inputs of: 1-9; 33 for input of 10 - 99; 333 for (100 - 999) + */ + function scale_cardinality(a_cardinality natural) return natural; + + function build_depreciation_warning(a_old_syntax varchar2, a_new_syntax varchar2) return varchar2; + + /** + * Returns number as string. The value is represented as decimal according to XML standard: + * https://www.w3.org/TR/xmlschema-2/#decimal + */ + function to_xml_number_format(a_value number) return varchar2; + + + /** + * Returns xml header. If a_encoding is not null, header will include encoding attribute with provided value + */ + function get_xml_header(a_encoding varchar2) return varchar2; + + + /** + * Takes a collection of type ut_varchar2_list and it trims the characters passed as arguments for every element + */ + function trim_list_elements(a_list IN ut_varchar2_list, a_regexp_to_trim in varchar2 default '[:space:]') return ut_varchar2_list; + + /** + * Takes a collection of type ut_varchar2_list and it only returns the elements which meets the regular expression + */ + function filter_list(a_list IN ut_varchar2_list, a_regexp_filter in varchar2) return ut_varchar2_list; + + -- Generates XMLGEN escaped string + function xmlgen_escaped_string(a_string in varchar2) return varchar2; + + /** + * Replaces multi-line comments in given source-code with empty lines + */ + function replace_multiline_comments(a_source clob) return clob; + + /** + * Returns list of sub-type reporters for given list of super-type reporters + */ + function get_child_reporters(a_for_reporters ut_reporters_info := null) return ut_reporters_info; + + /** + * Remove given ORA error from stack + */ + function remove_error_from_stack(a_error_stack varchar2, a_ora_code number) return varchar2; + + /** + * Check if xml name is valid if not build a valid name + */ + function get_valid_xml_name(a_name varchar2) return varchar2; + + /** + * Add prefix word to elements of list + */ + function add_prefix(a_list ut_varchar2_list, a_prefix varchar2, a_connector varchar2 := '/') return ut_varchar2_list; + + function add_prefix(a_item varchar2, a_prefix varchar2, a_connector varchar2 := '/') return varchar2; + + function strip_prefix(a_item varchar2, a_prefix varchar2, a_connector varchar2 := '/') return varchar2; + +end ut_utils; +/ diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index fa736ecfb..759e3ad70 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -1,694 +1,694 @@ -create or replace package body ut_compound_data_helper is - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - 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; - - 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 {:ut3_owner:}.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 {:ut3_owner:}.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 - 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.*]' - || 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]' - || 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; - return l_results; - end; - - function generate_not_equal_stmt( - a_data_info ut_cursor_column, a_pk_table ut_varchar2_list - ) return varchar2 - is - l_pk_tab ut_varchar2_list := coalesce(a_pk_table,ut_varchar2_list()); - l_index integer; - l_sql_stmt varchar2(32767); - l_exists boolean := false; - begin - l_index := l_pk_tab.first; - if l_pk_tab.count > 0 then - loop - if a_data_info.access_path = l_pk_tab(l_index) then - l_exists := true; - end if; - exit when l_index = l_pk_tab.count or (a_data_info.access_path = l_pk_tab(l_index)); - l_index := a_pk_table.next(l_index); - end loop; - end if; - if not(l_exists) then - l_sql_stmt := ' (decode(a.'||a_data_info.transformed_name||','||' e.'||a_data_info.transformed_name||',1,0) = 0)'; - end if; - 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 - l_pk_tab ut_varchar2_list := coalesce(a_pk_table,ut_varchar2_list()); - l_index integer; - l_sql_stmt varchar2(32767); - begin - if l_pk_tab.count <> 0 then - l_index:= l_pk_tab.first; - loop - 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 - l_sql_stmt := l_sql_stmt ||' a.'||a_data_info.transformed_name||q'[ = ]'||' e.'||a_data_info.transformed_name; - end if; - exit when (a_data_info.access_path = l_pk_tab(l_index)) or l_index = l_pk_tab.count; - l_index := l_pk_tab.next(l_index); - end loop; - end if; - return l_sql_stmt; - end; - - function generate_equal_sql(a_col_name in varchar2) return varchar2 is - begin - 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 - if a_pk_table is not empty then - l_index:= a_pk_table.first; - loop - 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 - l_sql_stmt := l_sql_stmt ||a_alias||a_data_info.transformed_name; - end if; - exit when (a_data_info.access_path = a_pk_table(l_index)) or l_index = a_pk_table.count; - l_index := a_pk_table.next(l_index); - end loop; - else - l_sql_stmt := a_alias||a_data_info.transformed_name; - end if; - return l_sql_stmt; - end; - - function generate_select_stmt(a_data_info ut_cursor_column, a_alias varchar2 := 'ucd.') - return varchar2 - is - l_alias varchar2(10) := a_alias; - l_col_syntax varchar2(4000); - l_ut_owner varchar2(250) := ut_utils.ut_owner; - begin - if a_data_info.is_sql_diffable = 0 then - l_col_syntax := l_ut_owner ||'.ut_compound_data_helper.get_hash('||l_alias||a_data_info.transformed_name||'.getClobVal()) as '||a_data_info.transformed_name ; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type = 'DATE' then - l_col_syntax := 'to_date('||l_alias||a_data_info.transformed_name||') as '|| a_data_info.transformed_name; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP') then - l_col_syntax := 'to_timestamp('||l_alias||a_data_info.transformed_name||','''||ut_utils.gc_timestamp_format||''') as '|| a_data_info.transformed_name; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP WITH TIME ZONE') then - 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; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP WITH LOCAL TIME ZONE') then - 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 - l_col_syntax := l_alias||a_data_info.transformed_name||' as '|| a_data_info.transformed_name; - end if; - return l_col_syntax; - end; - - function generate_xmltab_stmt(a_data_info ut_cursor_column) return varchar2 is - l_col_type varchar2(4000); - begin - if a_data_info.is_sql_diffable = 0 then - l_col_type := 'XMLTYPE'; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('DATE','TIMESTAMP','TIMESTAMP WITH TIME ZONE', - 'TIMESTAMP WITH LOCAL TIME ZONE') then - l_col_type := 'VARCHAR2(50)'; - elsif a_data_info.is_sql_diffable = 1 and type_no_length(a_data_info.column_type) then - l_col_type := a_data_info.column_type; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('VARCHAR2','CHAR') then - l_col_type := 'VARCHAR2('||greatest(a_data_info.column_len,4000)||')'; - 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 - l_col_type := a_data_info.column_type; - else - l_col_type := a_data_info.column_type - ||case when a_data_info.column_len is not null - then '('||a_data_info.column_len||')' - else null - end; - end if; - 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; - l_xmltab_list ut_varchar2_list := ut_varchar2_list(); - l_select_list ut_varchar2_list := ut_varchar2_list(); - l_partition_list ut_varchar2_list := ut_varchar2_list(); - l_equal_list ut_varchar2_list := ut_varchar2_list(); - l_join_by_list ut_varchar2_list := ut_varchar2_list(); - 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 - if a_list_element is not null then - a_list.extend; - a_list(a_list.last) := a_list_element; - end if; - end; - - begin - if a_data_info is not empty then - for i in 1..a_data_info.count loop - if a_data_info(i).has_nested_col = 0 then - --Get XMLTABLE column list - add_element_to_list(l_xmltab_list,generate_xmltab_stmt(a_data_info(i))); - --Get Select statment list of columns - add_element_to_list(l_select_list, generate_select_stmt(a_data_info(i))); - --Get columns by which we partition - add_element_to_list(l_partition_list,generate_partition_stmt(a_data_info(i), a_pk_table)); - --Get equal statement - add_element_to_list(l_equal_list,generate_equal_sql(a_data_info(i).transformed_name)); - --Generate join by stmt - add_element_to_list(l_join_by_list,generate_join_by_stmt(a_data_info(i), a_pk_table)); - --Generate not equal stmt - add_element_to_list(l_not_equal_list,generate_not_equal_stmt(a_data_info(i), a_pk_table)); - end if; - end loop; - - a_xml_stmt := nullif(','||ut_utils.table_to_clob(l_xmltab_list, ' , '),','); - a_select_stmt := nullif(','||ut_utils.table_to_clob(l_select_list, ' , '),','); - l_partition_tmp := ut_utils.table_to_clob(l_partition_list, ' , '); - ut_utils.append_to_clob(a_partition_stmt,' row_number() over (partition by '||l_partition_tmp||' order by '||l_partition_tmp||' ) '); - - if a_pk_table.count > 0 then - -- If key defined do the join or these and where on diffrences - a_join_by_stmt := ut_utils.table_to_clob(l_join_by_list, ' and '); - elsif a_unordered then - -- If no key defined do the join on all columns - 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 - a_join_by_stmt := 'a.item_no = e.item_no '; - end if; - a_not_equal_stmt := ut_utils.table_to_clob(l_not_equal_list, ' or '); - else - --Partition by piece when no data - ut_utils.append_to_clob(a_partition_stmt,' 1 '); - 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_ut_owner varchar2(250) := ut_utils.ut_owner; - l_join_by_list ut_varchar2_list; - - function get_join_type(a_inclusion_compare in boolean,a_negated in boolean) return varchar2 is - begin - return - case - when a_inclusion_compare and not(a_negated) then ' right outer join ' - 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 - return - case - 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. - */ - l_join_by_list := - case - 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; - - dbms_lob.createtemporary(l_compare_sql, true); - --Initiate a SQL template with placeholders - ut_utils.append_to_clob(l_compare_sql, g_compare_sql_template); - --Generate a pieceso of dynamic SQL that will substitute placeholders - 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 - ); - - l_compare_sql := replace(l_compare_sql,'{:duplicate_number:}',l_partition_stmt); - l_compare_sql := replace(l_compare_sql,'{:columns:}',l_select_stmt); - l_compare_sql := replace(l_compare_sql,'{:ut3_owner:}',l_ut_owner); - l_compare_sql := replace(l_compare_sql,'{:xml_to_columns:}',l_xmltable_stmt); - l_compare_sql := replace(l_compare_sql,'{:item_no:}',get_item_no(a_unordered)); - l_compare_sql := replace(l_compare_sql,'{:join_type:}',get_join_type(a_inclusion_type,a_is_negated)); - l_compare_sql := replace(l_compare_sql,'{:join_condition:}',l_join_on_stmt); - - 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 - 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 - if a_inclusion_type then - ut_utils.append_to_clob(l_where_stmt,case when a_is_negated then ' 1 = 1 ' else ' ( a.data_id is null ) ' end); - else - ut_utils.append_to_clob(l_where_stmt,' (a.data_id is null or e.data_id is null) '); - end if; - - l_compare_sql := replace(l_compare_sql,'{:where_condition:}',l_where_stmt); - return l_compare_sql; - end; - - function get_column_extract_path(a_cursor_info ut_cursor_column_tab) return ut_varchar2_list is - l_column_list ut_varchar2_list := ut_varchar2_list(); - begin - for i in 1..a_cursor_info.count loop - l_column_list.extend; - l_column_list(l_column_list.last) := a_cursor_info(i).access_path; - end loop; - 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 - l_act_extract_xpath varchar2(32767):= ut_utils.to_xpath(get_column_extract_path(a_act_cursor_info)); - l_exp_extract_xpath varchar2(32767):= ut_utils.to_xpath(get_column_extract_path(a_exp_cursor_info)); - l_join_xpath varchar2(32767) := ut_utils.to_xpath(a_join_by_list); - l_results tt_row_diffs; - l_sql varchar2(32767); - begin - 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 ( ]' - || 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,]' - ||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 - ]' - 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; - 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; - return l_results; - end; - - function get_hash(a_data raw, a_hash_type binary_integer := dbms_crypto.hash_sh1) return t_hash is - begin - 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 - return dbms_crypto.hash(a_data, a_hash_type); - end; - - function get_fixed_size_hash(a_string varchar2, a_base integer :=0,a_size integer := 9999999) return number is - begin - 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 - 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 - g_diff_count := a_rows_diff; - end; - - procedure cleanup_diff is - begin - g_diff_count := 0; - end; - - function get_rows_diff_count return integer is - begin - 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 - if a_type_name IN (g_type_name_map(dbms_sql.blob_type), - g_type_name_map(dbms_sql.clob_type), - g_type_name_map(dbms_sql.long_type), - g_type_name_map(dbms_sql.long_raw_type), - g_type_name_map(dbms_sql.bfile_type), - g_anytype_name_map(dbms_types.typecode_namedcollection)) - then - l_assert := false; - else - l_assert := true; - end if; - return l_assert; - end; - - function get_column_type_desc(a_type_code in integer, a_dbms_sql_desc in boolean) - return varchar2 is - begin - return - case - 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 - open l_diff_cursor for a_diff_cursor_text using a_self_id, a_other_id; - return l_diff_cursor; - end; - - function create_err_cursor_msg(a_error_stack varchar2) return varchar2 is - begin - 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)|| - 'Check the query and data for errors.'; - end; - - function type_no_length ( a_type_name varchar2) return boolean is - begin - return case - when g_type_no_length_map.exists(a_type_name) then - true - else - false - end; - end; - -begin - g_anytype_name_map(dbms_types.typecode_date) := 'DATE'; - g_anytype_name_map(dbms_types.typecode_number) := 'NUMBER'; - g_anytype_name_map(3 /*INTEGER in object type*/) := 'NUMBER'; - g_anytype_name_map(dbms_types.typecode_raw) := 'RAW'; - g_anytype_name_map(dbms_types.typecode_char) := 'CHAR'; - g_anytype_name_map(dbms_types.typecode_varchar2) := 'VARCHAR2'; - g_anytype_name_map(dbms_types.typecode_varchar) := 'VARCHAR'; - g_anytype_name_map(dbms_types.typecode_blob) := 'BLOB'; - g_anytype_name_map(dbms_types.typecode_bfile) := 'BFILE'; - g_anytype_name_map(dbms_types.typecode_clob) := 'CLOB'; - g_anytype_name_map(dbms_types.typecode_timestamp) := 'TIMESTAMP'; - g_anytype_name_map(dbms_types.typecode_timestamp_tz) := 'TIMESTAMP WITH TIME ZONE'; - g_anytype_name_map(dbms_types.typecode_timestamp_ltz) := 'TIMESTAMP WITH LOCAL TIME ZONE'; - g_anytype_name_map(dbms_types.typecode_interval_ym) := 'INTERVAL YEAR TO MONTH'; - g_anytype_name_map(dbms_types.typecode_interval_ds) := 'INTERVAL DAY TO SECOND'; - g_anytype_name_map(dbms_types.typecode_bfloat) := 'BINARY_FLOAT'; - g_anytype_name_map(dbms_types.typecode_bdouble) := 'BINARY_DOUBLE'; - g_anytype_name_map(dbms_types.typecode_urowid) := 'UROWID'; - g_anytype_name_map(dbms_types.typecode_varray) := 'VARRRAY'; - g_anytype_name_map(dbms_types.typecode_table) := 'TABLE'; - g_anytype_name_map(dbms_types.typecode_namedcollection) := 'NAMEDCOLLECTION'; - g_anytype_name_map(dbms_types.typecode_object) := 'OBJECT'; - - g_type_name_map( dbms_sql.binary_bouble_type ) := 'BINARY_DOUBLE'; - g_type_name_map( dbms_sql.bfile_type ) := 'BFILE'; - g_type_name_map( dbms_sql.binary_float_type ) := 'BINARY_FLOAT'; - g_type_name_map( dbms_sql.blob_type ) := 'BLOB'; - g_type_name_map( dbms_sql.long_raw_type ) := 'LONG RAW'; - g_type_name_map( dbms_sql.char_type ) := 'CHAR'; - g_type_name_map( dbms_sql.clob_type ) := 'CLOB'; - g_type_name_map( dbms_sql.long_type ) := 'LONG'; - g_type_name_map( dbms_sql.date_type ) := 'DATE'; - g_type_name_map( dbms_sql.interval_day_to_second_type ) := 'INTERVAL DAY TO SECOND'; - g_type_name_map( dbms_sql.interval_year_to_month_type ) := 'INTERVAL YEAR TO MONTH'; - g_type_name_map( dbms_sql.raw_type ) := 'RAW'; - g_type_name_map( dbms_sql.timestamp_type ) := 'TIMESTAMP'; - g_type_name_map( dbms_sql.timestamp_with_tz_type ) := 'TIMESTAMP WITH TIME ZONE'; - g_type_name_map( dbms_sql.timestamp_with_local_tz_type ) := 'TIMESTAMP WITH LOCAL TIME ZONE'; - g_type_name_map( dbms_sql.varchar2_type ) := 'VARCHAR2'; - g_type_name_map( dbms_sql.number_type ) := 'NUMBER'; - g_type_name_map( dbms_sql.rowid_type ) := 'ROWID'; - g_type_name_map( dbms_sql.urowid_type ) := 'UROWID'; - g_type_name_map( dbms_sql.user_defined_type ) := 'USER_DEFINED_TYPE'; - 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. - */ - g_type_no_length_map('ROWID') := 'ROWID'; - g_type_no_length_map('INTERVAL DAY TO SECOND') := 'INTERVAL DAY TO SECOND'; - g_type_no_length_map('INTERVAL YEAR TO MONTH') := 'INTERVAL YEAR TO MONTH'; - g_type_no_length_map('BINARY_DOUBLE') := 'BINARY_DOUBLE'; - g_type_no_length_map('BINARY_FLOAT') := 'BINARY_FLOAT'; -end; -/ +create or replace package body ut_compound_data_helper is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + 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; + + 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 {:ut3_owner:}.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 {:ut3_owner:}.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 + 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.*]' + || 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]' + || 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; + return l_results; + end; + + function generate_not_equal_stmt( + a_data_info ut_cursor_column, a_pk_table ut_varchar2_list + ) return varchar2 + is + l_pk_tab ut_varchar2_list := coalesce(a_pk_table,ut_varchar2_list()); + l_index integer; + l_sql_stmt varchar2(32767); + l_exists boolean := false; + begin + l_index := l_pk_tab.first; + if l_pk_tab.count > 0 then + loop + if a_data_info.access_path = l_pk_tab(l_index) then + l_exists := true; + end if; + exit when l_index = l_pk_tab.count or (a_data_info.access_path = l_pk_tab(l_index)); + l_index := a_pk_table.next(l_index); + end loop; + end if; + if not(l_exists) then + l_sql_stmt := ' (decode(a.'||a_data_info.transformed_name||','||' e.'||a_data_info.transformed_name||',1,0) = 0)'; + end if; + 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 + l_pk_tab ut_varchar2_list := coalesce(a_pk_table,ut_varchar2_list()); + l_index integer; + l_sql_stmt varchar2(32767); + begin + if l_pk_tab.count <> 0 then + l_index:= l_pk_tab.first; + loop + 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 + l_sql_stmt := l_sql_stmt ||' a.'||a_data_info.transformed_name||q'[ = ]'||' e.'||a_data_info.transformed_name; + end if; + exit when (a_data_info.access_path = l_pk_tab(l_index)) or l_index = l_pk_tab.count; + l_index := l_pk_tab.next(l_index); + end loop; + end if; + return l_sql_stmt; + end; + + function generate_equal_sql(a_col_name in varchar2) return varchar2 is + begin + 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 + if a_pk_table is not empty then + l_index:= a_pk_table.first; + loop + 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 + l_sql_stmt := l_sql_stmt ||a_alias||a_data_info.transformed_name; + end if; + exit when (a_data_info.access_path = a_pk_table(l_index)) or l_index = a_pk_table.count; + l_index := a_pk_table.next(l_index); + end loop; + else + l_sql_stmt := a_alias||a_data_info.transformed_name; + end if; + return l_sql_stmt; + end; + + function generate_select_stmt(a_data_info ut_cursor_column, a_alias varchar2 := 'ucd.') + return varchar2 + is + l_alias varchar2(10) := a_alias; + l_col_syntax varchar2(4000); + l_ut_owner varchar2(250) := ut_utils.ut_owner; + begin + if a_data_info.is_sql_diffable = 0 then + l_col_syntax := l_ut_owner ||'.ut_compound_data_helper.get_hash('||l_alias||a_data_info.transformed_name||'.getClobVal()) as '||a_data_info.transformed_name ; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type = 'DATE' then + l_col_syntax := 'to_date('||l_alias||a_data_info.transformed_name||') as '|| a_data_info.transformed_name; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP') then + l_col_syntax := 'to_timestamp('||l_alias||a_data_info.transformed_name||','''||ut_utils.gc_timestamp_format||''') as '|| a_data_info.transformed_name; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP WITH TIME ZONE') then + 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; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP WITH LOCAL TIME ZONE') then + 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 + l_col_syntax := l_alias||a_data_info.transformed_name||' as '|| a_data_info.transformed_name; + end if; + return l_col_syntax; + end; + + function generate_xmltab_stmt(a_data_info ut_cursor_column) return varchar2 is + l_col_type varchar2(4000); + begin + if a_data_info.is_sql_diffable = 0 then + l_col_type := 'XMLTYPE'; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('DATE','TIMESTAMP','TIMESTAMP WITH TIME ZONE', + 'TIMESTAMP WITH LOCAL TIME ZONE') then + l_col_type := 'VARCHAR2(50)'; + elsif a_data_info.is_sql_diffable = 1 and type_no_length(a_data_info.column_type) then + l_col_type := a_data_info.column_type; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('VARCHAR2','CHAR') then + l_col_type := 'VARCHAR2('||greatest(a_data_info.column_len,4000)||')'; + 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 + l_col_type := a_data_info.column_type; + else + l_col_type := a_data_info.column_type + ||case when a_data_info.column_len is not null + then '('||a_data_info.column_len||')' + else null + end; + end if; + 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; + l_xmltab_list ut_varchar2_list := ut_varchar2_list(); + l_select_list ut_varchar2_list := ut_varchar2_list(); + l_partition_list ut_varchar2_list := ut_varchar2_list(); + l_equal_list ut_varchar2_list := ut_varchar2_list(); + l_join_by_list ut_varchar2_list := ut_varchar2_list(); + 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 + if a_list_element is not null then + a_list.extend; + a_list(a_list.last) := a_list_element; + end if; + end; + + begin + if a_data_info is not empty then + for i in 1..a_data_info.count loop + if a_data_info(i).has_nested_col = 0 then + --Get XMLTABLE column list + add_element_to_list(l_xmltab_list,generate_xmltab_stmt(a_data_info(i))); + --Get Select statment list of columns + add_element_to_list(l_select_list, generate_select_stmt(a_data_info(i))); + --Get columns by which we partition + add_element_to_list(l_partition_list,generate_partition_stmt(a_data_info(i), a_pk_table)); + --Get equal statement + add_element_to_list(l_equal_list,generate_equal_sql(a_data_info(i).transformed_name)); + --Generate join by stmt + add_element_to_list(l_join_by_list,generate_join_by_stmt(a_data_info(i), a_pk_table)); + --Generate not equal stmt + add_element_to_list(l_not_equal_list,generate_not_equal_stmt(a_data_info(i), a_pk_table)); + end if; + end loop; + + a_xml_stmt := nullif(','||ut_utils.table_to_clob(l_xmltab_list, ' , '),','); + a_select_stmt := nullif(','||ut_utils.table_to_clob(l_select_list, ' , '),','); + l_partition_tmp := ut_utils.table_to_clob(l_partition_list, ' , '); + ut_utils.append_to_clob(a_partition_stmt,' row_number() over (partition by '||l_partition_tmp||' order by '||l_partition_tmp||' ) '); + + if a_pk_table.count > 0 then + -- If key defined do the join or these and where on diffrences + a_join_by_stmt := ut_utils.table_to_clob(l_join_by_list, ' and '); + elsif a_unordered then + -- If no key defined do the join on all columns + 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 + a_join_by_stmt := 'a.item_no = e.item_no '; + end if; + a_not_equal_stmt := ut_utils.table_to_clob(l_not_equal_list, ' or '); + else + --Partition by piece when no data + ut_utils.append_to_clob(a_partition_stmt,' 1 '); + 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_ut_owner varchar2(250) := ut_utils.ut_owner; + l_join_by_list ut_varchar2_list; + + function get_join_type(a_inclusion_compare in boolean,a_negated in boolean) return varchar2 is + begin + return + case + when a_inclusion_compare and not(a_negated) then ' right outer join ' + 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 + return + case + 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. + */ + l_join_by_list := + case + 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; + + dbms_lob.createtemporary(l_compare_sql, true); + --Initiate a SQL template with placeholders + ut_utils.append_to_clob(l_compare_sql, g_compare_sql_template); + --Generate a pieceso of dynamic SQL that will substitute placeholders + 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 + ); + + l_compare_sql := replace(l_compare_sql,'{:duplicate_number:}',l_partition_stmt); + l_compare_sql := replace(l_compare_sql,'{:columns:}',l_select_stmt); + l_compare_sql := replace(l_compare_sql,'{:ut3_owner:}',l_ut_owner); + l_compare_sql := replace(l_compare_sql,'{:xml_to_columns:}',l_xmltable_stmt); + l_compare_sql := replace(l_compare_sql,'{:item_no:}',get_item_no(a_unordered)); + l_compare_sql := replace(l_compare_sql,'{:join_type:}',get_join_type(a_inclusion_type,a_is_negated)); + l_compare_sql := replace(l_compare_sql,'{:join_condition:}',l_join_on_stmt); + + 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 + 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 + if a_inclusion_type then + ut_utils.append_to_clob(l_where_stmt,case when a_is_negated then ' 1 = 1 ' else ' ( a.data_id is null ) ' end); + else + ut_utils.append_to_clob(l_where_stmt,' (a.data_id is null or e.data_id is null) '); + end if; + + l_compare_sql := replace(l_compare_sql,'{:where_condition:}',l_where_stmt); + return l_compare_sql; + end; + + function get_column_extract_path(a_cursor_info ut_cursor_column_tab) return ut_varchar2_list is + l_column_list ut_varchar2_list := ut_varchar2_list(); + begin + for i in 1..a_cursor_info.count loop + l_column_list.extend; + l_column_list(l_column_list.last) := a_cursor_info(i).access_path; + end loop; + 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 + l_act_extract_xpath varchar2(32767):= ut_utils.to_xpath(get_column_extract_path(a_act_cursor_info)); + l_exp_extract_xpath varchar2(32767):= ut_utils.to_xpath(get_column_extract_path(a_exp_cursor_info)); + l_join_xpath varchar2(32767) := ut_utils.to_xpath(a_join_by_list); + l_results tt_row_diffs; + l_sql varchar2(32767); + begin + 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 ( ]' + || 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,]' + ||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 + ]' + 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; + 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; + return l_results; + end; + + function get_hash(a_data raw, a_hash_type binary_integer := dbms_crypto.hash_sh1) return t_hash is + begin + 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 + return dbms_crypto.hash(a_data, a_hash_type); + end; + + function get_fixed_size_hash(a_string varchar2, a_base integer :=0,a_size integer := 9999999) return number is + begin + 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 + 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 + g_diff_count := a_rows_diff; + end; + + procedure cleanup_diff is + begin + g_diff_count := 0; + end; + + function get_rows_diff_count return integer is + begin + 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 + if a_type_name IN (g_type_name_map(dbms_sql.blob_type), + g_type_name_map(dbms_sql.clob_type), + g_type_name_map(dbms_sql.long_type), + g_type_name_map(dbms_sql.long_raw_type), + g_type_name_map(dbms_sql.bfile_type), + g_anytype_name_map(dbms_types.typecode_namedcollection)) + then + l_assert := false; + else + l_assert := true; + end if; + return l_assert; + end; + + function get_column_type_desc(a_type_code in integer, a_dbms_sql_desc in boolean) + return varchar2 is + begin + return + case + 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 + open l_diff_cursor for a_diff_cursor_text using a_self_id, a_other_id; + return l_diff_cursor; + end; + + function create_err_cursor_msg(a_error_stack varchar2) return varchar2 is + begin + 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)|| + 'Check the query and data for errors.'; + end; + + function type_no_length ( a_type_name varchar2) return boolean is + begin + return case + when g_type_no_length_map.exists(a_type_name) then + true + else + false + end; + end; + +begin + g_anytype_name_map(dbms_types.typecode_date) := 'DATE'; + g_anytype_name_map(dbms_types.typecode_number) := 'NUMBER'; + g_anytype_name_map(3 /*INTEGER in object type*/) := 'NUMBER'; + g_anytype_name_map(dbms_types.typecode_raw) := 'RAW'; + g_anytype_name_map(dbms_types.typecode_char) := 'CHAR'; + g_anytype_name_map(dbms_types.typecode_varchar2) := 'VARCHAR2'; + g_anytype_name_map(dbms_types.typecode_varchar) := 'VARCHAR'; + g_anytype_name_map(dbms_types.typecode_blob) := 'BLOB'; + g_anytype_name_map(dbms_types.typecode_bfile) := 'BFILE'; + g_anytype_name_map(dbms_types.typecode_clob) := 'CLOB'; + g_anytype_name_map(dbms_types.typecode_timestamp) := 'TIMESTAMP'; + g_anytype_name_map(dbms_types.typecode_timestamp_tz) := 'TIMESTAMP WITH TIME ZONE'; + g_anytype_name_map(dbms_types.typecode_timestamp_ltz) := 'TIMESTAMP WITH LOCAL TIME ZONE'; + g_anytype_name_map(dbms_types.typecode_interval_ym) := 'INTERVAL YEAR TO MONTH'; + g_anytype_name_map(dbms_types.typecode_interval_ds) := 'INTERVAL DAY TO SECOND'; + g_anytype_name_map(dbms_types.typecode_bfloat) := 'BINARY_FLOAT'; + g_anytype_name_map(dbms_types.typecode_bdouble) := 'BINARY_DOUBLE'; + g_anytype_name_map(dbms_types.typecode_urowid) := 'UROWID'; + g_anytype_name_map(dbms_types.typecode_varray) := 'VARRRAY'; + g_anytype_name_map(dbms_types.typecode_table) := 'TABLE'; + g_anytype_name_map(dbms_types.typecode_namedcollection) := 'NAMEDCOLLECTION'; + g_anytype_name_map(dbms_types.typecode_object) := 'OBJECT'; + + g_type_name_map( dbms_sql.binary_bouble_type ) := 'BINARY_DOUBLE'; + g_type_name_map( dbms_sql.bfile_type ) := 'BFILE'; + g_type_name_map( dbms_sql.binary_float_type ) := 'BINARY_FLOAT'; + g_type_name_map( dbms_sql.blob_type ) := 'BLOB'; + g_type_name_map( dbms_sql.long_raw_type ) := 'LONG RAW'; + g_type_name_map( dbms_sql.char_type ) := 'CHAR'; + g_type_name_map( dbms_sql.clob_type ) := 'CLOB'; + g_type_name_map( dbms_sql.long_type ) := 'LONG'; + g_type_name_map( dbms_sql.date_type ) := 'DATE'; + g_type_name_map( dbms_sql.interval_day_to_second_type ) := 'INTERVAL DAY TO SECOND'; + g_type_name_map( dbms_sql.interval_year_to_month_type ) := 'INTERVAL YEAR TO MONTH'; + g_type_name_map( dbms_sql.raw_type ) := 'RAW'; + g_type_name_map( dbms_sql.timestamp_type ) := 'TIMESTAMP'; + g_type_name_map( dbms_sql.timestamp_with_tz_type ) := 'TIMESTAMP WITH TIME ZONE'; + g_type_name_map( dbms_sql.timestamp_with_local_tz_type ) := 'TIMESTAMP WITH LOCAL TIME ZONE'; + g_type_name_map( dbms_sql.varchar2_type ) := 'VARCHAR2'; + g_type_name_map( dbms_sql.number_type ) := 'NUMBER'; + g_type_name_map( dbms_sql.rowid_type ) := 'ROWID'; + g_type_name_map( dbms_sql.urowid_type ) := 'UROWID'; + g_type_name_map( dbms_sql.user_defined_type ) := 'USER_DEFINED_TYPE'; + 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. + */ + g_type_no_length_map('ROWID') := 'ROWID'; + g_type_no_length_map('INTERVAL DAY TO SECOND') := 'INTERVAL DAY TO SECOND'; + g_type_no_length_map('INTERVAL YEAR TO MONTH') := 'INTERVAL YEAR TO MONTH'; + g_type_no_length_map('BINARY_DOUBLE') := 'BINARY_DOUBLE'; + g_type_no_length_map('BINARY_FLOAT') := 'BINARY_FLOAT'; +end; +/ diff --git a/source/expectations/data_values/ut_cursor_column.tpb b/source/expectations/data_values/ut_cursor_column.tpb index 3c6931a5d..835a7ee04 100644 --- a/source/expectations/data_values/ut_cursor_column.tpb +++ b/source/expectations/data_values/ut_cursor_column.tpb @@ -1,69 +1,70 @@ -create or replace 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 - self.parent_name := a_parent_name; --Name of the parent if its nested - self.hierarchy_level := a_hierarchy_level; --Hierarchy level - self.column_position := a_col_position; --Position of the column in cursor/ type - self.column_len := a_col_max_len; --length of column - self.column_precision := a_col_precision; - self.column_scale := a_col_scale; - self.column_name := TRIM( BOTH '''' FROM a_col_name); --name of the column - self.column_type_name := coalesce(a_col_type_name,a_col_type); --type name e.g. test_dummy_object or varchar2 - self.xml_valid_name := ut_utils.get_valid_xml_name(self.column_name); - 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 - 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 incldue exclude eg/ TEST_DUMMY_OBJECT/VARCHAR2 - 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)||'"' - 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 - self.column_type := a_col_type; --column type e.g. user_defined , varchar2 - self.column_schema := a_col_schema_name; -- schema name - self.is_sql_diffable := case - when lower(self.column_type) = 'user_defined_type' then - 0 - -- Due to bug in 11g/12.1 collection fails on varchar 4000+ - 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 - self.is_collection := a_collection; - 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 - 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); - return; - end; - - constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result is - begin - return; - end; -end; -/ +create or replace 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 + self.parent_name := a_parent_name; --Name of the parent if its nested + self.hierarchy_level := a_hierarchy_level; --Hierarchy level + self.column_position := a_col_position; --Position of the column in cursor/ type + self.column_len := a_col_max_len; --length of column + self.column_precision := a_col_precision; + self.column_scale := a_col_scale; + self.column_name := TRIM( BOTH '''' FROM a_col_name); --name of the column + self.column_type_name := coalesce(a_col_type_name,a_col_type); --type name e.g. test_dummy_object or varchar2 + self.xml_valid_name := ut_utils.get_valid_xml_name(self.column_name); + 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 + 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 + self.filter_path := '/'||self.access_path; --Filter path will differ from access path in anydata type + 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)||'"' + 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 + self.column_type := a_col_type; --column type e.g. user_defined , varchar2 + self.column_schema := a_col_schema_name; -- schema name + self.is_sql_diffable := case + when lower(self.column_type) = 'user_defined_type' then + 0 + -- Due to bug in 11g/12.1 collection fails on varchar 4000+ + 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 + self.is_collection := a_collection; + 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 + 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); + return; + end; + + constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result is + begin + return; + end; +end; +/ diff --git a/source/expectations/data_values/ut_cursor_column.tps b/source/expectations/data_values/ut_cursor_column.tps index db9cbd3ae..da3c004f2 100644 --- a/source/expectations/data_values/ut_cursor_column.tps +++ b/source/expectations/data_values/ut_cursor_column.tps @@ -1,51 +1,52 @@ -create or replace type ut_cursor_column force authid current_user as object ( - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - parent_name varchar2(4000), - access_path varchar2(4000), - display_path varchar2(4000), - has_nested_col number(1,0), - transformed_name varchar2(2000), - hierarchy_level number, - column_position number, - xml_valid_name varchar2(2000), - column_name varchar2(2000), - column_type varchar2(128), - column_type_name varchar2(128), - column_schema varchar2(128), - column_len integer, - column_precision integer, - column_scale integer, - is_sql_diffable number(1, 0), - is_collection number(1, 0), - - 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 in varchar2, a_collection integer,a_access_path in varchar2, a_col_precision in integer, - a_col_scale integer), - - 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, - - constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result -) -/ +create or replace type ut_cursor_column authid current_user as object ( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + parent_name varchar2(4000), + access_path varchar2(4000), + filter_path varchar2(4000), + display_path varchar2(4000), + has_nested_col number(1,0), + transformed_name varchar2(2000), + hierarchy_level number, + column_position number, + xml_valid_name varchar2(2000), + column_name varchar2(2000), + column_type varchar2(128), + column_type_name varchar2(128), + column_schema varchar2(128), + column_len integer, + column_precision integer, + column_scale integer, + is_sql_diffable number(1, 0), + is_collection number(1, 0), + + 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 in varchar2, a_collection integer,a_access_path in varchar2, a_col_precision in integer, + a_col_scale integer), + + 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, + + constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result +) +/ diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index 99e1d4edc..2a70a51dd 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -1,286 +1,257 @@ -create or replace 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 - 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; - 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 - 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 - l_elements_info := ut_metadata.get_anytype_members_info( a_compound_data ); - l_is_collection := ut_metadata.is_collection(l_elements_info.type_code); - if l_elements_info.elements_count is null then - l_element_info := ut_metadata.get_attr_elem_info( a_compound_data ); - self.cursor_columns_info.extend; - 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 - ); - if l_element_info.attr_elt_type is not null then - 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 - while l_idx <= l_elements_info.elements_count loop - l_element_info := ut_metadata.get_attr_elem_info( a_compound_data, l_idx ); - - self.cursor_columns_info.extend; - 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 - ); - if l_element_info.attr_elt_type is not null then - 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; - 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 - self.cursor_columns_info := ut_cursor_column_tab(); - 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; - l_hierarchy_level integer := 1; - begin - self.cursor_columns_info := ut_cursor_column_tab(); - 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); - **/ - for pos in 1 .. l_columns_count loop - l_is_collection := ut_metadata.is_collection( l_columns_desc(pos).col_schema_name, l_columns_desc(pos).col_type_name ); - self.cursor_columns_info.extend; - 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 - ); - - if l_columns_desc(pos).col_type = dbms_sql.user_defined_type or l_is_collection then - 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; - return; - end; - - member function contains_collection return boolean is - l_collection_elements number; - begin - select count(1) into l_collection_elements - from table(cursor_columns_info) c - where c.is_collection = 1 and rownum = 1; - 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; - l_root varchar2(125); - begin - if self.is_anydata = 1 then - l_root := get_root; - end if; - --regexp_replace(c.access_path,'^\/?([^\/]+\/){1}') - 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.access_path,'^/?'|| - case - when self.is_anydata = 1 then - l_root||'/'||trim (leading '/' from fl.column_value) - else - fl.column_value - end||'($|/.*)' - ) - ) - order by fl.column_value; - return l_result; - end; - - member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options) is - l_result ut_cursor_details := self; - l_column_tab ut_cursor_column_tab := ut_cursor_column_tab(); - l_column ut_cursor_column; - l_root varchar2(125); - c_xpath_extract_reg constant varchar2(50) := '^((/ROW/)|^(//)|^(/\*/))?(.*)'; - begin - if l_result.cursor_columns_info is not null then - - if self.is_anydata = 1 then - l_root := get_root; - end if; - - --limit columns to those on the include items minus exclude items - if a_match_options.include.items.count > 0 then - -- if include - exclude = 0 then keep all columns - if a_match_options.include.items != a_match_options.exclude.items then - 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.access_path,'^/?'|| - case - when self.is_anydata = 1 then - l_root||'/'||trim(leading '/' from f.col_names) - else - f.col_names - end||'($|/.*)' - ) - ) - or x.hierarchy_level = case when self.is_anydata = 1 then 1 else 0 end ; - end if; - elsif a_match_options.exclude.items.count > 0 then - 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.access_path,'^/?'|| - case - when self.is_anydata = 1 then - l_root||'/'||trim(leading '/' from f.col_names) - else - f.col_names - end||'($|/.*)' ) - ); - end if; - - --Rewrite column order after columns been excluded - for i in ( - 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 - l_column := i.col_info; - l_column.column_position := i.new_position; - l_column_tab.extend; - l_column_tab(l_column_tab.last) := l_column; - end loop; - - l_result.cursor_columns_info := l_column_tab; - self := l_result; - end if; - end; - - member function get_xml_children(a_parent_name varchar2 := null) return xmltype is - l_result xmltype; - begin - 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; - return l_result; - end; - - member procedure has_anydata(self in out nocopy ut_cursor_details, a_is_anydata in boolean :=false) is - begin - self.is_anydata := case when nvl(a_is_anydata,false) then 1 else 0 end; - end; - - member function has_anydata return boolean is - begin - return ut_utils.int_to_boolean(nvl(self.is_anydata,0)); - end; - - member function get_root return varchar2 is - l_root varchar2(250); - begin - if self.cursor_columns_info.count > 0 then - select x.access_path into l_root from table(self.cursor_columns_info) x - where x.hierarchy_level = 1; - else - l_root := null; - end if; - return l_root; - end; - -end; -/ +create or replace 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 + 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; + 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 + 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 + l_elements_info := ut_metadata.get_anytype_members_info( a_compound_data ); + l_is_collection := ut_metadata.is_collection(l_elements_info.type_code); + if l_elements_info.elements_count is null then + l_element_info := ut_metadata.get_attr_elem_info( a_compound_data ); + self.cursor_columns_info.extend; + 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 + ); + if l_element_info.attr_elt_type is not null then + 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 + while l_idx <= l_elements_info.elements_count loop + l_element_info := ut_metadata.get_attr_elem_info( a_compound_data, l_idx ); + + self.cursor_columns_info.extend; + 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 + ); + if l_element_info.attr_elt_type is not null then + 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; + 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 + self.cursor_columns_info := ut_cursor_column_tab(); + 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; + l_hierarchy_level integer := 1; + begin + self.cursor_columns_info := ut_cursor_column_tab(); + self.is_anydata := 0; + 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); + **/ + for pos in 1 .. l_columns_count loop + l_is_collection := ut_metadata.is_collection( l_columns_desc(pos).col_schema_name, l_columns_desc(pos).col_type_name ); + self.cursor_columns_info.extend; + 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 + ); + + if l_columns_desc(pos).col_type = dbms_sql.user_defined_type or l_is_collection then + 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; + return; + end; + + member function contains_collection return boolean is + l_collection_elements number; + begin + select count(1) into l_collection_elements + from table(cursor_columns_info) c + where c.is_collection = 1 and rownum = 1; + 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}') + 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; + return l_result; + end; + + member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options) is + l_result ut_cursor_details := self; + l_column_tab ut_cursor_column_tab := ut_cursor_column_tab(); + l_column ut_cursor_column; + c_xpath_extract_reg constant varchar2(50) := '^((/ROW/)|^(//)|^(/\*/))?(.*)'; + begin + if l_result.cursor_columns_info is not null then + + --limit columns to those on the include items minus exclude items + if a_match_options.include.items.count > 0 then + -- if include - exclude = 0 then keep all columns + if a_match_options.include.items != a_match_options.exclude.items then + 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; + elsif a_match_options.exclude.items.count > 0 then + 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 + for i in ( + 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 + l_column := i.col_info; + l_column.column_position := i.new_position; + l_column_tab.extend; + l_column_tab(l_column_tab.last) := l_column; + end loop; + + l_result.cursor_columns_info := l_column_tab; + self := l_result; + end if; + end; + + member function get_xml_children(a_parent_name varchar2 := null) return xmltype is + l_result xmltype; + begin + 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; + return l_result; + end; + + member function get_root return varchar2 is + l_root varchar2(250); + begin + if self.cursor_columns_info.count > 0 then + select x.access_path into l_root from table(self.cursor_columns_info) x + where x.hierarchy_level = 1; + else + l_root := null; + end if; + return l_root; + end; + + member procedure strip_root_from_anydata(self in out nocopy ut_cursor_details) is + l_root varchar2(250) := get_root(); + begin + self.is_anydata := 1; + for i in 1..cursor_columns_info.count loop + self.cursor_columns_info(i).filter_path := ut_utils.strip_prefix(self.cursor_columns_info(i).access_path,l_root); + end loop; + end; + +end; +/ diff --git a/source/expectations/data_values/ut_cursor_details.tps b/source/expectations/data_values/ut_cursor_details.tps index ce5aefbe7..e6c80a3b5 100644 --- a/source/expectations/data_values/ut_cursor_details.tps +++ b/source/expectations/data_values/ut_cursor_details.tps @@ -1,42 +1,41 @@ -create or replace type ut_cursor_details force authid current_user as object ( - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - cursor_columns_info ut_cursor_column_tab, - - /*if type is anydata we need to skip level 1 on joinby / inlude / exclude as its artificial cursor*/ - is_anydata number(1,0), - constructor function ut_cursor_details(self in out nocopy ut_cursor_details) return self as result, - constructor function ut_cursor_details( - self in out nocopy ut_cursor_details,a_cursor_number in number - ) return self as result, - member function equals(a_other ut_cursor_details, a_match_options ut_matcher_options) return boolean, - 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 - ), - member function contains_collection return boolean, - member function get_missing_join_by_columns( a_expected_columns ut_varchar2_list ) return ut_varchar2_list, - member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options), - member function get_xml_children(a_parent_name varchar2 := null) return xmltype, - member procedure has_anydata(self in out nocopy ut_cursor_details, a_is_anydata in boolean := false), - member function has_anydata return boolean, - member function get_root return varchar2 -) -/ +create or replace type ut_cursor_details authid current_user as object ( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + cursor_columns_info ut_cursor_column_tab, + + /*if type is anydata we need to skip level 1 on joinby / inlude / exclude as its artificial cursor*/ + is_anydata number(1,0), + constructor function ut_cursor_details(self in out nocopy ut_cursor_details) return self as result, + constructor function ut_cursor_details( + self in out nocopy ut_cursor_details,a_cursor_number in number + ) return self as result, + member function equals(a_other ut_cursor_details, a_match_options ut_matcher_options) return boolean, + 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 + ), + member function contains_collection return boolean, + member function get_missing_join_by_columns( a_expected_columns ut_varchar2_list ) return ut_varchar2_list, + member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options), + member function get_xml_children(a_parent_name varchar2 := null) return xmltype, + member function get_root return varchar2, + member procedure strip_root_from_anydata(self in out nocopy ut_cursor_details) +) +/ diff --git a/source/expectations/data_values/ut_data_value_anydata.tpb b/source/expectations/data_values/ut_data_value_anydata.tpb index fa59ad67c..808e52197 100644 --- a/source/expectations/data_values/ut_data_value_anydata.tpb +++ b/source/expectations/data_values/ut_data_value_anydata.tpb @@ -1,145 +1,143 @@ -create or replace type body ut_data_value_anydata as - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - overriding member function get_object_info return varchar2 is - begin - return self.data_type || case when self.compound_type = 'collection' then ' [ count = '||self.elements_count||' ]' else null end; - end; - - member function get_extract_path(a_data_value anydata) return varchar2 is - l_path varchar2(10); - begin - if self.compound_type = 'object' then - l_path := '/*/*'; - else - case when ut_metadata.has_collection_members(a_data_value) then - l_path := '/*/*'; - else - l_path := '/*'; - end case; - end if; - return l_path; - end; - - member function get_cursor_sql_from_anydata(a_data_value anydata) return varchar2 is - l_cursor_sql varchar2(32767); - begin - 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); '|| - 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;'; - return l_cursor_sql; - end; - - member procedure init(self in out nocopy ut_data_value_anydata, a_value anydata) is - l_refcursor sys_refcursor; - l_ctx number; - l_ut_owner varchar2(250) := ut_utils.ut_owner; - cursor_not_open exception; - l_cursor_number number; - l_anydata_sql varchar2(32767); - begin - self.data_type := ut_metadata.get_anydata_typename(a_value); - self.compound_type := get_instance(a_value); - self.is_data_null := ut_metadata.is_anytype_null(a_value,self.compound_type); - self.data_id := sys_guid(); - self.self_type := $$plsql_unit; - self.cursor_details := ut_cursor_details(); - - ut_compound_data_helper.cleanup_diff; - - if not self.is_null() then - self.extract_path := get_extract_path(a_value); - l_anydata_sql := get_cursor_sql_from_anydata(a_value); - execute immediate l_anydata_sql using in a_value, in out l_refcursor; - if l_refcursor%isopen then - self.extract_cursor(l_refcursor); - l_cursor_number := dbms_sql.to_cursor_number(l_refcursor); - self.cursor_details := ut_cursor_details(l_cursor_number); - self.cursor_details.has_anydata(true); - 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 - l_result := ut_metadata.get_anydata_compound_type(a_data_value); - 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; - 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 - init(a_value); - 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 - l_result integer := 0; - begin - if not a_other is of (ut_data_value_anydata) then - raise value_error; - end if; - l_result := l_result + (self as ut_data_value_refcursor).compare_implementation(a_other,a_match_options,a_inclusion_compare,a_is_negated); - return l_result; - end; - - overriding member function is_empty return boolean is - begin - if self.compound_type = 'collection' then - return self.elements_count = 0; - else - raise value_error; - end if; - end; - -end; -/ +create or replace type body ut_data_value_anydata as + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + overriding member function get_object_info return varchar2 is + begin + return self.data_type || case when self.compound_type = 'collection' then ' [ count = '||self.elements_count||' ]' else null end; + end; + + member function get_extract_path(a_data_value anydata) return varchar2 is + l_path varchar2(10); + begin + if self.compound_type = 'object' then + l_path := '/*/*'; + else + case when ut_metadata.has_collection_members(a_data_value) then + l_path := '/*/*'; + else + l_path := '/*'; + end case; + end if; + return l_path; + end; + + member function get_cursor_sql_from_anydata(a_data_value anydata) return varchar2 is + l_cursor_sql varchar2(32767); + begin + 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); '|| + 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;'; + 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 + self.data_type := ut_metadata.get_anydata_typename(a_value); + self.compound_type := get_instance(a_value); + self.is_data_null := ut_metadata.is_anytype_null(a_value,self.compound_type); + self.data_id := sys_guid(); + self.self_type := $$plsql_unit; + self.cursor_details := ut_cursor_details(); + + ut_compound_data_helper.cleanup_diff; + + if not self.is_null() then + self.extract_path := get_extract_path(a_value); + l_anydata_sql := get_cursor_sql_from_anydata(a_value); + execute immediate l_anydata_sql using in a_value, in out l_refcursor; + if l_refcursor%isopen then + self.extract_cursor(l_refcursor); + l_cursor_number := dbms_sql.to_cursor_number(l_refcursor); + self.cursor_details := ut_cursor_details(l_cursor_number); + self.cursor_details.strip_root_from_anydata; + 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 + l_result := ut_metadata.get_anydata_compound_type(a_data_value); + 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; + 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 + init(a_value); + 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 + l_result integer := 0; + begin + if not a_other is of (ut_data_value_anydata) then + raise value_error; + end if; + l_result := l_result + (self as ut_data_value_refcursor).compare_implementation(a_other,a_match_options,a_inclusion_compare,a_is_negated); + return l_result; + end; + + overriding member function is_empty return boolean is + begin + if self.compound_type = 'collection' then + return self.elements_count = 0; + else + raise value_error; + end if; + end; + +end; +/ diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index 2aac626e3..b93158cf1 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -1,399 +1,398 @@ -create or replace type body ut_data_value_refcursor as - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - constructor function ut_data_value_refcursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) - return self as result is - begin - init(a_value); - return; - end; - - member procedure extract_cursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) - is - c_bulk_rows constant integer := 10000; - l_cursor sys_refcursor := a_value; - l_ctx number; - l_xml xmltype; - l_ut_owner varchar2(250) := ut_utils.ut_owner; - l_set_id integer := 0; - 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. - ut_expectation_processor.set_xml_nls_params(); - l_ctx := dbms_xmlgen.newContext(l_cursor); - dbms_xmlgen.setNullHandling(l_ctx, dbms_xmlgen.empty_tag); - dbms_xmlgen.setMaxRows(l_ctx, c_bulk_rows); - loop - l_xml := dbms_xmlgen.getxmltype(l_ctx); - 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 - l_xml := xmltype( replace(l_xml.getClobVal(),' 0 then - ut_utils.append_to_clob( l_result, self.cursor_details.get_xml_children().getclobval() ); - end if; - ut_utils.append_to_clob(l_result,chr(10)||(self as ut_compound_data_value).to_string()); - l_result_string := ut_utils.to_string(l_result,null); - dbms_lob.freetemporary(l_result); - end if; - 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; - l_results ut_utils.t_clob_tab := ut_utils.t_clob_tab(); - l_result_string varchar2(32767); - l_other ut_data_value_refcursor; - 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; - - l_act_missing_pk ut_varchar2_list := ut_varchar2_list(); - l_exp_missing_pk ut_varchar2_list := ut_varchar2_list(); - - c_max_rows integer := ut_utils.gc_diff_max_rows; - l_diff_id ut_compound_data_helper.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 - return - case a_col.diff_type - when '-' then - ' Column <'||a_col.expected_name||'> [data-type: '||a_col.expected_type||'] is missing. Expected column position: '||a_col.expected_pos||'.' - when '+' then - ' Column <'||a_col.actual_name||'> [position: '||a_col.actual_pos||', data-type: '||a_col.actual_type||'] is not expected in results.' - when 't' then - ' Column <'||a_col.actual_name||'> data-type is invalid. Expected: '||a_col.expected_type||',' ||' actual: '||a_col.actual_type||'.' - 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 - l_missing_cols ut_varchar2_list := ut_varchar2_list(); - l_result ut_cursor_column_tab; - begin - for i in 1 .. a_column_diffs.count loop - if a_column_diffs(i).diff_type in ('-','+') then - l_missing_cols.extend; - l_missing_cols(l_missing_cols.last) := coalesce(a_column_diffs(i).expected_name, a_column_diffs(i).actual_name); - end if; - end loop; - 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 - ); - 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 - if a_is_unordered then - if a_row_diff.pk_value is not null then - return ' PK '||a_row_diff.pk_value||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; - else - return rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; - end if; - else - return ' Row No. '||a_row_diff.rn||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; - end if; - end; - - begin - if not a_other is of (ut_data_value_refcursor) then - raise value_error; - end if; - l_other := treat(a_other as ut_data_value_refcursor); - l_other.cursor_details.filter_columns(a_match_options); - l_self.cursor_details.filter_columns(a_match_options); - - l_other_cols := l_other.cursor_details.cursor_columns_info; - l_self_cols := l_self.cursor_details.cursor_columns_info; - - dbms_lob.createtemporary(l_result,true); - --diff columns - if not l_self.is_null and not l_other.is_null then - 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() - ); - - if l_column_diffs.count > 0 then - ut_utils.append_to_clob(l_result,chr(10) || 'Columns:' || chr(10)); - l_other_cols := remove_incomparable_cols( l_other_cols, l_column_diffs ); - l_self_cols := remove_incomparable_cols( l_self_cols, l_column_diffs ); - for i in 1 .. l_column_diffs.count loop - l_results.extend; - l_results(l_results.last) := get_col_diff_text(l_column_diffs(i)); - end loop; - ut_utils.append_to_clob(l_result, l_results); - end if; - end if; - - --check for missing pk - if a_match_options.join_by.items.count > 0 then - l_act_missing_pk := l_other.cursor_details.get_missing_join_by_columns( a_match_options.join_by.items ); - 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 - if l_act_missing_pk.count + l_exp_missing_pk.count = 0 then - l_diff_id := ut_compound_data_helper.get_hash( l_self.data_id || l_other.data_id ); - - -- First tell how many rows are different - l_diff_row_count := ut_compound_data_helper.get_rows_diff_count; - if l_diff_row_count > 0 then - 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, - case - 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 - ); - l_message := chr(10) - ||'Rows: [ ' || l_diff_row_count ||' differences' - || case when l_diff_row_count > c_max_rows and l_row_diffs.count > 0 then ', showing first '||c_max_rows end - ||' ]'||chr(10)|| case when l_row_diffs.count = 0 then ' All rows are different as the columns are not matching.' else null end; - ut_utils.append_to_clob( l_result, l_message ); - l_results := ut_utils.t_clob_tab(); - for i in 1 .. l_row_diffs.count loop - l_results.extend; - l_results(l_results.last) := get_diff_message(l_row_diffs(i),a_match_options.unordered); - end loop; - ut_utils.append_to_clob(l_result,l_results); - else - l_message:= chr(10)||'Rows: [ all different ]'||chr(10)||' All rows are different as the columns position is not matching.'; - ut_utils.append_to_clob( l_result, l_message ); - end if; - else - ut_utils.append_to_clob(l_result,chr(10) || 'Unable to join sets:' || chr(10)); - - for i in 1 .. l_exp_missing_pk.count loop - ut_utils.append_to_clob(l_result, ' Join key '||l_exp_missing_pk(i)||' does not exists in expected'||chr(10)); - end loop; - - for i in 1 .. l_act_missing_pk.count loop - ut_utils.append_to_clob(l_result, ' Join key '||l_act_missing_pk(i)||' does not exists in actual'||chr(10)); - end loop; - - if l_self.cursor_details.contains_collection() or l_other.cursor_details.contains_collection() then - 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; - - l_result_string := ut_utils.to_string(l_result,null); - dbms_lob.freetemporary(l_result); - 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 - l_result integer := 0; - 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_compound_data_helper.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; - l_diif_rowcount integer :=0; - begin - l_diff_id := ut_compound_data_helper.get_hash(a_self.data_id||a_other.data_id); - - begin - 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 - 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; - - ut_compound_data_helper.insert_diffs_result( l_diff_tab, l_diff_id ); - --fetch rows for count only - loop - exit when l_diff_tab.count = 0; - l_diif_rowcount := l_diif_rowcount + l_diff_tab.count; - fetch l_cursor bulk collect into l_diff_tab limit ut_utils.gc_bc_fetch_limit; - end loop; - - ut_compound_data_helper.set_rows_diff(l_diif_rowcount); - - --result is OK only if both are same - if l_diif_rowcount = 0 and a_self.is_null = a_other.is_null then - l_result := 0; - else - l_result := 1; - end if; - close l_cursor; - return l_result; - end; - begin - if not a_other is of (ut_data_value_refcursor) then - raise value_error; - end if; - - l_other := treat(a_other as ut_data_value_refcursor); - l_other.cursor_details.filter_columns( a_match_options ); - l_self.cursor_details.filter_columns( a_match_options ); - - if a_match_options.join_by.items.count > 0 then - 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; - - if l_result = 0 then - 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 - l_result := 1; - end if; - - 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 - ); - l_result := l_result + compare_data( l_self, l_other, l_diff_cursor_text ); - end if; - return l_result; - end; - - overriding member function is_empty return boolean is - begin - return self.elements_count = 0; - end; - -end; -/ +create or replace type body ut_data_value_refcursor as + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + constructor function ut_data_value_refcursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) + return self as result is + begin + init(a_value); + return; + end; + + member procedure extract_cursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) + is + c_bulk_rows constant integer := 10000; + l_cursor sys_refcursor := a_value; + l_ctx number; + l_xml xmltype; + l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_set_id integer := 0; + 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. + ut_expectation_processor.set_xml_nls_params(); + l_ctx := dbms_xmlgen.newContext(l_cursor); + dbms_xmlgen.setNullHandling(l_ctx, dbms_xmlgen.empty_tag); + dbms_xmlgen.setMaxRows(l_ctx, c_bulk_rows); + loop + l_xml := dbms_xmlgen.getxmltype(l_ctx); + 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 + l_xml := xmltype( replace(l_xml.getClobVal(),' 0 then + ut_utils.append_to_clob( l_result, self.cursor_details.get_xml_children().getclobval() ); + end if; + ut_utils.append_to_clob(l_result,chr(10)||(self as ut_compound_data_value).to_string()); + l_result_string := ut_utils.to_string(l_result,null); + dbms_lob.freetemporary(l_result); + end if; + 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; + l_results ut_utils.t_clob_tab := ut_utils.t_clob_tab(); + l_result_string varchar2(32767); + l_other ut_data_value_refcursor; + 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; + + l_act_missing_pk ut_varchar2_list := ut_varchar2_list(); + l_exp_missing_pk ut_varchar2_list := ut_varchar2_list(); + + c_max_rows integer := ut_utils.gc_diff_max_rows; + l_diff_id ut_compound_data_helper.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 + return + case a_col.diff_type + when '-' then + ' Column <'||a_col.expected_name||'> [data-type: '||a_col.expected_type||'] is missing. Expected column position: '||a_col.expected_pos||'.' + when '+' then + ' Column <'||a_col.actual_name||'> [position: '||a_col.actual_pos||', data-type: '||a_col.actual_type||'] is not expected in results.' + when 't' then + ' Column <'||a_col.actual_name||'> data-type is invalid. Expected: '||a_col.expected_type||',' ||' actual: '||a_col.actual_type||'.' + 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 + l_missing_cols ut_varchar2_list := ut_varchar2_list(); + l_result ut_cursor_column_tab; + begin + for i in 1 .. a_column_diffs.count loop + if a_column_diffs(i).diff_type in ('-','+') then + l_missing_cols.extend; + l_missing_cols(l_missing_cols.last) := coalesce(a_column_diffs(i).expected_name, a_column_diffs(i).actual_name); + end if; + end loop; + 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 + ); + 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 + if a_is_unordered then + if a_row_diff.pk_value is not null then + return ' PK '||a_row_diff.pk_value||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; + else + return rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; + end if; + else + return ' Row No. '||a_row_diff.rn||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; + end if; + end; + + begin + if not a_other is of (ut_data_value_refcursor) then + raise value_error; + end if; + l_other := treat(a_other as ut_data_value_refcursor); + l_other.cursor_details.filter_columns(a_match_options); + l_self.cursor_details.filter_columns(a_match_options); + + l_other_cols := l_other.cursor_details.cursor_columns_info; + l_self_cols := l_self.cursor_details.cursor_columns_info; + + dbms_lob.createtemporary(l_result,true); + --diff columns + if not l_self.is_null and not l_other.is_null then + 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() + ); + + if l_column_diffs.count > 0 then + ut_utils.append_to_clob(l_result,chr(10) || 'Columns:' || chr(10)); + l_other_cols := remove_incomparable_cols( l_other_cols, l_column_diffs ); + l_self_cols := remove_incomparable_cols( l_self_cols, l_column_diffs ); + for i in 1 .. l_column_diffs.count loop + l_results.extend; + l_results(l_results.last) := get_col_diff_text(l_column_diffs(i)); + end loop; + ut_utils.append_to_clob(l_result, l_results); + end if; + end if; + + --check for missing pk + if a_match_options.join_by.items.count > 0 then + l_act_missing_pk := l_other.cursor_details.get_missing_join_by_columns( a_match_options.join_by.items ); + 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 + if l_act_missing_pk.count + l_exp_missing_pk.count = 0 then + l_diff_id := ut_compound_data_helper.get_hash( l_self.data_id || l_other.data_id ); + + -- First tell how many rows are different + l_diff_row_count := ut_compound_data_helper.get_rows_diff_count; + if l_diff_row_count > 0 then + 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, + case + 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 + ); + l_message := chr(10) + ||'Rows: [ ' || l_diff_row_count ||' differences' + || case when l_diff_row_count > c_max_rows and l_row_diffs.count > 0 then ', showing first '||c_max_rows end + ||' ]'||chr(10)|| case when l_row_diffs.count = 0 then ' All rows are different as the columns are not matching.' else null end; + ut_utils.append_to_clob( l_result, l_message ); + l_results := ut_utils.t_clob_tab(); + for i in 1 .. l_row_diffs.count loop + l_results.extend; + l_results(l_results.last) := get_diff_message(l_row_diffs(i),a_match_options.unordered); + end loop; + ut_utils.append_to_clob(l_result,l_results); + else + l_message:= chr(10)||'Rows: [ all different ]'||chr(10)||' All rows are different as the columns position is not matching.'; + ut_utils.append_to_clob( l_result, l_message ); + end if; + else + ut_utils.append_to_clob(l_result,chr(10) || 'Unable to join sets:' || chr(10)); + + for i in 1 .. l_exp_missing_pk.count loop + ut_utils.append_to_clob(l_result, ' Join key '||l_exp_missing_pk(i)||' does not exists in expected'||chr(10)); + end loop; + + for i in 1 .. l_act_missing_pk.count loop + ut_utils.append_to_clob(l_result, ' Join key '||l_act_missing_pk(i)||' does not exists in actual'||chr(10)); + end loop; + + if l_self.cursor_details.contains_collection() or l_other.cursor_details.contains_collection() then + 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; + + l_result_string := ut_utils.to_string(l_result,null); + dbms_lob.freetemporary(l_result); + 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 + l_result integer := 0; + 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_compound_data_helper.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; + l_diif_rowcount integer :=0; + begin + l_diff_id := ut_compound_data_helper.get_hash(a_self.data_id||a_other.data_id); + + begin + 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 + 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; + + ut_compound_data_helper.insert_diffs_result( l_diff_tab, l_diff_id ); + --fetch rows for count only + loop + exit when l_diff_tab.count = 0; + l_diif_rowcount := l_diif_rowcount + l_diff_tab.count; + fetch l_cursor bulk collect into l_diff_tab limit ut_utils.gc_bc_fetch_limit; + end loop; + + ut_compound_data_helper.set_rows_diff(l_diif_rowcount); + + --result is OK only if both are same + if l_diif_rowcount = 0 and a_self.is_null = a_other.is_null then + l_result := 0; + else + l_result := 1; + end if; + close l_cursor; + return l_result; + end; + begin + if not a_other is of (ut_data_value_refcursor) then + raise value_error; + end if; + + l_other := treat(a_other as ut_data_value_refcursor); + l_other.cursor_details.filter_columns( a_match_options ); + l_self.cursor_details.filter_columns( a_match_options ); + + if a_match_options.join_by.items.count > 0 then + 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; + + if l_result = 0 then + 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 + l_result := 1; + end if; + + 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 + ); + l_result := l_result + compare_data( l_self, l_other, l_diff_cursor_text ); + end if; + return l_result; + end; + + overriding member function is_empty return boolean is + begin + return self.elements_count = 0; + end; + +end; +/ From d609ee8d678e018076e9b54370c24e043087591a Mon Sep 17 00:00:00 2001 From: LUKASZ104 Date: Fri, 24 May 2019 15:26:41 +0100 Subject: [PATCH 137/181] PHASE 2 --- source/expectations/data_values/ut_cursor_details.tpb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index 2a70a51dd..0c617a226 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -249,7 +249,7 @@ create or replace type body ut_cursor_details as begin self.is_anydata := 1; for i in 1..cursor_columns_info.count loop - self.cursor_columns_info(i).filter_path := ut_utils.strip_prefix(self.cursor_columns_info(i).access_path,l_root); + self.cursor_columns_info(i).filter_path := '/'||ut_utils.strip_prefix(self.cursor_columns_info(i).access_path,l_root); end loop; end; From d2fd0f2f8dedad2f1ddc9a56d3b90c06a036223f Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 25 May 2019 19:44:26 +0100 Subject: [PATCH 138/181] Fixing unit test for Oracle 11.2 & 12.1 --- test/ut3_user/reporters.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ut3_user/reporters.pkb b/test/ut3_user/reporters.pkb index 213d7eaa6..d6a104242 100644 --- a/test/ut3_user/reporters.pkb +++ b/test/ut3_user/reporters.pkb @@ -177,7 +177,7 @@ end;]'; --Assert ut.expect(l_actual).to_be_like('%' (varchar2)%]' - ||q'[at "UT3$USER#.CHECK_FAIL_ESCAPE.FAIL_MISERABLY", line % ut3.ut.expect('test').to_equal('');]' + ||q'[at "UT3$USER#.CHECK_FAIL_ESCAPE%", line % ut3.ut.expect('test').to_equal('');]' ||'%]]>%' ); end; From 21a812d0985c6793eb2669091f915e49e8fcf0eb Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 25 May 2019 20:29:43 +0100 Subject: [PATCH 139/181] Fixing code duplication --- source/core/types/ut_test.tpb | 21 +++++++++++++++++++++ source/core/types/ut_test.tps | 3 ++- source/reporters/ut_junit_reporter.tpb | 13 ++----------- source/reporters/ut_sonar_test_reporter.tpb | 14 ++------------ source/reporters/ut_tfs_junit_reporter.tpb | 18 ++++-------------- 5 files changed, 31 insertions(+), 38 deletions(-) diff --git a/source/core/types/ut_test.tpb b/source/core/types/ut_test.tpb index 14620b24b..698f179ff 100644 --- a/source/core/types/ut_test.tpb +++ b/source/core/types/ut_test.tpb @@ -162,5 +162,26 @@ create or replace type body ut_test as end loop; return l_outputs; end; + + member function get_failed_expectations_cdata return ut_varchar2_rows is + c_cdata_start_tag constant varchar2(30) := ''; + c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>'; + l_results ut_varchar2_rows; + l_lines ut_varchar2_list; + begin + ut_utils.append_to_list( l_results, c_cdata_start_tag); + for i in 1 .. self.failed_expectations.count loop + l_lines := self.failed_expectations(i).get_result_lines(); + for j in 1 .. l_lines.count loop + --Encapsulate nested CDATA in results + ut_utils.append_to_list( l_results, replace( l_lines(j), c_cdata_end_tag, c_cdata_end_tag_wrap ) ); + end loop; + ut_utils.append_to_list( l_results, replace( self.failed_expectations(i).caller_info, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); + end loop; + ut_utils.append_to_list( l_results, c_cdata_end_tag); + return l_results; + end; + end; / diff --git a/source/core/types/ut_test.tps b/source/core/types/ut_test.tps index 752ef3ef7..dfe7a7e0f 100644 --- a/source/core/types/ut_test.tps +++ b/source/core/types/ut_test.tps @@ -64,6 +64,7 @@ create or replace type ut_test under ut_suite_item ( overriding member procedure calc_execution_result(self in out nocopy ut_test), overriding member procedure mark_as_errored(self in out nocopy ut_test, a_error_stack_trace varchar2), overriding member function get_error_stack_traces(self ut_test) return ut_varchar2_list, - overriding member function get_serveroutputs return clob + overriding member function get_serveroutputs return clob, + member function get_failed_expectations_cdata return ut_varchar2_rows ) / diff --git a/source/reporters/ut_junit_reporter.tpb b/source/reporters/ut_junit_reporter.tpb index 8b619ccc7..11996b433 100644 --- a/source/reporters/ut_junit_reporter.tpb +++ b/source/reporters/ut_junit_reporter.tpb @@ -53,21 +53,12 @@ create or replace type body ut_junit_reporter is if a_test.result = ut_utils.gc_error then ut_utils.append_to_list( l_results, ''); ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, ut_utils.convert_collection(a_test.get_error_stack_traces()) ); + ut_utils.append_to_list( l_results, replace( ut_utils.table_to_clob(a_test.get_error_stack_traces()), c_cdata_end_tag, c_cdata_end_tag_wrap )); ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); elsif a_test.result > ut_utils.gc_success then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cdata_start_tag); - for i in 1 .. a_test.failed_expectations.count loop - l_lines := a_test.failed_expectations(i).get_result_lines(); - for j in 1 .. l_lines.count loop - --Encapsulate nested CDATA in results - ut_utils.append_to_list( l_results, replace( l_lines(j), c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - end loop; - ut_utils.append_to_list( l_results, replace( a_test.failed_expectations(i).caller_info, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - end loop; - ut_utils.append_to_list( l_results, c_cdata_end_tag); + ut_utils.append_to_list( l_results, a_test.get_failed_expectations_cdata() ); ut_utils.append_to_list( l_results, ''); end if; -- TODO - decide if we need/want to use the tag too diff --git a/source/reporters/ut_sonar_test_reporter.tpb b/source/reporters/ut_sonar_test_reporter.tpb index de4699058..ce1a67089 100644 --- a/source/reporters/ut_sonar_test_reporter.tpb +++ b/source/reporters/ut_sonar_test_reporter.tpb @@ -47,7 +47,6 @@ create or replace type body ut_sonar_test_reporter is c_cdata_end_tag constant varchar2(10) := ']]>'; c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>'; l_results ut_varchar2_rows := ut_varchar2_rows(); - l_lines ut_varchar2_list; begin ut_utils.append_to_list( l_results, ''); if a_test.result = ut_utils.gc_disabled then @@ -55,21 +54,12 @@ create or replace type body ut_sonar_test_reporter is elsif a_test.result = ut_utils.gc_error then ut_utils.append_to_list( l_results, ''); ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, ut_utils.table_to_clob(a_test.get_error_stack_traces())); + ut_utils.append_to_list( l_results, replace( ut_utils.table_to_clob(a_test.get_error_stack_traces()), c_cdata_end_tag, c_cdata_end_tag_wrap )); ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); elsif a_test.result > ut_utils.gc_success then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cdata_start_tag); - for i in 1 .. a_test.failed_expectations.count loop - l_lines := a_test.failed_expectations(i).get_result_lines(); - for j in 1 .. l_lines.count loop - --Encapsulate nested CDATA in results - ut_utils.append_to_list( l_results, replace( l_lines(j), c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - end loop; - ut_utils.append_to_list( l_results, replace( a_test.failed_expectations(i).caller_info, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - end loop; - ut_utils.append_to_list( l_results, c_cdata_end_tag); + ut_utils.append_to_list( l_results, a_test.get_failed_expectations_cdata() ); ut_utils.append_to_list( l_results, ''); end if; ut_utils.append_to_list( l_results, ''); diff --git a/source/reporters/ut_tfs_junit_reporter.tpb b/source/reporters/ut_tfs_junit_reporter.tpb index 814cb7230..cb112e9b7 100644 --- a/source/reporters/ut_tfs_junit_reporter.tpb +++ b/source/reporters/ut_tfs_junit_reporter.tpb @@ -58,7 +58,6 @@ create or replace type body ut_tfs_junit_reporter is procedure print_test_results(a_test ut_test) is l_results ut_varchar2_rows := ut_varchar2_rows(); - l_lines ut_varchar2_list; begin self.print_text(''); @@ -73,22 +72,13 @@ create or replace type body ut_tfs_junit_reporter is if a_test.result = ut_utils.gc_error then ut_utils.append_to_list( l_results, ''); ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, ut_utils.table_to_clob(a_test.get_error_stack_traces())); + ut_utils.append_to_list( l_results, replace( ut_utils.table_to_clob(a_test.get_error_stack_traces()), c_cdata_end_tag, c_cdata_end_tag_wrap )); ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); -- Do not count error as failure elsif a_test.result = ut_utils.gc_failure then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cdata_start_tag); - for i in 1 .. a_test.failed_expectations.count loop - l_lines := a_test.failed_expectations(i).get_result_lines(); - for j in 1 .. l_lines.count loop - --Encapsulate nested CDATA in results - ut_utils.append_to_list( l_results, replace( l_lines(j), c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - end loop; - ut_utils.append_to_list( l_results, replace( a_test.failed_expectations(i).caller_info, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - end loop; - ut_utils.append_to_list( l_results, c_cdata_end_tag); + ut_utils.append_to_list( l_results, a_test.get_failed_expectations_cdata() ); ut_utils.append_to_list( l_results, ''); end if; @@ -127,7 +117,7 @@ create or replace type body ut_tfs_junit_reporter is if l_outputs is not null and l_outputs != empty_clob() then ut_utils.append_to_list( l_results, ''); ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, l_outputs); + ut_utils.append_to_list( l_results, replace( l_outputs, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); else @@ -138,7 +128,7 @@ create or replace type body ut_tfs_junit_reporter is if l_errors is not empty then ut_utils.append_to_list( l_results, ''); ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, ut_utils.table_to_clob(l_errors)); + ut_utils.append_to_list( l_results, replace( ut_utils.table_to_clob(l_errors), c_cdata_end_tag, c_cdata_end_tag_wrap ) ); ut_utils.append_to_list( l_results, c_cdata_end_tag); ut_utils.append_to_list( l_results, ''); else From d6bbe04a9aa03e89dcde09edc41d71067982b32d Mon Sep 17 00:00:00 2001 From: Travis CI Date: Fri, 31 May 2019 13:59:32 +0000 Subject: [PATCH 140/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 2ce241de6..08a2cf440 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 8f0c2e69e..1adf64172 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 4de716069..41f564de0 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 24c747b78..50bb2858e 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 72818c3bd..59450db40 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index f2f296755..3a7cf17a5 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index e152d015d..2d71d47f1 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 8899444b8..b6dba5e02 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index a28177d34..779dc19f8 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index c5b6d493d..327f1a5df 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 51dbb4e69..dde2d84e6 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 9803d3ff4..9456f26dc 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 88d26641a..c6fd2c91d 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 674907b78..f605fbf8f 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 31b8ab6c7..3ece3eef2 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 3645c3efc..990390e35 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index ed0b8195b..cd4ded0d1 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2935--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 92ee0895d..86d90d9a1 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2935-develop + * secion v3.1.7.2980-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 25487d9c3..7b830fa1a 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2935-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2980-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 93890745347233fa1b4b49a1705de25ed18e349e Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 1 Jun 2019 13:49:18 +0200 Subject: [PATCH 141/181] Fixes #921 - Assert input params in dynamic SQL Used dbms_assert.qualified_sql_name whenever possible. This is much less invasive than dbms_assert.enquote_name. Code converting case is left untouched. --- .../annotations/ut_annotation_manager.pkb | 12 ++- source/core/coverage/ut_coverage.pkb | 8 +- source/core/types/ut_suite_item.tpb | 4 +- source/core/ut_metadata.pkb | 8 +- source/core/ut_suite_manager.pkb | 83 ++++++++++++++----- 5 files changed, 85 insertions(+), 30 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 87ad51475..1e9df786d 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -57,7 +57,15 @@ create or replace package body ut_annotation_manager as l_objects_view varchar2(200) := ut_metadata.get_objects_view_name(); l_cursor_text varchar2(32767); l_result ut_annotation_objs_cache_info; + l_object_owner varchar2(250); + l_object_type varchar2(250); begin + if a_object_owner is not null then + l_object_owner := sys.dbms_assert.qualified_sql_name(a_object_owner); + end if; + if a_object_type is not null then + l_object_type := sys.dbms_assert.qualified_sql_name(a_object_type); + end if; l_cursor_text := q'[select ]'||l_ut_owner||q'[.ut_annotation_obj_cache_info( object_owner => o.owner, @@ -70,8 +78,8 @@ create or replace package body ut_annotation_manager as on o.owner = i.object_owner and o.object_name = i.object_name and o.object_type = i.object_type - where o.owner = ']'||a_object_owner||q'[' - and o.object_type = ']'||a_object_type||q'[' + where o.owner = ']'||l_object_owner||q'[' + and o.object_type = ']'||l_object_type||q'[' and ]' || case when a_parse_date is null diff --git a/source/core/coverage/ut_coverage.pkb b/source/core/coverage/ut_coverage.pkb index 93b6204d1..58fdbb5cc 100644 --- a/source/core/coverage/ut_coverage.pkb +++ b/source/core/coverage/ut_coverage.pkb @@ -107,12 +107,18 @@ create or replace package body ut_coverage is l_cursor sys_refcursor; l_skip_objects ut_object_names; l_sql varchar2(32767); + l_valid_pattern varchar2(250) := '^\s*select.+$'; begin 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; - l_sql := a_sql; + if regexp_like(a_sql, l_valid_pattern, 'mi') then + -- pseudo assert for PL/SQL Cop + l_sql := sys.dbms_assert.noop(a_sql); + else + raise_application_error(-20542, 'Possible SQL injection detected. a_sql parameter does not match valid pattern "' || l_valid_pattern || '".'); + end if; if a_coverage_options.file_mappings is not empty then open l_cursor for l_sql using a_coverage_options.file_mappings, l_skip_objects; elsif a_coverage_options.include_objects is not empty then diff --git a/source/core/types/ut_suite_item.tpb b/source/core/types/ut_suite_item.tpb index ef71975e5..2ec1b0513 100644 --- a/source/core/types/ut_suite_item.tpb +++ b/source/core/types/ut_suite_item.tpb @@ -63,9 +63,11 @@ create or replace type body ut_suite_item as ex_savepoint_not_exists exception; l_transaction_invalidators clob; pragma exception_init(ex_savepoint_not_exists, -1086); + l_savepoint varchar2(250); begin if get_rollback_type() = ut_utils.gc_rollback_auto and a_savepoint is not null then - execute immediate 'rollback to ' || a_savepoint; + l_savepoint := sys.dbms_assert.qualified_sql_name(a_savepoint); + execute immediate 'rollback to ' || l_savepoint; end if; exception when ex_savepoint_not_exists then diff --git a/source/core/ut_metadata.pkb b/source/core/ut_metadata.pkb index a254529f8..43a57afa9 100644 --- a/source/core/ut_metadata.pkb +++ b/source/core/ut_metadata.pkb @@ -306,15 +306,17 @@ create or replace package body ut_metadata as function is_anytype_null(a_value in anydata, a_compound_type in varchar2) return number is l_result integer := 0; l_anydata_sql varchar2(4000); + l_compound_type varchar2(250); begin - if a_value is not null then - l_anydata_sql := ' + if a_value is not null then + l_compound_type := sys.dbms_assert.qualified_sql_name(a_compound_type); + 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'||a_compound_type||'(l_data); + 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;'; execute immediate l_anydata_sql using in a_value, out l_result; diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 51d3fa1e4..8d2d0b781 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -335,7 +335,9 @@ create or replace package body ut_suite_manager is l_objects_view varchar2(200) := ut_metadata.get_objects_view_name(); l_cursor_text varchar2(32767); l_result ut_varchar2_rows; + l_object_owner varchar2(250); begin + l_object_owner := sys.dbms_assert.qualified_sql_name(a_object_owner); l_cursor_text := q'[select i.object_name from ]'||l_ut_owner||q'[.ut_suite_cache_package i @@ -345,9 +347,9 @@ create or replace package body ut_suite_manager is where o.owner = i.object_owner and o.object_name = i.object_name and o.object_type = 'PACKAGE' - and o.owner = ']'||a_object_owner||q'[' + and o.owner = ']'||l_object_owner||q'[' ) - and i.object_owner = ']'||a_object_owner||q'[']'; + and i.object_owner = ']'||l_object_owner||q'[']'; open l_rows for l_cursor_text; fetch l_rows bulk collect into l_result limit 1000000; close l_rows; @@ -362,19 +364,33 @@ create or replace package body ut_suite_manager is a_skip_all_objects boolean := false, a_random_seed positive ) return t_cached_suites_cursor is - l_path varchar2( 4000 ); - l_result sys_refcursor; - l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_path varchar2(4000); + l_result sys_refcursor; + l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_object_owner varchar2(250); + l_object_name varchar2(250); + l_procedure_name varchar2(250); begin + if a_object_owner is not null then + l_object_owner := sys.dbms_assert.qualified_sql_name(a_object_owner); + end if; + if a_object_name is not null then + l_object_name := sys.dbms_assert.qualified_sql_name(a_object_name); + end if; + if a_procedure_name is not null then + l_procedure_name := sys.dbms_assert.qualified_sql_name(a_procedure_name); + end if; if a_path is null and a_object_name is not null then execute immediate 'select min(path) from '||l_ut_owner||q'[.ut_suite_cache where object_owner = :a_object_owner and object_name = :a_object_name and name = nvl(:a_procedure_name, name)]' - into l_path using upper(a_object_owner), upper(a_object_name), upper(a_procedure_name); + into l_path using upper(l_object_owner), upper(l_object_name), upper(l_procedure_name); else - l_path := lower( a_path ); + if a_path is not null then + l_path := lower(sys.dbms_assert.qualified_sql_name(a_path)); + end if; end if; open l_result for @@ -717,29 +733,37 @@ create or replace package body ut_suite_manager is a_owner_name varchar2, a_package_name varchar2 := null ) return sys_refcursor is - l_result sys_refcursor; - l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_result sys_refcursor; + l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_owner_name varchar2(250); + l_package_name varchar2(250); begin + if a_owner_name is not null then + l_owner_name := sys.dbms_assert.qualified_sql_name(a_owner_name); + end if; + if a_package_name is not null then + l_package_name := sys.dbms_assert.qualified_sql_name(a_package_name); + end if; - refresh_cache(a_owner_name); + refresh_cache(l_owner_name); open l_result for q'[with suite_items as ( select /*+ cardinality(c 100) */ c.* from ]'||l_ut_owner||q'[.ut_suite_cache c - where 1 = 1 ]'||case when can_skip_all_objects_scan(a_owner_name) then q'[ + where 1 = 1 ]'||case when can_skip_all_objects_scan(l_owner_name) then q'[ and exists ( select 1 from all_objects a where a.object_name = c.object_name - and a.owner = ']'||upper(a_owner_name)||q'[' + and a.owner = ']'||upper(l_owner_name)||q'[' and a.owner = c.object_owner and a.object_type = 'PACKAGE' )]' end ||q'[ - and c.object_owner = ']'||upper(a_owner_name) ||q'[' + and c.object_owner = ']'||upper(l_owner_name)||q'[' and ]' - || case when a_package_name is not null + || case when l_package_name is not null then 'c.object_name = :a_package_name' else ':a_package_name is null' end || q'[ @@ -787,7 +811,7 @@ create or replace package body ut_suite_manager is object_owner, object_name, item_name, item_description, item_type, item_line_no, path, disabled_flag ) - from items c]' using upper(a_package_name); + from items c]' using upper(l_package_name); return l_result; end; @@ -798,17 +822,30 @@ create or replace package body ut_suite_manager is a_procedure_name varchar2 := null, a_item_type varchar2 := null ) return boolean is - l_result integer; - l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_result integer; + l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_owner_name varchar2(250); + l_package_name varchar2(250); + l_procedure_name varchar2(250); begin - refresh_cache(a_owner_name); + if a_owner_name is not null then + l_owner_name := sys.dbms_assert.qualified_sql_name(a_owner_name); + end if; + if a_package_name is not null then + l_package_name := sys.dbms_assert.qualified_sql_name(a_package_name); + end if; + if a_procedure_name is not null then + l_procedure_name := sys.dbms_assert.qualified_sql_name(a_procedure_name); + end if; + + refresh_cache(l_owner_name); execute immediate q'[ select count(1) from dual where exists ( select 1 from ]'||l_ut_owner||q'[.ut_suite_cache c - where 1 = 1 ]'||case when can_skip_all_objects_scan(a_owner_name) then q'[ + where 1 = 1 ]'||case when can_skip_all_objects_scan(l_owner_name) then q'[ and exists ( select 1 from all_objects a @@ -820,20 +857,20 @@ create or replace package body ut_suite_manager is and :a_owner_name is not null ]' end ||q'[ and c.object_owner = :a_owner_name and ]' - || case when a_package_name is not null + || case when l_package_name is not null then 'c.object_name = :a_package_name' else ':a_package_name is null' end || q'[ and ]' - || case when a_procedure_name is not null + || case when l_procedure_name is not null then 'c.name = :a_procedure_name' else ':a_procedure_name is null' end || q'[ )]' into l_result using - upper(a_owner_name), upper(a_owner_name), - upper(a_package_name), upper(a_procedure_name); + upper(l_owner_name), upper(l_owner_name), + upper(l_package_name), upper(l_procedure_name); return l_result > 0; end; From 16ef15f4ec2206be4a563f8f527f7a28de6b8971 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sat, 1 Jun 2019 13:13:27 +0000 Subject: [PATCH 142/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 08a2cf440..2cb5db950 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 1adf64172..698a2bacd 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 41f564de0..165b0a069 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 50bb2858e..2db55ea19 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 59450db40..0740cac99 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 3a7cf17a5..dd61fe444 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 2d71d47f1..7e46bf011 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index b6dba5e02..65a61515d 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 779dc19f8..6c4cca2fa 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 327f1a5df..8250ff121 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index dde2d84e6..c33d011eb 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 9456f26dc..b6aad84e3 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index c6fd2c91d..18ba7b453 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index f605fbf8f..e3ba0b8f9 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 3ece3eef2..972020f07 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 990390e35..98461fc8e 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index cd4ded0d1..f25de0b5d 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2980--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 86d90d9a1..4593ba1a5 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2980-develop + * secion v3.1.7.2987-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 7b830fa1a..7d3faaea4 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2980-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2987-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 36e08014e2068fe6a2351bff3eba5bdd2a3f20c6 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 2 Jun 2019 22:15:16 +0100 Subject: [PATCH 143/181] Fixing sonar violation on duplicated code. --- source/core/types/ut_test.tpb | 21 ++---- source/core/types/ut_test.tps | 2 +- source/core/ut_utils.pkb | 26 +++++++ source/core/ut_utils.pks | 21 +++++- source/reporters/ut_junit_reporter.tpb | 30 +++----- source/reporters/ut_sonar_test_reporter.tpb | 9 +-- source/reporters/ut_tfs_junit_reporter.tpb | 77 +++++++++------------ test/ut3_user/api/test_ut_run.pkb | 4 +- 8 files changed, 97 insertions(+), 93 deletions(-) diff --git a/source/core/types/ut_test.tpb b/source/core/types/ut_test.tpb index 698f179ff..099704fd5 100644 --- a/source/core/types/ut_test.tpb +++ b/source/core/types/ut_test.tpb @@ -163,25 +163,14 @@ create or replace type body ut_test as return l_outputs; end; - member function get_failed_expectations_cdata return ut_varchar2_rows is - c_cdata_start_tag constant varchar2(30) := ''; - c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>'; - l_results ut_varchar2_rows; - l_lines ut_varchar2_list; + member function get_failed_expectation_lines return ut_varchar2_rows is + l_results ut_varchar2_rows; begin - ut_utils.append_to_list( l_results, c_cdata_start_tag); - for i in 1 .. self.failed_expectations.count loop - l_lines := self.failed_expectations(i).get_result_lines(); - for j in 1 .. l_lines.count loop - --Encapsulate nested CDATA in results - ut_utils.append_to_list( l_results, replace( l_lines(j), c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - end loop; - ut_utils.append_to_list( l_results, replace( self.failed_expectations(i).caller_info, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); + for i in 1 .. failed_expectations.count loop + ut_utils.append_to_list( l_results, ut_utils.convert_collection( failed_expectations(i).get_result_lines() ) ); + ut_utils.append_to_list( l_results, failed_expectations(i).caller_info ); end loop; - ut_utils.append_to_list( l_results, c_cdata_end_tag); return l_results; end; - end; / diff --git a/source/core/types/ut_test.tps b/source/core/types/ut_test.tps index dfe7a7e0f..7ca01313a 100644 --- a/source/core/types/ut_test.tps +++ b/source/core/types/ut_test.tps @@ -65,6 +65,6 @@ create or replace type ut_test under ut_suite_item ( overriding member procedure mark_as_errored(self in out nocopy ut_test, a_error_stack_trace varchar2), overriding member function get_error_stack_traces(self ut_test) return ut_varchar2_list, overriding member function get_serveroutputs return clob, - member function get_failed_expectations_cdata return ut_varchar2_rows + member function get_failed_expectation_lines return ut_varchar2_rows ) / diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 92ee0895d..52477d9b4 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -798,5 +798,31 @@ create or replace package body ut_utils is return l_valid_name; end; + function to_cdata(a_lines ut_varchar2_rows) return ut_varchar2_rows is + l_results ut_varchar2_rows; + begin + if a_lines is not empty then + ut_utils.append_to_list( l_results, gc_cdata_start_tag); + for i in 1 .. a_lines.count loop + ut_utils.append_to_list( l_results, replace( a_lines(i), gc_cdata_end_tag, gc_cdata_end_tag_wrap ) ); + end loop; + ut_utils.append_to_list( l_results, gc_cdata_end_tag); + else + l_results := a_lines; + end if; + return l_results; + end; + + function to_cdata(a_clob clob) return clob is + l_result clob; + begin + if a_clob is not null and a_clob != empty_clob() then + l_result := replace( a_clob, gc_cdata_end_tag, gc_cdata_end_tag_wrap ); + else + l_result := a_clob; + end if; + return l_result; + end; + end ut_utils; / diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 25487d9c3..85cfeeb16 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -44,6 +44,11 @@ create or replace package ut_utils authid definer is gc_failure_char constant varchar2(7) := 'Failure'; -- one or more expectations failed gc_error_char constant varchar2(5) := 'Error'; -- exception was raised + gc_cdata_start_tag constant varchar2(10) := ''; + gc_cdata_end_tag_wrap constant varchar2(30) := ']]'||gc_cdata_end_tag||gc_cdata_start_tag||'>'; + + /* Constants: Rollback type for ut_test_object */ @@ -386,6 +391,18 @@ create or replace package ut_utils authid definer is * Check if xml name is valid if not build a valid name */ function get_valid_xml_name(a_name varchar2) return varchar2; - -end ut_utils; + + /** + * Converts input list into a list surrounded by CDATA tags + * All CDATA end tags get escaped using recommended method from https://en.wikipedia.org/wiki/CDATA#Nesting + */ + function to_cdata(a_lines ut_varchar2_rows) return ut_varchar2_rows; + + /** + * Converts input CLOB into a CLOB surrounded by CDATA tags + * All CDATA end tags get escaped using recommended method from https://en.wikipedia.org/wiki/CDATA#Nesting + */ + function to_cdata(a_clob clob) return clob; + + end ut_utils; / diff --git a/source/reporters/ut_junit_reporter.tpb b/source/reporters/ut_junit_reporter.tpb index 11996b433..c08790080 100644 --- a/source/reporters/ut_junit_reporter.tpb +++ b/source/reporters/ut_junit_reporter.tpb @@ -23,9 +23,6 @@ create or replace type body ut_junit_reporter is end; overriding member procedure after_calling_run(self in out nocopy ut_junit_reporter, a_run in ut_run) is - c_cdata_start_tag constant varchar2(30) := ''; - c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>'; l_suite_id integer := 0; 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; @@ -37,7 +34,6 @@ create or replace type body ut_junit_reporter is procedure print_test_elements(a_test ut_test) is l_results ut_varchar2_rows := ut_varchar2_rows(); - l_lines ut_varchar2_list; l_output clob; begin ut_utils.append_to_list( @@ -52,22 +48,18 @@ create or replace type body ut_junit_reporter is end if; if a_test.result = ut_utils.gc_error then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, replace( ut_utils.table_to_clob(a_test.get_error_stack_traces()), c_cdata_end_tag, c_cdata_end_tag_wrap )); - ut_utils.append_to_list( l_results, c_cdata_end_tag); + ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( a_test.get_error_stack_traces() ) ) ); ut_utils.append_to_list( l_results, ''); elsif a_test.result > ut_utils.gc_success then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, a_test.get_failed_expectations_cdata() ); + ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_failed_expectation_lines() ) ); ut_utils.append_to_list( l_results, ''); end if; - -- TODO - decide if we need/want to use the tag too + l_output := a_test.get_serveroutputs(); if l_output is not null then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, replace( l_output, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - ut_utils.append_to_list( l_results, c_cdata_end_tag ); + ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_serveroutputs() ) ); ut_utils.append_to_list( l_results, '' ); else ut_utils.append_to_list( l_results, ''); @@ -79,7 +71,7 @@ create or replace type body ut_junit_reporter is end; procedure print_suite_elements(a_suite ut_logical_suite, a_suite_id in out nocopy integer) is - l_tests_count integer := a_suite.results_count.disabled_count + a_suite.results_count.success_count + + 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; l_tests ut_suite_items := ut_suite_items(); @@ -88,7 +80,7 @@ create or replace type body ut_junit_reporter is l_errors ut_varchar2_list; begin a_suite_id := a_suite_id + 1; - self.print_text(''); -- Becasue testsuites have to appear before test we capture test and leave it for later. @@ -110,11 +102,9 @@ create or replace type body ut_junit_reporter is l_suite := treat(a_suite as ut_suite); l_data := l_suite.get_serveroutputs(); - if l_data is not null and l_data != empty_clob() then + if l_data is not null then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, replace( l_data, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - ut_utils.append_to_list( l_results, c_cdata_end_tag); + ut_utils.append_to_list( l_results, ut_utils.to_cdata( l_data ) ); ut_utils.append_to_list( l_results, ''); else ut_utils.append_to_list( l_results, ''); @@ -123,9 +113,7 @@ create or replace type body ut_junit_reporter is l_errors := l_suite.get_error_stack_traces(); if l_errors is not empty then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, replace( ut_utils.table_to_clob(l_errors), c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - ut_utils.append_to_list( l_results, c_cdata_end_tag); + ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( l_errors ) ) ); ut_utils.append_to_list( l_results, ''); else ut_utils.append_to_list( l_results, ''); diff --git a/source/reporters/ut_sonar_test_reporter.tpb b/source/reporters/ut_sonar_test_reporter.tpb index ce1a67089..874a07957 100644 --- a/source/reporters/ut_sonar_test_reporter.tpb +++ b/source/reporters/ut_sonar_test_reporter.tpb @@ -43,9 +43,6 @@ create or replace type body ut_sonar_test_reporter is end; procedure print_test_results(a_test ut_test) is - c_cdata_start_tag constant varchar2(30) := ''; - c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>'; l_results ut_varchar2_rows := ut_varchar2_rows(); begin ut_utils.append_to_list( l_results, ''); @@ -53,13 +50,11 @@ create or replace type body ut_sonar_test_reporter is ut_utils.append_to_list( l_results, ''); elsif a_test.result = ut_utils.gc_error then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, replace( ut_utils.table_to_clob(a_test.get_error_stack_traces()), c_cdata_end_tag, c_cdata_end_tag_wrap )); - ut_utils.append_to_list( l_results, c_cdata_end_tag); + ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( a_test.get_error_stack_traces() ) ) ); ut_utils.append_to_list( l_results, ''); elsif a_test.result > ut_utils.gc_success then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, a_test.get_failed_expectations_cdata() ); + ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_failed_expectation_lines() ) ); ut_utils.append_to_list( l_results, ''); end if; ut_utils.append_to_list( l_results, ''); diff --git a/source/reporters/ut_tfs_junit_reporter.tpb b/source/reporters/ut_tfs_junit_reporter.tpb index cb112e9b7..5fba96886 100644 --- a/source/reporters/ut_tfs_junit_reporter.tpb +++ b/source/reporters/ut_tfs_junit_reporter.tpb @@ -28,13 +28,8 @@ create or replace type body ut_tfs_junit_reporter is end; member procedure junit_version_one(self in out nocopy ut_tfs_junit_reporter,a_run in ut_run) is - c_cdata_start_tag constant varchar2(30) := ''; - c_cdata_end_tag_wrap constant varchar2(30) := ']]'||c_cdata_end_tag||c_cdata_start_tag||'>'; l_suite_id integer := 0; - 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_common_suite_attributes(a_item ut_suite_item) return varchar2 is begin return ' errors="' ||a_item.results_count.errored_count || '"' || @@ -71,14 +66,12 @@ create or replace type body ut_tfs_junit_reporter is if a_test.result = ut_utils.gc_error then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, replace( ut_utils.table_to_clob(a_test.get_error_stack_traces()), c_cdata_end_tag, c_cdata_end_tag_wrap )); - ut_utils.append_to_list( l_results, c_cdata_end_tag); + ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( a_test.get_error_stack_traces() ) ) ); ut_utils.append_to_list( l_results, ''); -- Do not count error as failure elsif a_test.result = ut_utils.gc_failure then ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, a_test.get_failed_expectations_cdata() ); + ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_failed_expectation_lines() ) ); ut_utils.append_to_list( l_results, ''); end if; @@ -102,43 +95,39 @@ create or replace type body ut_tfs_junit_reporter is end if; end loop; - if a_suite is of(ut_suite) then - a_suite_id := a_suite_id + 1; - self.print_text(''); - self.print_text(''); - for i in 1 .. a_suite.items.count loop - if a_suite.items(i) is of(ut_test) then - print_test_results(treat(a_suite.items(i) as ut_test)); - end if; - end loop; - l_suite := treat(a_suite as ut_suite); - l_outputs := l_suite.get_serveroutputs(); - if l_outputs is not null and l_outputs != empty_clob() then - ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, replace( l_outputs, c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - ut_utils.append_to_list( l_results, c_cdata_end_tag); - ut_utils.append_to_list( l_results, ''); - else - ut_utils.append_to_list( l_results, ''); - end if; + if a_suite is of(ut_suite) then + a_suite_id := a_suite_id + 1; + self.print_text(''); + self.print_text(''); + for i in 1 .. a_suite.items.count loop + if a_suite.items(i) is of(ut_test) then + print_test_results(treat(a_suite.items(i) as ut_test)); + end if; + end loop; + l_suite := treat(a_suite as ut_suite); + l_outputs := l_suite.get_serveroutputs(); + if l_outputs is not null and l_outputs != empty_clob() then + ut_utils.append_to_list( l_results, ''); + ut_utils.append_to_list( l_results, ut_utils.to_cdata( l_suite.get_serveroutputs() ) ); + ut_utils.append_to_list( l_results, ''); + else + ut_utils.append_to_list( l_results, ''); + end if; - l_errors := l_suite.get_error_stack_traces(); - if l_errors is not empty then - ut_utils.append_to_list( l_results, ''); - ut_utils.append_to_list( l_results, c_cdata_start_tag); - ut_utils.append_to_list( l_results, replace( ut_utils.table_to_clob(l_errors), c_cdata_end_tag, c_cdata_end_tag_wrap ) ); - ut_utils.append_to_list( l_results, c_cdata_end_tag); - ut_utils.append_to_list( l_results, ''); - else - ut_utils.append_to_list( l_results, ''); - end if; - ut_utils.append_to_list( l_results, ''); + l_errors := l_suite.get_error_stack_traces(); + if l_errors is not empty then + ut_utils.append_to_list( l_results, ''); + ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( l_errors ) ) ); + ut_utils.append_to_list( l_results, ''); + else + ut_utils.append_to_list( l_results, ''); + end if; + ut_utils.append_to_list( l_results, ''); - self.print_text_lines(l_results); + self.print_text_lines(l_results); end if; - end; + end; begin l_suite_id := 0; diff --git a/test/ut3_user/api/test_ut_run.pkb b/test/ut3_user/api/test_ut_run.pkb index 43a2238ae..620c87977 100644 --- a/test/ut3_user/api/test_ut_run.pkb +++ b/test/ut3_user/api/test_ut_run.pkb @@ -734,8 +734,8 @@ Failures:% procedure remove_time_from_results(a_results in out nocopy ut3.ut_varchar2_list) is begin for i in 1 .. a_results.count loop - a_results(i) := regexp_replace(a_results(i),'\[[0-9]*\.[0-9]+ sec\]',''); - a_results(i) := regexp_replace(a_results(i),'Finished in [0-9]*\.[0-9]+ seconds',''); + a_results(i) := regexp_replace(a_results(i),'\[[0-9]*[\.,][0-9]+ sec\]',''); + a_results(i) := regexp_replace(a_results(i),'Finished in [0-9]*[\.,][0-9]+ seconds',''); end loop; end; From 6918be79241133881acb4f3fefb474541d633da0 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Sun, 2 Jun 2019 22:07:12 +0000 Subject: [PATCH 144/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 2cb5db950..d7dfefdcf 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 698a2bacd..aa7b83002 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 165b0a069..0cdf9cbee 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 2db55ea19..ec0e05d7b 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 0740cac99..2b660013e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index dd61fe444..a0f32ce5e 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 7e46bf011..7d8081a4f 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 65a61515d..b6532232d 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 6c4cca2fa..18b481642 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 8250ff121..a2b0c143f 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index c33d011eb..ec32fe4a5 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index b6aad84e3..cd4760351 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 18ba7b453..37034e458 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index e3ba0b8f9..1d47e7bc3 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 972020f07..7bca3b507 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 98461fc8e..a4490ec97 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index f25de0b5d..5e3ec0f12 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2987--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index a1fa15022..b3f2f0ea6 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2987-develop + * secion v3.1.7.2992-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index e49c5dd65..a075e5458 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2987-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2992-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From be7fd082f07c5ff6c1cded7e2e1643e97bd1f0d4 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Tue, 4 Jun 2019 13:01:16 +0100 Subject: [PATCH 145/181] update tests to be less complicated --- docs/userguide/advanced_data_comparison.md | 69 ++++++++++++---------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 39c35ebed..042bb847f 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -129,6 +129,14 @@ end; Example of `include / exclude` for anydata.convertCollection ```plsql +create or replace type person as object( + name varchar2(100), + age integer +) +/ +create or replace type people as table of person +/ + create or replace package ut_anydata_inc_exc IS --%suite(Anydata) @@ -138,46 +146,38 @@ create or replace package ut_anydata_inc_exc IS --%test(Anydata exclude) procedure ut_anydata_test_exc; - + + --%test(Fail on age) + procedure ut_fail_anydata_test; + end ut_anydata_inc_exc; / create or replace package body ut_anydata_inc_exc IS procedure ut_anydata_test_inc IS - l_actual ut3_tester_helper.test_dummy_object_list; - l_expected ut3_tester_helper.test_dummy_object_list; + l_actual people := people(person('Matt',45)); + l_expected people :=people(person('Matt',47)); begin - --Arrange - select ut3_tester_helper.test_dummy_object( rownum, 'Something Name'||rownum, rownum) - bulk collect into l_actual - from dual connect by level <=2 - order by rownum asc; - select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=2 - order by rownum asc; - --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).include('ID,Value'); + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).include('NAME'); end; - + procedure ut_anydata_test_exc IS - l_actual ut3_tester_helper.test_dummy_object_list; - l_expected ut3_tester_helper.test_dummy_object_list; + l_actual people := people(person('Matt',45)); + l_expected people :=people(person('Matt',47)); begin --Arrange - select ut3_tester_helper.test_dummy_object( rownum, 'Something Name'||rownum, rownum) - bulk collect into l_actual - from dual connect by level <=2 - order by rownum asc; - select ut3_tester_helper.test_dummy_object( rownum, 'Something '||rownum, rownum) - bulk collect into l_expected - from dual connect by level <=2 - order by rownum asc; - --Act - ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).exclude('name'); + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).exclude('AGE'); end; + procedure ut_fail_anydata_test IS + l_actual people := people(person('Matt',45)); + l_expected people :=people(person('Matt',47)); + begin + --Arrange + ut3.ut.expect(anydata.convertCollection(l_actual)).to_equal(anydata.convertCollection(l_expected)).include('AGE'); + end; + end ut_anydata_inc_exc; / @@ -187,11 +187,18 @@ will result in : ```sql Anydata - Anydata include [.07 sec] - Anydata exclude [.058 sec] + Anydata include [.044 sec] + Anydata exclude [.035 sec] + Fail on age [.058 sec] (FAILED - 1) + +Failures: -Finished in .131218 seconds -2 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s) + 1) ut_fail_anydata_test + Actual: ut3.people [ count = 1 ] was expected to equal: ut3.people [ count = 1 ] + Diff: + Rows: [ 1 differences ] + Row No. 1 - Actual: 45 + Row No. 1 - Expected: 47 ``` From 0007298715a28fa5d2e0da3cd4460395b9ff5a39 Mon Sep 17 00:00:00 2001 From: lwasylow Date: Wed, 5 Jun 2019 08:48:02 +0100 Subject: [PATCH 146/181] Fixing encoding issue --- source/core/ut_utils.pks | 2 +- .../data_values/ut_compound_data_helper.pkb | 1388 ++++++++--------- .../data_values/ut_cursor_column.tps | 104 +- .../data_values/ut_cursor_details.tpb | 513 +++--- .../data_values/ut_cursor_details.tps | 82 +- .../data_values/ut_data_value_anydata.tpb | 285 ++-- .../data_values/ut_data_value_refcursor.tpb | 795 +++++----- 7 files changed, 1583 insertions(+), 1586 deletions(-) diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 4969fbd70..792bccb52 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -413,5 +413,5 @@ create or replace package ut_utils authid definer is function strip_prefix(a_item varchar2, a_prefix varchar2, a_connector varchar2 := '/') return varchar2; -end ut_utils; + end ut_utils; / diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 759e3ad70..1d5686f03 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -1,694 +1,694 @@ -create or replace package body ut_compound_data_helper is - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - 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; - - 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 {:ut3_owner:}.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 {:ut3_owner:}.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 - 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.*]' - || 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]' - || 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; - return l_results; - end; - - function generate_not_equal_stmt( - a_data_info ut_cursor_column, a_pk_table ut_varchar2_list - ) return varchar2 - is - l_pk_tab ut_varchar2_list := coalesce(a_pk_table,ut_varchar2_list()); - l_index integer; - l_sql_stmt varchar2(32767); - l_exists boolean := false; - begin - l_index := l_pk_tab.first; - if l_pk_tab.count > 0 then - loop - if a_data_info.access_path = l_pk_tab(l_index) then - l_exists := true; - end if; - exit when l_index = l_pk_tab.count or (a_data_info.access_path = l_pk_tab(l_index)); - l_index := a_pk_table.next(l_index); - end loop; - end if; - if not(l_exists) then - l_sql_stmt := ' (decode(a.'||a_data_info.transformed_name||','||' e.'||a_data_info.transformed_name||',1,0) = 0)'; - end if; - 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 - l_pk_tab ut_varchar2_list := coalesce(a_pk_table,ut_varchar2_list()); - l_index integer; - l_sql_stmt varchar2(32767); - begin - if l_pk_tab.count <> 0 then - l_index:= l_pk_tab.first; - loop - 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 - l_sql_stmt := l_sql_stmt ||' a.'||a_data_info.transformed_name||q'[ = ]'||' e.'||a_data_info.transformed_name; - end if; - exit when (a_data_info.access_path = l_pk_tab(l_index)) or l_index = l_pk_tab.count; - l_index := l_pk_tab.next(l_index); - end loop; - end if; - return l_sql_stmt; - end; - - function generate_equal_sql(a_col_name in varchar2) return varchar2 is - begin - 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 - if a_pk_table is not empty then - l_index:= a_pk_table.first; - loop - 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 - l_sql_stmt := l_sql_stmt ||a_alias||a_data_info.transformed_name; - end if; - exit when (a_data_info.access_path = a_pk_table(l_index)) or l_index = a_pk_table.count; - l_index := a_pk_table.next(l_index); - end loop; - else - l_sql_stmt := a_alias||a_data_info.transformed_name; - end if; - return l_sql_stmt; - end; - - function generate_select_stmt(a_data_info ut_cursor_column, a_alias varchar2 := 'ucd.') - return varchar2 - is - l_alias varchar2(10) := a_alias; - l_col_syntax varchar2(4000); - l_ut_owner varchar2(250) := ut_utils.ut_owner; - begin - if a_data_info.is_sql_diffable = 0 then - l_col_syntax := l_ut_owner ||'.ut_compound_data_helper.get_hash('||l_alias||a_data_info.transformed_name||'.getClobVal()) as '||a_data_info.transformed_name ; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type = 'DATE' then - l_col_syntax := 'to_date('||l_alias||a_data_info.transformed_name||') as '|| a_data_info.transformed_name; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP') then - l_col_syntax := 'to_timestamp('||l_alias||a_data_info.transformed_name||','''||ut_utils.gc_timestamp_format||''') as '|| a_data_info.transformed_name; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP WITH TIME ZONE') then - 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; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP WITH LOCAL TIME ZONE') then - 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 - l_col_syntax := l_alias||a_data_info.transformed_name||' as '|| a_data_info.transformed_name; - end if; - return l_col_syntax; - end; - - function generate_xmltab_stmt(a_data_info ut_cursor_column) return varchar2 is - l_col_type varchar2(4000); - begin - if a_data_info.is_sql_diffable = 0 then - l_col_type := 'XMLTYPE'; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('DATE','TIMESTAMP','TIMESTAMP WITH TIME ZONE', - 'TIMESTAMP WITH LOCAL TIME ZONE') then - l_col_type := 'VARCHAR2(50)'; - elsif a_data_info.is_sql_diffable = 1 and type_no_length(a_data_info.column_type) then - l_col_type := a_data_info.column_type; - elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('VARCHAR2','CHAR') then - l_col_type := 'VARCHAR2('||greatest(a_data_info.column_len,4000)||')'; - 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 - l_col_type := a_data_info.column_type; - else - l_col_type := a_data_info.column_type - ||case when a_data_info.column_len is not null - then '('||a_data_info.column_len||')' - else null - end; - end if; - 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; - l_xmltab_list ut_varchar2_list := ut_varchar2_list(); - l_select_list ut_varchar2_list := ut_varchar2_list(); - l_partition_list ut_varchar2_list := ut_varchar2_list(); - l_equal_list ut_varchar2_list := ut_varchar2_list(); - l_join_by_list ut_varchar2_list := ut_varchar2_list(); - 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 - if a_list_element is not null then - a_list.extend; - a_list(a_list.last) := a_list_element; - end if; - end; - - begin - if a_data_info is not empty then - for i in 1..a_data_info.count loop - if a_data_info(i).has_nested_col = 0 then - --Get XMLTABLE column list - add_element_to_list(l_xmltab_list,generate_xmltab_stmt(a_data_info(i))); - --Get Select statment list of columns - add_element_to_list(l_select_list, generate_select_stmt(a_data_info(i))); - --Get columns by which we partition - add_element_to_list(l_partition_list,generate_partition_stmt(a_data_info(i), a_pk_table)); - --Get equal statement - add_element_to_list(l_equal_list,generate_equal_sql(a_data_info(i).transformed_name)); - --Generate join by stmt - add_element_to_list(l_join_by_list,generate_join_by_stmt(a_data_info(i), a_pk_table)); - --Generate not equal stmt - add_element_to_list(l_not_equal_list,generate_not_equal_stmt(a_data_info(i), a_pk_table)); - end if; - end loop; - - a_xml_stmt := nullif(','||ut_utils.table_to_clob(l_xmltab_list, ' , '),','); - a_select_stmt := nullif(','||ut_utils.table_to_clob(l_select_list, ' , '),','); - l_partition_tmp := ut_utils.table_to_clob(l_partition_list, ' , '); - ut_utils.append_to_clob(a_partition_stmt,' row_number() over (partition by '||l_partition_tmp||' order by '||l_partition_tmp||' ) '); - - if a_pk_table.count > 0 then - -- If key defined do the join or these and where on diffrences - a_join_by_stmt := ut_utils.table_to_clob(l_join_by_list, ' and '); - elsif a_unordered then - -- If no key defined do the join on all columns - 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 - a_join_by_stmt := 'a.item_no = e.item_no '; - end if; - a_not_equal_stmt := ut_utils.table_to_clob(l_not_equal_list, ' or '); - else - --Partition by piece when no data - ut_utils.append_to_clob(a_partition_stmt,' 1 '); - 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_ut_owner varchar2(250) := ut_utils.ut_owner; - l_join_by_list ut_varchar2_list; - - function get_join_type(a_inclusion_compare in boolean,a_negated in boolean) return varchar2 is - begin - return - case - when a_inclusion_compare and not(a_negated) then ' right outer join ' - 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 - return - case - 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. - */ - l_join_by_list := - case - 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; - - dbms_lob.createtemporary(l_compare_sql, true); - --Initiate a SQL template with placeholders - ut_utils.append_to_clob(l_compare_sql, g_compare_sql_template); - --Generate a pieceso of dynamic SQL that will substitute placeholders - 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 - ); - - l_compare_sql := replace(l_compare_sql,'{:duplicate_number:}',l_partition_stmt); - l_compare_sql := replace(l_compare_sql,'{:columns:}',l_select_stmt); - l_compare_sql := replace(l_compare_sql,'{:ut3_owner:}',l_ut_owner); - l_compare_sql := replace(l_compare_sql,'{:xml_to_columns:}',l_xmltable_stmt); - l_compare_sql := replace(l_compare_sql,'{:item_no:}',get_item_no(a_unordered)); - l_compare_sql := replace(l_compare_sql,'{:join_type:}',get_join_type(a_inclusion_type,a_is_negated)); - l_compare_sql := replace(l_compare_sql,'{:join_condition:}',l_join_on_stmt); - - 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 - 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 - if a_inclusion_type then - ut_utils.append_to_clob(l_where_stmt,case when a_is_negated then ' 1 = 1 ' else ' ( a.data_id is null ) ' end); - else - ut_utils.append_to_clob(l_where_stmt,' (a.data_id is null or e.data_id is null) '); - end if; - - l_compare_sql := replace(l_compare_sql,'{:where_condition:}',l_where_stmt); - return l_compare_sql; - end; - - function get_column_extract_path(a_cursor_info ut_cursor_column_tab) return ut_varchar2_list is - l_column_list ut_varchar2_list := ut_varchar2_list(); - begin - for i in 1..a_cursor_info.count loop - l_column_list.extend; - l_column_list(l_column_list.last) := a_cursor_info(i).access_path; - end loop; - 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 - l_act_extract_xpath varchar2(32767):= ut_utils.to_xpath(get_column_extract_path(a_act_cursor_info)); - l_exp_extract_xpath varchar2(32767):= ut_utils.to_xpath(get_column_extract_path(a_exp_cursor_info)); - l_join_xpath varchar2(32767) := ut_utils.to_xpath(a_join_by_list); - l_results tt_row_diffs; - l_sql varchar2(32767); - begin - 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 ( ]' - || 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,]' - ||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 - ]' - 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; - 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; - return l_results; - end; - - function get_hash(a_data raw, a_hash_type binary_integer := dbms_crypto.hash_sh1) return t_hash is - begin - 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 - return dbms_crypto.hash(a_data, a_hash_type); - end; - - function get_fixed_size_hash(a_string varchar2, a_base integer :=0,a_size integer := 9999999) return number is - begin - 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 - 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 - g_diff_count := a_rows_diff; - end; - - procedure cleanup_diff is - begin - g_diff_count := 0; - end; - - function get_rows_diff_count return integer is - begin - 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 - if a_type_name IN (g_type_name_map(dbms_sql.blob_type), - g_type_name_map(dbms_sql.clob_type), - g_type_name_map(dbms_sql.long_type), - g_type_name_map(dbms_sql.long_raw_type), - g_type_name_map(dbms_sql.bfile_type), - g_anytype_name_map(dbms_types.typecode_namedcollection)) - then - l_assert := false; - else - l_assert := true; - end if; - return l_assert; - end; - - function get_column_type_desc(a_type_code in integer, a_dbms_sql_desc in boolean) - return varchar2 is - begin - return - case - 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 - open l_diff_cursor for a_diff_cursor_text using a_self_id, a_other_id; - return l_diff_cursor; - end; - - function create_err_cursor_msg(a_error_stack varchar2) return varchar2 is - begin - 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)|| - 'Check the query and data for errors.'; - end; - - function type_no_length ( a_type_name varchar2) return boolean is - begin - return case - when g_type_no_length_map.exists(a_type_name) then - true - else - false - end; - end; - -begin - g_anytype_name_map(dbms_types.typecode_date) := 'DATE'; - g_anytype_name_map(dbms_types.typecode_number) := 'NUMBER'; - g_anytype_name_map(3 /*INTEGER in object type*/) := 'NUMBER'; - g_anytype_name_map(dbms_types.typecode_raw) := 'RAW'; - g_anytype_name_map(dbms_types.typecode_char) := 'CHAR'; - g_anytype_name_map(dbms_types.typecode_varchar2) := 'VARCHAR2'; - g_anytype_name_map(dbms_types.typecode_varchar) := 'VARCHAR'; - g_anytype_name_map(dbms_types.typecode_blob) := 'BLOB'; - g_anytype_name_map(dbms_types.typecode_bfile) := 'BFILE'; - g_anytype_name_map(dbms_types.typecode_clob) := 'CLOB'; - g_anytype_name_map(dbms_types.typecode_timestamp) := 'TIMESTAMP'; - g_anytype_name_map(dbms_types.typecode_timestamp_tz) := 'TIMESTAMP WITH TIME ZONE'; - g_anytype_name_map(dbms_types.typecode_timestamp_ltz) := 'TIMESTAMP WITH LOCAL TIME ZONE'; - g_anytype_name_map(dbms_types.typecode_interval_ym) := 'INTERVAL YEAR TO MONTH'; - g_anytype_name_map(dbms_types.typecode_interval_ds) := 'INTERVAL DAY TO SECOND'; - g_anytype_name_map(dbms_types.typecode_bfloat) := 'BINARY_FLOAT'; - g_anytype_name_map(dbms_types.typecode_bdouble) := 'BINARY_DOUBLE'; - g_anytype_name_map(dbms_types.typecode_urowid) := 'UROWID'; - g_anytype_name_map(dbms_types.typecode_varray) := 'VARRRAY'; - g_anytype_name_map(dbms_types.typecode_table) := 'TABLE'; - g_anytype_name_map(dbms_types.typecode_namedcollection) := 'NAMEDCOLLECTION'; - g_anytype_name_map(dbms_types.typecode_object) := 'OBJECT'; - - g_type_name_map( dbms_sql.binary_bouble_type ) := 'BINARY_DOUBLE'; - g_type_name_map( dbms_sql.bfile_type ) := 'BFILE'; - g_type_name_map( dbms_sql.binary_float_type ) := 'BINARY_FLOAT'; - g_type_name_map( dbms_sql.blob_type ) := 'BLOB'; - g_type_name_map( dbms_sql.long_raw_type ) := 'LONG RAW'; - g_type_name_map( dbms_sql.char_type ) := 'CHAR'; - g_type_name_map( dbms_sql.clob_type ) := 'CLOB'; - g_type_name_map( dbms_sql.long_type ) := 'LONG'; - g_type_name_map( dbms_sql.date_type ) := 'DATE'; - g_type_name_map( dbms_sql.interval_day_to_second_type ) := 'INTERVAL DAY TO SECOND'; - g_type_name_map( dbms_sql.interval_year_to_month_type ) := 'INTERVAL YEAR TO MONTH'; - g_type_name_map( dbms_sql.raw_type ) := 'RAW'; - g_type_name_map( dbms_sql.timestamp_type ) := 'TIMESTAMP'; - g_type_name_map( dbms_sql.timestamp_with_tz_type ) := 'TIMESTAMP WITH TIME ZONE'; - g_type_name_map( dbms_sql.timestamp_with_local_tz_type ) := 'TIMESTAMP WITH LOCAL TIME ZONE'; - g_type_name_map( dbms_sql.varchar2_type ) := 'VARCHAR2'; - g_type_name_map( dbms_sql.number_type ) := 'NUMBER'; - g_type_name_map( dbms_sql.rowid_type ) := 'ROWID'; - g_type_name_map( dbms_sql.urowid_type ) := 'UROWID'; - g_type_name_map( dbms_sql.user_defined_type ) := 'USER_DEFINED_TYPE'; - 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. - */ - g_type_no_length_map('ROWID') := 'ROWID'; - g_type_no_length_map('INTERVAL DAY TO SECOND') := 'INTERVAL DAY TO SECOND'; - g_type_no_length_map('INTERVAL YEAR TO MONTH') := 'INTERVAL YEAR TO MONTH'; - g_type_no_length_map('BINARY_DOUBLE') := 'BINARY_DOUBLE'; - g_type_no_length_map('BINARY_FLOAT') := 'BINARY_FLOAT'; -end; -/ +create or replace package body ut_compound_data_helper is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + 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; + + 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 {:ut3_owner:}.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 {:ut3_owner:}.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 + 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.*]' + || 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]' + || 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; + return l_results; + end; + + function generate_not_equal_stmt( + a_data_info ut_cursor_column, a_pk_table ut_varchar2_list + ) return varchar2 + is + l_pk_tab ut_varchar2_list := coalesce(a_pk_table,ut_varchar2_list()); + l_index integer; + l_sql_stmt varchar2(32767); + l_exists boolean := false; + begin + l_index := l_pk_tab.first; + if l_pk_tab.count > 0 then + loop + if a_data_info.access_path = l_pk_tab(l_index) then + l_exists := true; + end if; + exit when l_index = l_pk_tab.count or (a_data_info.access_path = l_pk_tab(l_index)); + l_index := a_pk_table.next(l_index); + end loop; + end if; + if not(l_exists) then + l_sql_stmt := ' (decode(a.'||a_data_info.transformed_name||','||' e.'||a_data_info.transformed_name||',1,0) = 0)'; + end if; + 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 + l_pk_tab ut_varchar2_list := coalesce(a_pk_table,ut_varchar2_list()); + l_index integer; + l_sql_stmt varchar2(32767); + begin + if l_pk_tab.count <> 0 then + l_index:= l_pk_tab.first; + loop + 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 + l_sql_stmt := l_sql_stmt ||' a.'||a_data_info.transformed_name||q'[ = ]'||' e.'||a_data_info.transformed_name; + end if; + exit when (a_data_info.access_path = l_pk_tab(l_index)) or l_index = l_pk_tab.count; + l_index := l_pk_tab.next(l_index); + end loop; + end if; + return l_sql_stmt; + end; + + function generate_equal_sql(a_col_name in varchar2) return varchar2 is + begin + 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 + if a_pk_table is not empty then + l_index:= a_pk_table.first; + loop + 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 + l_sql_stmt := l_sql_stmt ||a_alias||a_data_info.transformed_name; + end if; + exit when (a_data_info.access_path = a_pk_table(l_index)) or l_index = a_pk_table.count; + l_index := a_pk_table.next(l_index); + end loop; + else + l_sql_stmt := a_alias||a_data_info.transformed_name; + end if; + return l_sql_stmt; + end; + + function generate_select_stmt(a_data_info ut_cursor_column, a_alias varchar2 := 'ucd.') + return varchar2 + is + l_alias varchar2(10) := a_alias; + l_col_syntax varchar2(4000); + l_ut_owner varchar2(250) := ut_utils.ut_owner; + begin + if a_data_info.is_sql_diffable = 0 then + l_col_syntax := l_ut_owner ||'.ut_compound_data_helper.get_hash('||l_alias||a_data_info.transformed_name||'.getClobVal()) as '||a_data_info.transformed_name ; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type = 'DATE' then + l_col_syntax := 'to_date('||l_alias||a_data_info.transformed_name||') as '|| a_data_info.transformed_name; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP') then + l_col_syntax := 'to_timestamp('||l_alias||a_data_info.transformed_name||','''||ut_utils.gc_timestamp_format||''') as '|| a_data_info.transformed_name; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP WITH TIME ZONE') then + 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; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('TIMESTAMP WITH LOCAL TIME ZONE') then + 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 + l_col_syntax := l_alias||a_data_info.transformed_name||' as '|| a_data_info.transformed_name; + end if; + return l_col_syntax; + end; + + function generate_xmltab_stmt(a_data_info ut_cursor_column) return varchar2 is + l_col_type varchar2(4000); + begin + if a_data_info.is_sql_diffable = 0 then + l_col_type := 'XMLTYPE'; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('DATE','TIMESTAMP','TIMESTAMP WITH TIME ZONE', + 'TIMESTAMP WITH LOCAL TIME ZONE') then + l_col_type := 'VARCHAR2(50)'; + elsif a_data_info.is_sql_diffable = 1 and type_no_length(a_data_info.column_type) then + l_col_type := a_data_info.column_type; + elsif a_data_info.is_sql_diffable = 1 and a_data_info.column_type in ('VARCHAR2','CHAR') then + l_col_type := 'VARCHAR2('||greatest(a_data_info.column_len,4000)||')'; + 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 + l_col_type := a_data_info.column_type; + else + l_col_type := a_data_info.column_type + ||case when a_data_info.column_len is not null + then '('||a_data_info.column_len||')' + else null + end; + end if; + 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; + l_xmltab_list ut_varchar2_list := ut_varchar2_list(); + l_select_list ut_varchar2_list := ut_varchar2_list(); + l_partition_list ut_varchar2_list := ut_varchar2_list(); + l_equal_list ut_varchar2_list := ut_varchar2_list(); + l_join_by_list ut_varchar2_list := ut_varchar2_list(); + 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 + if a_list_element is not null then + a_list.extend; + a_list(a_list.last) := a_list_element; + end if; + end; + + begin + if a_data_info is not empty then + for i in 1..a_data_info.count loop + if a_data_info(i).has_nested_col = 0 then + --Get XMLTABLE column list + add_element_to_list(l_xmltab_list,generate_xmltab_stmt(a_data_info(i))); + --Get Select statment list of columns + add_element_to_list(l_select_list, generate_select_stmt(a_data_info(i))); + --Get columns by which we partition + add_element_to_list(l_partition_list,generate_partition_stmt(a_data_info(i), a_pk_table)); + --Get equal statement + add_element_to_list(l_equal_list,generate_equal_sql(a_data_info(i).transformed_name)); + --Generate join by stmt + add_element_to_list(l_join_by_list,generate_join_by_stmt(a_data_info(i), a_pk_table)); + --Generate not equal stmt + add_element_to_list(l_not_equal_list,generate_not_equal_stmt(a_data_info(i), a_pk_table)); + end if; + end loop; + + a_xml_stmt := nullif(','||ut_utils.table_to_clob(l_xmltab_list, ' , '),','); + a_select_stmt := nullif(','||ut_utils.table_to_clob(l_select_list, ' , '),','); + l_partition_tmp := ut_utils.table_to_clob(l_partition_list, ' , '); + ut_utils.append_to_clob(a_partition_stmt,' row_number() over (partition by '||l_partition_tmp||' order by '||l_partition_tmp||' ) '); + + if a_pk_table.count > 0 then + -- If key defined do the join or these and where on diffrences + a_join_by_stmt := ut_utils.table_to_clob(l_join_by_list, ' and '); + elsif a_unordered then + -- If no key defined do the join on all columns + 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 + a_join_by_stmt := 'a.item_no = e.item_no '; + end if; + a_not_equal_stmt := ut_utils.table_to_clob(l_not_equal_list, ' or '); + else + --Partition by piece when no data + ut_utils.append_to_clob(a_partition_stmt,' 1 '); + 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_ut_owner varchar2(250) := ut_utils.ut_owner; + l_join_by_list ut_varchar2_list; + + function get_join_type(a_inclusion_compare in boolean,a_negated in boolean) return varchar2 is + begin + return + case + when a_inclusion_compare and not(a_negated) then ' right outer join ' + 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 + return + case + 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. + */ + l_join_by_list := + case + 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; + + dbms_lob.createtemporary(l_compare_sql, true); + --Initiate a SQL template with placeholders + ut_utils.append_to_clob(l_compare_sql, g_compare_sql_template); + --Generate a pieceso of dynamic SQL that will substitute placeholders + 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 + ); + + l_compare_sql := replace(l_compare_sql,'{:duplicate_number:}',l_partition_stmt); + l_compare_sql := replace(l_compare_sql,'{:columns:}',l_select_stmt); + l_compare_sql := replace(l_compare_sql,'{:ut3_owner:}',l_ut_owner); + l_compare_sql := replace(l_compare_sql,'{:xml_to_columns:}',l_xmltable_stmt); + l_compare_sql := replace(l_compare_sql,'{:item_no:}',get_item_no(a_unordered)); + l_compare_sql := replace(l_compare_sql,'{:join_type:}',get_join_type(a_inclusion_type,a_is_negated)); + l_compare_sql := replace(l_compare_sql,'{:join_condition:}',l_join_on_stmt); + + 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 + 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 + if a_inclusion_type then + ut_utils.append_to_clob(l_where_stmt,case when a_is_negated then ' 1 = 1 ' else ' ( a.data_id is null ) ' end); + else + ut_utils.append_to_clob(l_where_stmt,' (a.data_id is null or e.data_id is null) '); + end if; + + l_compare_sql := replace(l_compare_sql,'{:where_condition:}',l_where_stmt); + return l_compare_sql; + end; + + function get_column_extract_path(a_cursor_info ut_cursor_column_tab) return ut_varchar2_list is + l_column_list ut_varchar2_list := ut_varchar2_list(); + begin + for i in 1..a_cursor_info.count loop + l_column_list.extend; + l_column_list(l_column_list.last) := a_cursor_info(i).access_path; + end loop; + 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 + l_act_extract_xpath varchar2(32767):= ut_utils.to_xpath(get_column_extract_path(a_act_cursor_info)); + l_exp_extract_xpath varchar2(32767):= ut_utils.to_xpath(get_column_extract_path(a_exp_cursor_info)); + l_join_xpath varchar2(32767) := ut_utils.to_xpath(a_join_by_list); + l_results tt_row_diffs; + l_sql varchar2(32767); + begin + 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 ( ]' + || 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,]' + ||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 + ]' + 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; + 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; + return l_results; + end; + + function get_hash(a_data raw, a_hash_type binary_integer := dbms_crypto.hash_sh1) return t_hash is + begin + 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 + return dbms_crypto.hash(a_data, a_hash_type); + end; + + function get_fixed_size_hash(a_string varchar2, a_base integer :=0,a_size integer := 9999999) return number is + begin + 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 + 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 + g_diff_count := a_rows_diff; + end; + + procedure cleanup_diff is + begin + g_diff_count := 0; + end; + + function get_rows_diff_count return integer is + begin + 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 + if a_type_name IN (g_type_name_map(dbms_sql.blob_type), + g_type_name_map(dbms_sql.clob_type), + g_type_name_map(dbms_sql.long_type), + g_type_name_map(dbms_sql.long_raw_type), + g_type_name_map(dbms_sql.bfile_type), + g_anytype_name_map(dbms_types.typecode_namedcollection)) + then + l_assert := false; + else + l_assert := true; + end if; + return l_assert; + end; + + function get_column_type_desc(a_type_code in integer, a_dbms_sql_desc in boolean) + return varchar2 is + begin + return + case + 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 + open l_diff_cursor for a_diff_cursor_text using a_self_id, a_other_id; + return l_diff_cursor; + end; + + function create_err_cursor_msg(a_error_stack varchar2) return varchar2 is + begin + 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)|| + 'Check the query and data for errors.'; + end; + + function type_no_length ( a_type_name varchar2) return boolean is + begin + return case + when g_type_no_length_map.exists(a_type_name) then + true + else + false + end; + end; + +begin + g_anytype_name_map(dbms_types.typecode_date) := 'DATE'; + g_anytype_name_map(dbms_types.typecode_number) := 'NUMBER'; + g_anytype_name_map(3 /*INTEGER in object type*/) := 'NUMBER'; + g_anytype_name_map(dbms_types.typecode_raw) := 'RAW'; + g_anytype_name_map(dbms_types.typecode_char) := 'CHAR'; + g_anytype_name_map(dbms_types.typecode_varchar2) := 'VARCHAR2'; + g_anytype_name_map(dbms_types.typecode_varchar) := 'VARCHAR'; + g_anytype_name_map(dbms_types.typecode_blob) := 'BLOB'; + g_anytype_name_map(dbms_types.typecode_bfile) := 'BFILE'; + g_anytype_name_map(dbms_types.typecode_clob) := 'CLOB'; + g_anytype_name_map(dbms_types.typecode_timestamp) := 'TIMESTAMP'; + g_anytype_name_map(dbms_types.typecode_timestamp_tz) := 'TIMESTAMP WITH TIME ZONE'; + g_anytype_name_map(dbms_types.typecode_timestamp_ltz) := 'TIMESTAMP WITH LOCAL TIME ZONE'; + g_anytype_name_map(dbms_types.typecode_interval_ym) := 'INTERVAL YEAR TO MONTH'; + g_anytype_name_map(dbms_types.typecode_interval_ds) := 'INTERVAL DAY TO SECOND'; + g_anytype_name_map(dbms_types.typecode_bfloat) := 'BINARY_FLOAT'; + g_anytype_name_map(dbms_types.typecode_bdouble) := 'BINARY_DOUBLE'; + g_anytype_name_map(dbms_types.typecode_urowid) := 'UROWID'; + g_anytype_name_map(dbms_types.typecode_varray) := 'VARRRAY'; + g_anytype_name_map(dbms_types.typecode_table) := 'TABLE'; + g_anytype_name_map(dbms_types.typecode_namedcollection) := 'NAMEDCOLLECTION'; + g_anytype_name_map(dbms_types.typecode_object) := 'OBJECT'; + + g_type_name_map( dbms_sql.binary_bouble_type ) := 'BINARY_DOUBLE'; + g_type_name_map( dbms_sql.bfile_type ) := 'BFILE'; + g_type_name_map( dbms_sql.binary_float_type ) := 'BINARY_FLOAT'; + g_type_name_map( dbms_sql.blob_type ) := 'BLOB'; + g_type_name_map( dbms_sql.long_raw_type ) := 'LONG RAW'; + g_type_name_map( dbms_sql.char_type ) := 'CHAR'; + g_type_name_map( dbms_sql.clob_type ) := 'CLOB'; + g_type_name_map( dbms_sql.long_type ) := 'LONG'; + g_type_name_map( dbms_sql.date_type ) := 'DATE'; + g_type_name_map( dbms_sql.interval_day_to_second_type ) := 'INTERVAL DAY TO SECOND'; + g_type_name_map( dbms_sql.interval_year_to_month_type ) := 'INTERVAL YEAR TO MONTH'; + g_type_name_map( dbms_sql.raw_type ) := 'RAW'; + g_type_name_map( dbms_sql.timestamp_type ) := 'TIMESTAMP'; + g_type_name_map( dbms_sql.timestamp_with_tz_type ) := 'TIMESTAMP WITH TIME ZONE'; + g_type_name_map( dbms_sql.timestamp_with_local_tz_type ) := 'TIMESTAMP WITH LOCAL TIME ZONE'; + g_type_name_map( dbms_sql.varchar2_type ) := 'VARCHAR2'; + g_type_name_map( dbms_sql.number_type ) := 'NUMBER'; + g_type_name_map( dbms_sql.rowid_type ) := 'ROWID'; + g_type_name_map( dbms_sql.urowid_type ) := 'UROWID'; + g_type_name_map( dbms_sql.user_defined_type ) := 'USER_DEFINED_TYPE'; + 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. + */ + g_type_no_length_map('ROWID') := 'ROWID'; + g_type_no_length_map('INTERVAL DAY TO SECOND') := 'INTERVAL DAY TO SECOND'; + g_type_no_length_map('INTERVAL YEAR TO MONTH') := 'INTERVAL YEAR TO MONTH'; + g_type_no_length_map('BINARY_DOUBLE') := 'BINARY_DOUBLE'; + g_type_no_length_map('BINARY_FLOAT') := 'BINARY_FLOAT'; +end; +/ diff --git a/source/expectations/data_values/ut_cursor_column.tps b/source/expectations/data_values/ut_cursor_column.tps index da3c004f2..93114c431 100644 --- a/source/expectations/data_values/ut_cursor_column.tps +++ b/source/expectations/data_values/ut_cursor_column.tps @@ -1,52 +1,52 @@ -create or replace type ut_cursor_column authid current_user as object ( - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - parent_name varchar2(4000), - access_path varchar2(4000), - filter_path varchar2(4000), - display_path varchar2(4000), - has_nested_col number(1,0), - transformed_name varchar2(2000), - hierarchy_level number, - column_position number, - xml_valid_name varchar2(2000), - column_name varchar2(2000), - column_type varchar2(128), - column_type_name varchar2(128), - column_schema varchar2(128), - column_len integer, - column_precision integer, - column_scale integer, - is_sql_diffable number(1, 0), - is_collection number(1, 0), - - 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 in varchar2, a_collection integer,a_access_path in varchar2, a_col_precision in integer, - a_col_scale integer), - - 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, - - constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result -) -/ +create or replace type ut_cursor_column authid current_user as object ( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + parent_name varchar2(4000), + access_path varchar2(4000), + filter_path varchar2(4000), + display_path varchar2(4000), + has_nested_col number(1,0), + transformed_name varchar2(2000), + hierarchy_level number, + column_position number, + xml_valid_name varchar2(2000), + column_name varchar2(2000), + column_type varchar2(128), + column_type_name varchar2(128), + column_schema varchar2(128), + column_len integer, + column_precision integer, + column_scale integer, + is_sql_diffable number(1, 0), + is_collection number(1, 0), + + 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 in varchar2, a_collection integer,a_access_path in varchar2, a_col_precision in integer, + a_col_scale integer), + + 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, + + constructor function ut_cursor_column( self in out nocopy ut_cursor_column) return self as result +) +/ diff --git a/source/expectations/data_values/ut_cursor_details.tpb b/source/expectations/data_values/ut_cursor_details.tpb index 0c617a226..20313ed96 100644 --- a/source/expectations/data_values/ut_cursor_details.tpb +++ b/source/expectations/data_values/ut_cursor_details.tpb @@ -1,257 +1,256 @@ -create or replace 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 - 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; - 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 - 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 - l_elements_info := ut_metadata.get_anytype_members_info( a_compound_data ); - l_is_collection := ut_metadata.is_collection(l_elements_info.type_code); - if l_elements_info.elements_count is null then - l_element_info := ut_metadata.get_attr_elem_info( a_compound_data ); - self.cursor_columns_info.extend; - 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 - ); - if l_element_info.attr_elt_type is not null then - 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 - while l_idx <= l_elements_info.elements_count loop - l_element_info := ut_metadata.get_attr_elem_info( a_compound_data, l_idx ); - - self.cursor_columns_info.extend; - 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 - ); - if l_element_info.attr_elt_type is not null then - 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; - 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 - self.cursor_columns_info := ut_cursor_column_tab(); - 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; - l_hierarchy_level integer := 1; - begin - self.cursor_columns_info := ut_cursor_column_tab(); - self.is_anydata := 0; - 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); - **/ - for pos in 1 .. l_columns_count loop - l_is_collection := ut_metadata.is_collection( l_columns_desc(pos).col_schema_name, l_columns_desc(pos).col_type_name ); - self.cursor_columns_info.extend; - 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 - ); - - if l_columns_desc(pos).col_type = dbms_sql.user_defined_type or l_is_collection then - 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; - return; - end; - - member function contains_collection return boolean is - l_collection_elements number; - begin - select count(1) into l_collection_elements - from table(cursor_columns_info) c - where c.is_collection = 1 and rownum = 1; - 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}') - 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; - return l_result; - end; - - member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options) is - l_result ut_cursor_details := self; - l_column_tab ut_cursor_column_tab := ut_cursor_column_tab(); - l_column ut_cursor_column; - c_xpath_extract_reg constant varchar2(50) := '^((/ROW/)|^(//)|^(/\*/))?(.*)'; - begin - if l_result.cursor_columns_info is not null then - - --limit columns to those on the include items minus exclude items - if a_match_options.include.items.count > 0 then - -- if include - exclude = 0 then keep all columns - if a_match_options.include.items != a_match_options.exclude.items then - 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; - elsif a_match_options.exclude.items.count > 0 then - 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 - for i in ( - 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 - l_column := i.col_info; - l_column.column_position := i.new_position; - l_column_tab.extend; - l_column_tab(l_column_tab.last) := l_column; - end loop; - - l_result.cursor_columns_info := l_column_tab; - self := l_result; - end if; - end; - - member function get_xml_children(a_parent_name varchar2 := null) return xmltype is - l_result xmltype; - begin - 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; - return l_result; - end; - - member function get_root return varchar2 is - l_root varchar2(250); - begin - if self.cursor_columns_info.count > 0 then - select x.access_path into l_root from table(self.cursor_columns_info) x - where x.hierarchy_level = 1; - else - l_root := null; - end if; - return l_root; - end; - - member procedure strip_root_from_anydata(self in out nocopy ut_cursor_details) is - l_root varchar2(250) := get_root(); - begin - self.is_anydata := 1; - for i in 1..cursor_columns_info.count loop - self.cursor_columns_info(i).filter_path := '/'||ut_utils.strip_prefix(self.cursor_columns_info(i).access_path,l_root); - end loop; - end; - -end; -/ +create or replace 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 + 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; + 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 + 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 + l_elements_info := ut_metadata.get_anytype_members_info( a_compound_data ); + l_is_collection := ut_metadata.is_collection(l_elements_info.type_code); + if l_elements_info.elements_count is null then + l_element_info := ut_metadata.get_attr_elem_info( a_compound_data ); + self.cursor_columns_info.extend; + 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 + ); + if l_element_info.attr_elt_type is not null then + 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 + while l_idx <= l_elements_info.elements_count loop + l_element_info := ut_metadata.get_attr_elem_info( a_compound_data, l_idx ); + + self.cursor_columns_info.extend; + 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 + ); + if l_element_info.attr_elt_type is not null then + 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; + 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 + self.cursor_columns_info := ut_cursor_column_tab(); + 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; + l_hierarchy_level integer := 1; + begin + self.cursor_columns_info := ut_cursor_column_tab(); + self.is_anydata := 0; + 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); + **/ + for pos in 1 .. l_columns_count loop + l_is_collection := ut_metadata.is_collection( l_columns_desc(pos).col_schema_name, l_columns_desc(pos).col_type_name ); + self.cursor_columns_info.extend; + 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 + ); + + if l_columns_desc(pos).col_type = dbms_sql.user_defined_type or l_is_collection then + 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; + return; + end; + + member function contains_collection return boolean is + l_collection_elements number; + begin + select count(1) into l_collection_elements + from table(cursor_columns_info) c + where c.is_collection = 1 and rownum = 1; + 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}') + 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; + return l_result; + end; + + member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options) is + l_result ut_cursor_details := self; + l_column_tab ut_cursor_column_tab := ut_cursor_column_tab(); + l_column ut_cursor_column; + c_xpath_extract_reg constant varchar2(50) := '^((/ROW/)|^(//)|^(/\*/))?(.*)'; + begin + if l_result.cursor_columns_info is not null then + + --limit columns to those on the include items minus exclude items + if a_match_options.include.items.count > 0 then + -- if include - exclude = 0 then keep all columns + if a_match_options.include.items != a_match_options.exclude.items then + 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; + elsif a_match_options.exclude.items.count > 0 then + 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 + for i in ( + 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 + l_column := i.col_info; + l_column.column_position := i.new_position; + l_column_tab.extend; + l_column_tab(l_column_tab.last) := l_column; + end loop; + + l_result.cursor_columns_info := l_column_tab; + self := l_result; + end if; + end; + + member function get_xml_children(a_parent_name varchar2 := null) return xmltype is + l_result xmltype; + begin + 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; + return l_result; + end; + + member function get_root return varchar2 is + l_root varchar2(250); + begin + if self.cursor_columns_info.count > 0 then + select x.access_path into l_root from table(self.cursor_columns_info) x + where x.hierarchy_level = 1; + else + l_root := null; + end if; + return l_root; + end; + + member procedure strip_root_from_anydata(self in out nocopy ut_cursor_details) is + l_root varchar2(250) := get_root(); + begin + self.is_anydata := 1; + for i in 1..cursor_columns_info.count loop + self.cursor_columns_info(i).filter_path := '/'||ut_utils.strip_prefix(self.cursor_columns_info(i).access_path,l_root); + end loop; + end; +end; +/ diff --git a/source/expectations/data_values/ut_cursor_details.tps b/source/expectations/data_values/ut_cursor_details.tps index e6c80a3b5..43e70b123 100644 --- a/source/expectations/data_values/ut_cursor_details.tps +++ b/source/expectations/data_values/ut_cursor_details.tps @@ -1,41 +1,41 @@ -create or replace type ut_cursor_details authid current_user as object ( - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - cursor_columns_info ut_cursor_column_tab, - - /*if type is anydata we need to skip level 1 on joinby / inlude / exclude as its artificial cursor*/ - is_anydata number(1,0), - constructor function ut_cursor_details(self in out nocopy ut_cursor_details) return self as result, - constructor function ut_cursor_details( - self in out nocopy ut_cursor_details,a_cursor_number in number - ) return self as result, - member function equals(a_other ut_cursor_details, a_match_options ut_matcher_options) return boolean, - 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 - ), - member function contains_collection return boolean, - member function get_missing_join_by_columns( a_expected_columns ut_varchar2_list ) return ut_varchar2_list, - member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options), - member function get_xml_children(a_parent_name varchar2 := null) return xmltype, - member function get_root return varchar2, - member procedure strip_root_from_anydata(self in out nocopy ut_cursor_details) -) -/ +create or replace type ut_cursor_details authid current_user as object ( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + cursor_columns_info ut_cursor_column_tab, + + /*if type is anydata we need to skip level 1 on joinby / inlude / exclude as its artificial cursor*/ + is_anydata number(1,0), + constructor function ut_cursor_details(self in out nocopy ut_cursor_details) return self as result, + constructor function ut_cursor_details( + self in out nocopy ut_cursor_details,a_cursor_number in number + ) return self as result, + member function equals(a_other ut_cursor_details, a_match_options ut_matcher_options) return boolean, + 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 + ), + member function contains_collection return boolean, + member function get_missing_join_by_columns( a_expected_columns ut_varchar2_list ) return ut_varchar2_list, + member procedure filter_columns(self in out nocopy ut_cursor_details, a_match_options ut_matcher_options), + member function get_xml_children(a_parent_name varchar2 := null) return xmltype, + member function get_root return varchar2, + member procedure strip_root_from_anydata(self in out nocopy ut_cursor_details) +) +/ diff --git a/source/expectations/data_values/ut_data_value_anydata.tpb b/source/expectations/data_values/ut_data_value_anydata.tpb index 808e52197..fe9a6a1bc 100644 --- a/source/expectations/data_values/ut_data_value_anydata.tpb +++ b/source/expectations/data_values/ut_data_value_anydata.tpb @@ -1,143 +1,142 @@ -create or replace type body ut_data_value_anydata as - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - overriding member function get_object_info return varchar2 is - begin - return self.data_type || case when self.compound_type = 'collection' then ' [ count = '||self.elements_count||' ]' else null end; - end; - - member function get_extract_path(a_data_value anydata) return varchar2 is - l_path varchar2(10); - begin - if self.compound_type = 'object' then - l_path := '/*/*'; - else - case when ut_metadata.has_collection_members(a_data_value) then - l_path := '/*/*'; - else - l_path := '/*'; - end case; - end if; - return l_path; - end; - - member function get_cursor_sql_from_anydata(a_data_value anydata) return varchar2 is - l_cursor_sql varchar2(32767); - begin - 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); '|| - 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;'; - 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 - self.data_type := ut_metadata.get_anydata_typename(a_value); - self.compound_type := get_instance(a_value); - self.is_data_null := ut_metadata.is_anytype_null(a_value,self.compound_type); - self.data_id := sys_guid(); - self.self_type := $$plsql_unit; - self.cursor_details := ut_cursor_details(); - - ut_compound_data_helper.cleanup_diff; - - if not self.is_null() then - self.extract_path := get_extract_path(a_value); - l_anydata_sql := get_cursor_sql_from_anydata(a_value); - execute immediate l_anydata_sql using in a_value, in out l_refcursor; - if l_refcursor%isopen then - self.extract_cursor(l_refcursor); - l_cursor_number := dbms_sql.to_cursor_number(l_refcursor); - self.cursor_details := ut_cursor_details(l_cursor_number); - self.cursor_details.strip_root_from_anydata; - 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 - l_result := ut_metadata.get_anydata_compound_type(a_data_value); - 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; - 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 - init(a_value); - 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 - l_result integer := 0; - begin - if not a_other is of (ut_data_value_anydata) then - raise value_error; - end if; - l_result := l_result + (self as ut_data_value_refcursor).compare_implementation(a_other,a_match_options,a_inclusion_compare,a_is_negated); - return l_result; - end; - - overriding member function is_empty return boolean is - begin - if self.compound_type = 'collection' then - return self.elements_count = 0; - else - raise value_error; - end if; - end; - -end; -/ +create or replace type body ut_data_value_anydata as + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + overriding member function get_object_info return varchar2 is + begin + return self.data_type || case when self.compound_type = 'collection' then ' [ count = '||self.elements_count||' ]' else null end; + end; + + member function get_extract_path(a_data_value anydata) return varchar2 is + l_path varchar2(10); + begin + if self.compound_type = 'object' then + l_path := '/*/*'; + else + case when ut_metadata.has_collection_members(a_data_value) then + l_path := '/*/*'; + else + l_path := '/*'; + end case; + end if; + return l_path; + end; + + member function get_cursor_sql_from_anydata(a_data_value anydata) return varchar2 is + l_cursor_sql varchar2(32767); + begin + 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); '|| + 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;'; + 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 + self.data_type := ut_metadata.get_anydata_typename(a_value); + self.compound_type := get_instance(a_value); + self.is_data_null := ut_metadata.is_anytype_null(a_value,self.compound_type); + self.data_id := sys_guid(); + self.self_type := $$plsql_unit; + self.cursor_details := ut_cursor_details(); + + ut_compound_data_helper.cleanup_diff; + + if not self.is_null() then + self.extract_path := get_extract_path(a_value); + l_anydata_sql := get_cursor_sql_from_anydata(a_value); + execute immediate l_anydata_sql using in a_value, in out l_refcursor; + if l_refcursor%isopen then + self.extract_cursor(l_refcursor); + l_cursor_number := dbms_sql.to_cursor_number(l_refcursor); + self.cursor_details := ut_cursor_details(l_cursor_number); + self.cursor_details.strip_root_from_anydata; + 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 + l_result := ut_metadata.get_anydata_compound_type(a_data_value); + 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; + 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 + init(a_value); + 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 + l_result integer := 0; + begin + if not a_other is of (ut_data_value_anydata) then + raise value_error; + end if; + l_result := l_result + (self as ut_data_value_refcursor).compare_implementation(a_other,a_match_options,a_inclusion_compare,a_is_negated); + return l_result; + end; + + overriding member function is_empty return boolean is + begin + if self.compound_type = 'collection' then + return self.elements_count = 0; + else + raise value_error; + end if; + end; +end; +/ diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index b93158cf1..d73a3e011 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -1,398 +1,397 @@ -create or replace type body ut_data_value_refcursor as - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - constructor function ut_data_value_refcursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) - return self as result is - begin - init(a_value); - return; - end; - - member procedure extract_cursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) - is - c_bulk_rows constant integer := 10000; - l_cursor sys_refcursor := a_value; - l_ctx number; - l_xml xmltype; - l_ut_owner varchar2(250) := ut_utils.ut_owner; - l_set_id integer := 0; - 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. - ut_expectation_processor.set_xml_nls_params(); - l_ctx := dbms_xmlgen.newContext(l_cursor); - dbms_xmlgen.setNullHandling(l_ctx, dbms_xmlgen.empty_tag); - dbms_xmlgen.setMaxRows(l_ctx, c_bulk_rows); - loop - l_xml := dbms_xmlgen.getxmltype(l_ctx); - 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 - l_xml := xmltype( replace(l_xml.getClobVal(),' 0 then - ut_utils.append_to_clob( l_result, self.cursor_details.get_xml_children().getclobval() ); - end if; - ut_utils.append_to_clob(l_result,chr(10)||(self as ut_compound_data_value).to_string()); - l_result_string := ut_utils.to_string(l_result,null); - dbms_lob.freetemporary(l_result); - end if; - 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; - l_results ut_utils.t_clob_tab := ut_utils.t_clob_tab(); - l_result_string varchar2(32767); - l_other ut_data_value_refcursor; - 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; - - l_act_missing_pk ut_varchar2_list := ut_varchar2_list(); - l_exp_missing_pk ut_varchar2_list := ut_varchar2_list(); - - c_max_rows integer := ut_utils.gc_diff_max_rows; - l_diff_id ut_compound_data_helper.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 - return - case a_col.diff_type - when '-' then - ' Column <'||a_col.expected_name||'> [data-type: '||a_col.expected_type||'] is missing. Expected column position: '||a_col.expected_pos||'.' - when '+' then - ' Column <'||a_col.actual_name||'> [position: '||a_col.actual_pos||', data-type: '||a_col.actual_type||'] is not expected in results.' - when 't' then - ' Column <'||a_col.actual_name||'> data-type is invalid. Expected: '||a_col.expected_type||',' ||' actual: '||a_col.actual_type||'.' - 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 - l_missing_cols ut_varchar2_list := ut_varchar2_list(); - l_result ut_cursor_column_tab; - begin - for i in 1 .. a_column_diffs.count loop - if a_column_diffs(i).diff_type in ('-','+') then - l_missing_cols.extend; - l_missing_cols(l_missing_cols.last) := coalesce(a_column_diffs(i).expected_name, a_column_diffs(i).actual_name); - end if; - end loop; - 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 - ); - 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 - if a_is_unordered then - if a_row_diff.pk_value is not null then - return ' PK '||a_row_diff.pk_value||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; - else - return rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; - end if; - else - return ' Row No. '||a_row_diff.rn||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; - end if; - end; - - begin - if not a_other is of (ut_data_value_refcursor) then - raise value_error; - end if; - l_other := treat(a_other as ut_data_value_refcursor); - l_other.cursor_details.filter_columns(a_match_options); - l_self.cursor_details.filter_columns(a_match_options); - - l_other_cols := l_other.cursor_details.cursor_columns_info; - l_self_cols := l_self.cursor_details.cursor_columns_info; - - dbms_lob.createtemporary(l_result,true); - --diff columns - if not l_self.is_null and not l_other.is_null then - 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() - ); - - if l_column_diffs.count > 0 then - ut_utils.append_to_clob(l_result,chr(10) || 'Columns:' || chr(10)); - l_other_cols := remove_incomparable_cols( l_other_cols, l_column_diffs ); - l_self_cols := remove_incomparable_cols( l_self_cols, l_column_diffs ); - for i in 1 .. l_column_diffs.count loop - l_results.extend; - l_results(l_results.last) := get_col_diff_text(l_column_diffs(i)); - end loop; - ut_utils.append_to_clob(l_result, l_results); - end if; - end if; - - --check for missing pk - if a_match_options.join_by.items.count > 0 then - l_act_missing_pk := l_other.cursor_details.get_missing_join_by_columns( a_match_options.join_by.items ); - 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 - if l_act_missing_pk.count + l_exp_missing_pk.count = 0 then - l_diff_id := ut_compound_data_helper.get_hash( l_self.data_id || l_other.data_id ); - - -- First tell how many rows are different - l_diff_row_count := ut_compound_data_helper.get_rows_diff_count; - if l_diff_row_count > 0 then - 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, - case - 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 - ); - l_message := chr(10) - ||'Rows: [ ' || l_diff_row_count ||' differences' - || case when l_diff_row_count > c_max_rows and l_row_diffs.count > 0 then ', showing first '||c_max_rows end - ||' ]'||chr(10)|| case when l_row_diffs.count = 0 then ' All rows are different as the columns are not matching.' else null end; - ut_utils.append_to_clob( l_result, l_message ); - l_results := ut_utils.t_clob_tab(); - for i in 1 .. l_row_diffs.count loop - l_results.extend; - l_results(l_results.last) := get_diff_message(l_row_diffs(i),a_match_options.unordered); - end loop; - ut_utils.append_to_clob(l_result,l_results); - else - l_message:= chr(10)||'Rows: [ all different ]'||chr(10)||' All rows are different as the columns position is not matching.'; - ut_utils.append_to_clob( l_result, l_message ); - end if; - else - ut_utils.append_to_clob(l_result,chr(10) || 'Unable to join sets:' || chr(10)); - - for i in 1 .. l_exp_missing_pk.count loop - ut_utils.append_to_clob(l_result, ' Join key '||l_exp_missing_pk(i)||' does not exists in expected'||chr(10)); - end loop; - - for i in 1 .. l_act_missing_pk.count loop - ut_utils.append_to_clob(l_result, ' Join key '||l_act_missing_pk(i)||' does not exists in actual'||chr(10)); - end loop; - - if l_self.cursor_details.contains_collection() or l_other.cursor_details.contains_collection() then - 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; - - l_result_string := ut_utils.to_string(l_result,null); - dbms_lob.freetemporary(l_result); - 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 - l_result integer := 0; - 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_compound_data_helper.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; - l_diif_rowcount integer :=0; - begin - l_diff_id := ut_compound_data_helper.get_hash(a_self.data_id||a_other.data_id); - - begin - 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 - 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; - - ut_compound_data_helper.insert_diffs_result( l_diff_tab, l_diff_id ); - --fetch rows for count only - loop - exit when l_diff_tab.count = 0; - l_diif_rowcount := l_diif_rowcount + l_diff_tab.count; - fetch l_cursor bulk collect into l_diff_tab limit ut_utils.gc_bc_fetch_limit; - end loop; - - ut_compound_data_helper.set_rows_diff(l_diif_rowcount); - - --result is OK only if both are same - if l_diif_rowcount = 0 and a_self.is_null = a_other.is_null then - l_result := 0; - else - l_result := 1; - end if; - close l_cursor; - return l_result; - end; - begin - if not a_other is of (ut_data_value_refcursor) then - raise value_error; - end if; - - l_other := treat(a_other as ut_data_value_refcursor); - l_other.cursor_details.filter_columns( a_match_options ); - l_self.cursor_details.filter_columns( a_match_options ); - - if a_match_options.join_by.items.count > 0 then - 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; - - if l_result = 0 then - 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 - l_result := 1; - end if; - - 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 - ); - l_result := l_result + compare_data( l_self, l_other, l_diff_cursor_text ); - end if; - return l_result; - end; - - overriding member function is_empty return boolean is - begin - return self.elements_count = 0; - end; - -end; -/ +create or replace type body ut_data_value_refcursor as + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + constructor function ut_data_value_refcursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) + return self as result is + begin + init(a_value); + return; + end; + + member procedure extract_cursor(self in out nocopy ut_data_value_refcursor, a_value sys_refcursor) + is + c_bulk_rows constant integer := 10000; + l_cursor sys_refcursor := a_value; + l_ctx number; + l_xml xmltype; + l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_set_id integer := 0; + 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. + ut_expectation_processor.set_xml_nls_params(); + l_ctx := dbms_xmlgen.newContext(l_cursor); + dbms_xmlgen.setNullHandling(l_ctx, dbms_xmlgen.empty_tag); + dbms_xmlgen.setMaxRows(l_ctx, c_bulk_rows); + loop + l_xml := dbms_xmlgen.getxmltype(l_ctx); + 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 + l_xml := xmltype( replace(l_xml.getClobVal(),' 0 then + ut_utils.append_to_clob( l_result, self.cursor_details.get_xml_children().getclobval() ); + end if; + ut_utils.append_to_clob(l_result,chr(10)||(self as ut_compound_data_value).to_string()); + l_result_string := ut_utils.to_string(l_result,null); + dbms_lob.freetemporary(l_result); + end if; + 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; + l_results ut_utils.t_clob_tab := ut_utils.t_clob_tab(); + l_result_string varchar2(32767); + l_other ut_data_value_refcursor; + 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; + + l_act_missing_pk ut_varchar2_list := ut_varchar2_list(); + l_exp_missing_pk ut_varchar2_list := ut_varchar2_list(); + + c_max_rows integer := ut_utils.gc_diff_max_rows; + l_diff_id ut_compound_data_helper.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 + return + case a_col.diff_type + when '-' then + ' Column <'||a_col.expected_name||'> [data-type: '||a_col.expected_type||'] is missing. Expected column position: '||a_col.expected_pos||'.' + when '+' then + ' Column <'||a_col.actual_name||'> [position: '||a_col.actual_pos||', data-type: '||a_col.actual_type||'] is not expected in results.' + when 't' then + ' Column <'||a_col.actual_name||'> data-type is invalid. Expected: '||a_col.expected_type||',' ||' actual: '||a_col.actual_type||'.' + 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 + l_missing_cols ut_varchar2_list := ut_varchar2_list(); + l_result ut_cursor_column_tab; + begin + for i in 1 .. a_column_diffs.count loop + if a_column_diffs(i).diff_type in ('-','+') then + l_missing_cols.extend; + l_missing_cols(l_missing_cols.last) := coalesce(a_column_diffs(i).expected_name, a_column_diffs(i).actual_name); + end if; + end loop; + 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 + ); + 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 + if a_is_unordered then + if a_row_diff.pk_value is not null then + return ' PK '||a_row_diff.pk_value||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; + else + return rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; + end if; + else + return ' Row No. '||a_row_diff.rn||' - '||rpad(a_row_diff.diff_type,10)||a_row_diff.diffed_row; + end if; + end; + + begin + if not a_other is of (ut_data_value_refcursor) then + raise value_error; + end if; + l_other := treat(a_other as ut_data_value_refcursor); + l_other.cursor_details.filter_columns(a_match_options); + l_self.cursor_details.filter_columns(a_match_options); + + l_other_cols := l_other.cursor_details.cursor_columns_info; + l_self_cols := l_self.cursor_details.cursor_columns_info; + + dbms_lob.createtemporary(l_result,true); + --diff columns + if not l_self.is_null and not l_other.is_null then + 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() + ); + + if l_column_diffs.count > 0 then + ut_utils.append_to_clob(l_result,chr(10) || 'Columns:' || chr(10)); + l_other_cols := remove_incomparable_cols( l_other_cols, l_column_diffs ); + l_self_cols := remove_incomparable_cols( l_self_cols, l_column_diffs ); + for i in 1 .. l_column_diffs.count loop + l_results.extend; + l_results(l_results.last) := get_col_diff_text(l_column_diffs(i)); + end loop; + ut_utils.append_to_clob(l_result, l_results); + end if; + end if; + + --check for missing pk + if a_match_options.join_by.items.count > 0 then + l_act_missing_pk := l_other.cursor_details.get_missing_join_by_columns( a_match_options.join_by.items ); + 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 + if l_act_missing_pk.count + l_exp_missing_pk.count = 0 then + l_diff_id := ut_compound_data_helper.get_hash( l_self.data_id || l_other.data_id ); + + -- First tell how many rows are different + l_diff_row_count := ut_compound_data_helper.get_rows_diff_count; + if l_diff_row_count > 0 then + 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, + case + 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 + ); + l_message := chr(10) + ||'Rows: [ ' || l_diff_row_count ||' differences' + || case when l_diff_row_count > c_max_rows and l_row_diffs.count > 0 then ', showing first '||c_max_rows end + ||' ]'||chr(10)|| case when l_row_diffs.count = 0 then ' All rows are different as the columns are not matching.' else null end; + ut_utils.append_to_clob( l_result, l_message ); + l_results := ut_utils.t_clob_tab(); + for i in 1 .. l_row_diffs.count loop + l_results.extend; + l_results(l_results.last) := get_diff_message(l_row_diffs(i),a_match_options.unordered); + end loop; + ut_utils.append_to_clob(l_result,l_results); + else + l_message:= chr(10)||'Rows: [ all different ]'||chr(10)||' All rows are different as the columns position is not matching.'; + ut_utils.append_to_clob( l_result, l_message ); + end if; + else + ut_utils.append_to_clob(l_result,chr(10) || 'Unable to join sets:' || chr(10)); + + for i in 1 .. l_exp_missing_pk.count loop + ut_utils.append_to_clob(l_result, ' Join key '||l_exp_missing_pk(i)||' does not exists in expected'||chr(10)); + end loop; + + for i in 1 .. l_act_missing_pk.count loop + ut_utils.append_to_clob(l_result, ' Join key '||l_act_missing_pk(i)||' does not exists in actual'||chr(10)); + end loop; + + if l_self.cursor_details.contains_collection() or l_other.cursor_details.contains_collection() then + 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; + + l_result_string := ut_utils.to_string(l_result,null); + dbms_lob.freetemporary(l_result); + 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 + l_result integer := 0; + 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_compound_data_helper.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; + l_diif_rowcount integer :=0; + begin + l_diff_id := ut_compound_data_helper.get_hash(a_self.data_id||a_other.data_id); + + begin + 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 + 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; + + ut_compound_data_helper.insert_diffs_result( l_diff_tab, l_diff_id ); + --fetch rows for count only + loop + exit when l_diff_tab.count = 0; + l_diif_rowcount := l_diif_rowcount + l_diff_tab.count; + fetch l_cursor bulk collect into l_diff_tab limit ut_utils.gc_bc_fetch_limit; + end loop; + + ut_compound_data_helper.set_rows_diff(l_diif_rowcount); + + --result is OK only if both are same + if l_diif_rowcount = 0 and a_self.is_null = a_other.is_null then + l_result := 0; + else + l_result := 1; + end if; + close l_cursor; + return l_result; + end; + begin + if not a_other is of (ut_data_value_refcursor) then + raise value_error; + end if; + + l_other := treat(a_other as ut_data_value_refcursor); + l_other.cursor_details.filter_columns( a_match_options ); + l_self.cursor_details.filter_columns( a_match_options ); + + if a_match_options.join_by.items.count > 0 then + 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; + + if l_result = 0 then + 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 + l_result := 1; + end if; + 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 + ); + l_result := l_result + compare_data( l_self, l_other, l_diff_cursor_text ); + end if; + return l_result; + end; + + overriding member function is_empty return boolean is + begin + return self.elements_count = 0; + end; + +end; +/ From 8c7a0089f9bfcb8568da2f965ee30c3da6d5ad8b Mon Sep 17 00:00:00 2001 From: Travis CI Date: Wed, 5 Jun 2019 10:12:38 +0000 Subject: [PATCH 147/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index d7dfefdcf..c1c945097 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index aa7b83002..e51ea8f5d 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 0cdf9cbee..a4f8ab783 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index ec0e05d7b..9ce66ce5c 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 2b660013e..13403f131 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 042bb847f..dae921832 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 7d8081a4f..f6242dce0 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index b6532232d..2ba58df80 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 18b481642..54d48b06c 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index a2b0c143f..f42e2f655 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index ec32fe4a5..affa252aa 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index cd4760351..959902d28 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 37034e458..56eccc064 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 1d47e7bc3..a12ea5501 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 7bca3b507..c962dc67b 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index a4490ec97..d25a2d697 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 5e3ec0f12..db0489a4d 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2992--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index c50326bbe..8ee9a25e1 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -760,7 +760,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2992-develop + * secion v3.1.7.2999-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 792bccb52..de32c11b0 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2992-develop'; + gc_version constant varchar2(50) := 'v3.1.7.2999-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From effb4202f92c731deb11770861b9089146cf985d Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Thu, 6 Jun 2019 00:15:18 +0100 Subject: [PATCH 148/181] Renamed `gc_tag` to `gc_tags` Added debug logging of suite cache query. --- source/core/ut_suite_builder.pkb | 12 ++++++------ source/core/ut_suite_manager.pkb | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index eab4d48b1..295f2d699 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -23,7 +23,7 @@ create or replace package body ut_suite_builder is gc_suite constant t_annotation_name := 'suite'; gc_suitepath constant t_annotation_name := 'suitepath'; - gc_tag constant t_annotation_name := 'tags'; + gc_tags constant t_annotation_name := 'tags'; gc_test constant t_annotation_name := ut_utils.gc_test_execute; gc_disabled constant t_annotation_name := 'disabled'; gc_displayname constant t_annotation_name := 'displayname'; @@ -44,7 +44,7 @@ create or replace package body ut_suite_builder is := tt_annotations( gc_suite, gc_suitepath, - gc_tag, + gc_tags, gc_test, gc_disabled, gc_displayname, @@ -513,8 +513,8 @@ create or replace package body ut_suite_builder is set_seq_no(l_test.after_test_list); end if; - if l_proc_annotations.exists( gc_tag) then - add_tags_to_suite_item(a_suite, l_proc_annotations( gc_tag), l_test.tags, a_procedure_name); + if l_proc_annotations.exists( gc_tags) then + add_tags_to_suite_item(a_suite, l_proc_annotations( gc_tags), l_test.tags, a_procedure_name); end if; if l_proc_annotations.exists( gc_throws) then @@ -667,8 +667,8 @@ create or replace package body ut_suite_builder is l_after_each_list := add_executables( a_suite.object_owner, a_suite.object_name, a_annotations.by_name(gc_aftereach), gc_aftereach ); end if; - if a_annotations.by_name.exists(gc_tag) then - add_tags_to_suite_item(a_suite, a_annotations.by_name(gc_tag),a_suite.tags); + if a_annotations.by_name.exists(gc_tags) then + add_tags_to_suite_item(a_suite, a_annotations.by_name(gc_tags),a_suite.tags); end if; a_suite.disabled_flag := ut_utils.boolean_to_int(a_annotations.by_name.exists(gc_disabled)); diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 5dfadea19..3ec25019e 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -17,7 +17,6 @@ create or replace package body ut_suite_manager is */ gc_suitpath_error_message constant varchar2(100) := 'Suitepath exceeds 1000 CHAR on: '; - gc_tag_errmsg constant integer := 450; gc_get_cache_suite_sql constant varchar2(32767) := q'[with @@ -553,6 +552,8 @@ create or replace package body ut_suite_manager is l_sql := replace(l_sql,'{:random_seed:}',get_random_seed_sql(a_random_seed)); l_sql := replace(l_sql,'{:owner:}',l_ut_owner); + ut_event_manager.trigger_event(ut_event_manager.gc_debug, ut_key_anyvalues().put('l_sql',l_sql) ); + open l_result for l_sql using l_path, l_path, upper(a_object_name), upper(a_procedure_name), l_tags, a_random_seed; return l_result; end; From df67dee7bd56bd47ba568e2cfbd950f04e9cdf62 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Thu, 6 Jun 2019 00:52:27 +0000 Subject: [PATCH 149/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index c1c945097..ae9d49bd2 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index e51ea8f5d..dcd197373 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index a4f8ab783..8ed1c349f 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 9ce66ce5c..983d4206a 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 13403f131..a6dd40837 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index dae921832..d99a62d04 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 4277ba9cb..416bb2824 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 2ba58df80..131e7ccab 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 54d48b06c..841c6b97f 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index f42e2f655..b4fac8f14 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index affa252aa..9162797c1 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 959902d28..1b0be19b3 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 56eccc064..aa8053e31 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index a412a7c17..0b0ce0759 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index c962dc67b..42f9dbc6c 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index d25a2d697..c42e2986a 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index db0489a4d..5cbfaa7da 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.2999--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 8e0af7b8d..1557a3981 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -773,7 +773,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.2999-develop + * secion v3.1.7.3006-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 28a80be01..41b0f84f7 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.2999-develop'; + gc_version constant varchar2(50) := 'v3.1.7.3006-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 4d38af1ce7b1c73570ec76dc0f75ef1feb65b323 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Thu, 6 Jun 2019 22:29:45 +0100 Subject: [PATCH 150/181] Fixed install of release until feature is merged back. --- .travis/install_utplsql_release.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.travis/install_utplsql_release.sh b/.travis/install_utplsql_release.sh index 339c23c6e..6dc56c3f3 100755 --- a/.travis/install_utplsql_release.sh +++ b/.travis/install_utplsql_release.sh @@ -36,9 +36,14 @@ end; / SQL +INSTALL_FILE="install_headless_with_trigger.sql" +if [[ ! -f "${INSTALL_FILE}" ]]; then + INSTALL_FILE="install_headless.sql" +fi + "$SQLCLI" sys/$ORACLE_PWD@//$CONNECTION_STR AS SYSDBA < Date: Thu, 6 Jun 2019 22:52:14 +0100 Subject: [PATCH 151/181] Enabled-back dbms_preprocessor --- source/core/annotations/ut_annotation_parser.pkb | 3 +-- test/ut3_tester/core/annotations/test_annotation_parser.pks | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 49882845d..8d3cee3ad 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -234,9 +234,8 @@ create or replace package body ut_annotation_parser as if a_source_lines.count > 0 then --convert to post-processed source clob begin - l_processed_lines := a_source_lines; --get post-processed source --- l_processed_lines := sys.dbms_preprocessor.get_post_processed_source(a_source_lines); + l_processed_lines := sys.dbms_preprocessor.get_post_processed_source(a_source_lines); --convert to clob for i in 1..l_processed_lines.count loop ut_utils.append_to_clob(l_source, replace(l_processed_lines(i), chr(13)||chr(10), chr(10))); diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pks b/test/ut3_tester/core/annotations/test_annotation_parser.pks index 7e649caf9..a4fe3ed70 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pks +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pks @@ -21,7 +21,6 @@ create or replace package test_annotation_parser is procedure ignore_annotations_in_comments; --%test(Ignores wrapped package and does not raise exception) - --%disabled(TODO - causes issues on 18c with install when trigger enabled) procedure ignore_wrapped_package; --%test(Parses package level annotations with annotation params containing brackets) From aa313e519aede4f815971072d39e8811c155f773 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Fri, 7 Jun 2019 02:04:20 +0100 Subject: [PATCH 152/181] Fixed bug in parsing annotations from DDL trigger. --- source/core/annotations/ut_annotation_manager.pkb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 8da1b3823..3b9c81f71 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -170,7 +170,7 @@ create or replace package body ut_annotation_manager as a_sources_cursor sys_refcursor ) is l_annotations ut_annotations; - c_lines_fetch_limit constant integer := 1000; + 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); @@ -263,14 +263,14 @@ create or replace package body ut_annotation_manager as l_sql_text ora_name_list_t := a_sql_text; begin if a_parts > 0 then - l_sql_text(1) := regexp_replace(l_sql_text(1),'^\s*create(\s+or\s+replace)?\s+', modifier => 'i'); + l_sql_text(1) := regexp_replace(l_sql_text(1),'^\s*create(\s+or\s+replace)?(\s+(non)?editionable)?\s+', modifier => 'i'); for i in 1..a_parts loop ut_utils.append_to_clob(l_sql_clob, l_sql_text(i)); end loop; l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) ); end if; open l_result for - select a_object_name as name, column_value||chr(10) as text from table(l_sql_lines); + select a_object_name as name, column_value||chr(10) as text from table(l_sql_lines) where rownum <1; return l_result; end; begin From 242b2a3fbce7af7a6e5f7568d01d7bf3aa6cf0b3 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 8 Jun 2019 01:33:41 +0100 Subject: [PATCH 153/181] Fixed issues with parsing code through trigger. Added disabling trigger on annotation parser tests. --- .travis/install.sh | 3 +++ .../annotations/ut_annotation_manager.pkb | 8 +++--- .../core/annotations/ut_annotation_parser.pkb | 8 ++++-- .../core/annotations/ut_annotation_parser.pks | 2 +- .../ut_trigger_annotation_parsing.trg | 1 + source/core/annotations/ut_trigger_check.pkb | 3 ++- source/core/annotations/ut_trigger_check.pks | 7 ++++- .../annotations/test_annotation_manager.pkb | 19 ++++++++++++-- .../annotations/test_annotation_manager.pks | 26 +++++++++++-------- .../annotations/test_annotation_parser.pkb | 2 +- 10 files changed, 56 insertions(+), 23 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index 04cf72c16..e6456e476 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -69,6 +69,9 @@ SQL time "$SQLCLI" sys/$ORACLE_PWD@//$CONNECTION_STR AS SYSDBA <<-SQL set feedback off @create_utplsql_owner.sql $UT3_TESTER $UT3_TESTER_PASSWORD $UT3_TABLESPACE +--needed for disabling DDL trigger and testint parser without trigger enabled/present +grant alter any trigger to ut3_tester; +grant administer database trigger to $UT3_TESTER; exit SQL diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 3b9c81f71..58f675a14 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -182,7 +182,7 @@ create or replace package body ut_annotation_manager as fetch a_sources_cursor bulk collect into l_names, l_lines limit c_lines_fetch_limit; for i in 1 .. l_names.count loop if l_names(i) != l_name then - l_annotations := ut_annotation_parser.parse_object_annotations(l_object_lines); + l_annotations := ut_annotation_parser.parse_object_annotations(l_object_lines, a_object_type); ut_annotation_cache_manager.update_cache( ut_annotated_object(a_object_owner, l_name, a_object_type, l_parse_time, l_annotations) ); @@ -196,7 +196,7 @@ create or replace package body ut_annotation_manager as end loop; if a_sources_cursor%rowcount > 0 then - l_annotations := ut_annotation_parser.parse_object_annotations(l_object_lines); + l_annotations := ut_annotation_parser.parse_object_annotations(l_object_lines, a_object_type); ut_annotation_cache_manager.update_cache( ut_annotated_object(a_object_owner, l_name, a_object_type, l_parse_time, l_annotations) ); @@ -263,14 +263,14 @@ create or replace package body ut_annotation_manager as l_sql_text ora_name_list_t := a_sql_text; begin if a_parts > 0 then - l_sql_text(1) := regexp_replace(l_sql_text(1),'^\s*create(\s+or\s+replace)?(\s+(non)?editionable)?\s+', modifier => 'i'); + l_sql_text(1) := regexp_replace(l_sql_text(1),'^\s*create(\s+or\s+replace){0,1}(\s+(editionable|noneditionable)){0,1}\s+{0,1}', modifier => 'i'); for i in 1..a_parts loop ut_utils.append_to_clob(l_sql_clob, l_sql_text(i)); end loop; l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) ); end if; open l_result for - select a_object_name as name, column_value||chr(10) as text from table(l_sql_lines) where rownum <1; + select a_object_name as name, column_value||chr(10) as text from table(l_sql_lines); return l_result; end; begin diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 8d3cee3ad..66d07d5d3 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -223,7 +223,7 @@ create or replace package body ut_annotation_parser as return l_result; end parse_object_annotations; - function parse_object_annotations(a_source_lines dbms_preprocessor.source_lines_t) return ut_annotations is + 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; l_annotations ut_annotations := ut_annotations(); @@ -235,7 +235,11 @@ create or replace package body ut_annotation_parser as --convert to post-processed source clob begin --get post-processed source - l_processed_lines := sys.dbms_preprocessor.get_post_processed_source(a_source_lines); + if a_object_type = 'TYPE' then + l_processed_lines := a_source_lines; + else + l_processed_lines := sys.dbms_preprocessor.get_post_processed_source(a_source_lines); + end if; --convert to clob for i in 1..l_processed_lines.count loop ut_utils.append_to_clob(l_source, replace(l_processed_lines(i), chr(13)||chr(10), chr(10))); diff --git a/source/core/annotations/ut_annotation_parser.pks b/source/core/annotations/ut_annotation_parser.pks index a396e877e..87ff70a24 100644 --- a/source/core/annotations/ut_annotation_parser.pks +++ b/source/core/annotations/ut_annotation_parser.pks @@ -27,7 +27,7 @@ create or replace package ut_annotation_parser authid current_user as * @param a_source_lines ordered lines of source code to be parsed * @return array containing annotations */ - function parse_object_annotations(a_source_lines dbms_preprocessor.source_lines_t) return ut_annotations; + function parse_object_annotations(a_source_lines dbms_preprocessor.source_lines_t, a_object_type varchar2) return ut_annotations; /** diff --git a/source/core/annotations/ut_trigger_annotation_parsing.trg b/source/core/annotations/ut_trigger_annotation_parsing.trg index 46703d69a..3e25fd86a 100644 --- a/source/core/annotations/ut_trigger_annotation_parsing.trg +++ b/source/core/annotations/ut_trigger_annotation_parsing.trg @@ -8,6 +8,7 @@ begin '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') + and not (ora_dict_obj_type = 'TYPE' and ora_dict_obj_name like 'SYS\_PLSQL\_%' escape '\') ) or (ora_dict_obj_owner = UPPER('&&UT3_OWNER') and ora_dict_obj_name = 'UT3_TRIGGER_ALIVE' diff --git a/source/core/annotations/ut_trigger_check.pkb b/source/core/annotations/ut_trigger_check.pkb index 508e50e0f..64ce395c8 100644 --- a/source/core/annotations/ut_trigger_check.pkb +++ b/source/core/annotations/ut_trigger_check.pkb @@ -17,7 +17,6 @@ create or replace package body ut_trigger_check is */ g_is_trigger_live boolean := false; - gc_check_object_name constant varchar2(128) := 'UT3_TRIGGER_ALIVE'; function is_alive return boolean is pragma autonomous_transaction; @@ -32,6 +31,8 @@ create or replace package body ut_trigger_check is begin if ora_dict_obj_owner = ut_utils.ut_owner and ora_dict_obj_name = gc_check_object_name and ora_dict_obj_type = 'SYNONYM' then g_is_trigger_live := true; + else + g_is_trigger_live := false; end if; end; diff --git a/source/core/annotations/ut_trigger_check.pks b/source/core/annotations/ut_trigger_check.pks index b82692082..061582773 100644 --- a/source/core/annotations/ut_trigger_check.pks +++ b/source/core/annotations/ut_trigger_check.pks @@ -16,12 +16,17 @@ create or replace package ut_trigger_check authid definer is limitations under the License. */ + gc_check_object_name constant varchar2(128) := 'UT3_TRIGGER_ALIVE'; + /** * checks if the trigger &&UT3_OWNER._PARSE is enabled and operational. */ - function is_alive return boolean; + /** + * If called from a DDL trigger when creating object gc_check_object_name, sts alive flag to true + * Otherwise sets alive flag to false. + */ procedure is_alive; end; diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pkb b/test/ut3_tester/core/annotations/test_annotation_manager.pkb index 46f0959e8..d5d2d1749 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pkb @@ -1,5 +1,18 @@ create or replace package body test_annotation_manager is + procedure disable_ddl_trigger is + pragma autonomous_transaction; + begin + execute immediate 'alter trigger ut3.ut_trigger_annotation_parsing disable'; + execute immediate 'begin ut3.ut_trigger_check.is_alive(); end;'; + end; + + procedure enable_ddl_trigger is + pragma autonomous_transaction; + begin + execute immediate 'alter trigger ut3.ut_trigger_annotation_parsing enable'; + end; + procedure create_dummy_package is pragma autonomous_transaction; begin @@ -49,6 +62,9 @@ create or replace package body test_annotation_manager is pragma autonomous_transaction; begin execute immediate q'[drop package dummy_test_package]'; + exception + when others then + null; end; procedure recompile_dummy_test_package is @@ -241,8 +257,7 @@ create or replace package body test_annotation_manager is order by annotation_position; open l_expected for - select 2 as annotation_position, 'suite' as annotation_name, - 'dummy_test_suite' as annotation_text, '' as subobject_name + select 2 as annotation_position, 'suite' as annotation_name, 'dummy_test_suite' as annotation_text, '' as subobject_name from dual union all select 3, 'rollback' , 'manual', '' as subobject_name from dual union all diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pks b/test/ut3_tester/core/annotations/test_annotation_manager.pks index e71a92904..fbb513ec1 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pks +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pks @@ -18,16 +18,21 @@ create or replace package test_annotation_manager is procedure drop_dummy_test_package; + --%context(Without DDL trigger) + + --%beforeall + procedure disable_ddl_trigger; + + --%afterall + procedure enable_ddl_trigger; + + --%beforeeach(create_dummy_package) + --%aftereach(drop_dummy_package) + --%test(Adds new package to annotation cache info) - --%beforetest(create_dummy_package) - --%aftertest(drop_dummy_package) - --%disabled(TODO - make it run with triger disabled) procedure add_new_package; --%test(Updates annotation cache info for modified package) - --%beforetest(create_dummy_package) - --%aftertest(drop_dummy_package) - --%disabled(TODO - make it run with triger disabled) procedure update_modified_package; --%test(Adds annotations to cache for unit test package) @@ -36,23 +41,22 @@ create or replace package test_annotation_manager is procedure add_new_test_package; --%test(Updates annotations in cache for modified test package) - --%beforetest(create_dummy_test_package) - --%aftertest(drop_dummy_test_package) procedure update_modified_test_package; --%test(Keeps annotations in cache when object was removed but user can't see whole schema) --%beforetest(create_dummy_test_package,create_parse_proc_as_ut3$user#) --%aftertest(drop_parse_proc_as_ut3$user#) - --%disabled(no longer true with trigger enabled) procedure keep_dropped_data_in_cache; --%test(Does not return data for dropped object) - --%beforetest(create_dummy_test_package) procedure no_data_for_dropped_object; --%test(Remove object from cache when object dropped and user can see whole schema) - --%beforetest(create_dummy_test_package) procedure cleanup_dropped_data_in_cache; + --%endcontext + + --TODO add tests with trigger + end test_annotation_manager; / diff --git a/test/ut3_tester/core/annotations/test_annotation_parser.pkb b/test/ut3_tester/core/annotations/test_annotation_parser.pkb index 5345e3a50..c4c90c046 100644 --- a/test/ut3_tester/core/annotations/test_annotation_parser.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_parser.pkb @@ -305,7 +305,7 @@ v58yvbLAXLi9gYHwoIvAgccti+Cmpg0DKLY= -- %some_annotation_like_text '; --Act - l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source); + l_actual := ut3.ut_annotation_parser.parse_object_annotations(l_source,'PACKAGE'); --Assert ut.expect(anydata.convertCollection(l_actual)).to_be_empty(); end; From a173b38ad23c5fd19aeb71c8781797381bb7d4d5 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 8 Jun 2019 01:51:08 +0100 Subject: [PATCH 154/181] Fixed re-install of trigger. --- .travis/install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis/install.sh b/.travis/install.sh index e6456e476..bb117c67c 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -51,6 +51,7 @@ SQL alter session set plsql_optimize_level=0; @install.sql $UT3_OWNER + @install_ddl_trigger.sql $UT3_OWNER @create_synonyms_and_grants_for_public.sql $UT3_OWNER SQL From 94a1c23389a955fc193c7054bc57f97799363233 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 9 Jun 2019 17:46:05 +0100 Subject: [PATCH 155/181] Updated readme for installation with trigger. Added additional tests for annotation management with / without trigger. Fixed code for situations when trigger gets added on pre-existing tests. --- docs/userguide/install.md | 75 +++++- source/check_sys_grants.sql | 6 +- .../annotations/ut_annotation_manager.pkb | 94 ++++--- .../annotations/ut_annotation_manager.pks | 5 +- .../ut_trigger_annotation_parsing.trg | 10 +- source/core/annotations/ut_trigger_check.pkb | 2 +- source/core/annotations/ut_trigger_check.pks | 2 +- source/install.sql | 2 +- source/install_ddl_trigger.sql | 1 + .../annotations/test_annotation_manager.pkb | 239 ++++++++++++------ .../annotations/test_annotation_manager.pks | 82 ++++-- 11 files changed, 358 insertions(+), 160 deletions(-) diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 88b0b0e7f..e3469fa6a 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -72,16 +72,31 @@ The utPLSQL may be installed on any supported version of Oracle Database [see](h * 12c * 12c R2 * 18c +* 19c # Headless installation -To install the utPLSQL into a new database schema and grant it to public, execute the script `install_headless.sql` as SYSDBA. +utPLSQL can be installed with DDL trigger, to enable tracking of DDL changes to your unit test packages. +This is the recommended installation approach, when you want to compile and run unit test packages in a schema containing huge amount of database packages (for example Oracle EBS installation schema). +The reason for having DDL trigger is to enable in-time annotation parsing for utPLSQL. +Without DDL trigger, utPLSQL needs to investigate your schema objects last_ddl_timestamp each time tests are executed to check if any of DB packages were changed in given schema and if they need scanning for annotation changes. +This process can be time-consuming if DB schema is large. -The script accepts three optional parameters that define: +The headless scripts accept three optional parameters that define: - username to create as owner of utPLSQL (default `ut3`) - password for owner of utPLSQL (default `XNtxj8eEgA6X6b6f`) - tablespace to use for storage of profiler data (default `users`) +The scripts need to be executed by `SYSDBA`, in order to grant access to `DBMS_LOCK` and `DBMS_CRYPTO` system packages. + +*Note:* Grant on `DBMS_LOCK` is required only for installation on Oracle versions below 18c. For versions 18c and above, utPLSQL uses `DBMS_SESSION.SLEEP` so access to `DBMS_LOCK` package is no longer needed. + +*Note:* The user performing the installation must have the `ADMINISTER DATABASE TRIGGER` privilege. This is required for installation of trigger that is responsible for parsing annotations at at compile-time of a package. + +## Installation without DDL trigger + +To install the utPLSQL into a new database schema and grant it to public, execute the script `install_headless.sql` as SYSDBA. + Example invocation of the script from command line: ```bash cd source @@ -94,16 +109,37 @@ cd source sqlplus sys/sys_pass@db as sysdba @install_headless.sql utp3 my_verySecret_password utp3_tablespace ``` -The script needs to be executed by `SYSDBA`, in order to grant access to `DBMS_LOCK` and `DBMS_CRYPTO` system packages. +## Installation with DDL trigger + +To install the utPLSQL into a new database schema and grant it to public, execute the script `install_headless_with_trigger.sql` as SYSDBA. + +Example invocation of the script from command line: +```bash +cd source +sqlplus sys/sys_pass@db as sysdba @install_headless_with_trigger.sql +``` + +Invoking script with parameters: +```bash +cd source +sqlplus sys/sys_pass@db as sysdba @install_headless_with_trigger.sql utp3 my_verySecret_password utp3_tablespace +``` + +*Note:* -*Note:* Grant on `DBMS_LOCK` is required on Oracle versions below 18c +When installing utPLSQL into database with existing unit test packages, utPLSQL will not be able to already-existing unit test packages. +When utPSLQL was installed with DDL trigger, you have to do one of: +- Recompile existing Unit Test packages to make utPLSQL aware of their existence +- Invoke `exec ut_runner.rebuild_annotation_cache(a_schema_name=> ... );` for every schema containing unit tests in your database +Steps above are required to assure annotation cache is populated properly from existing objects. +Rebuilding annotation cache might be faster than code recompilation. # Recommended Schema It is highly recommended to install utPLSQL in it's own schema. You are free to choose any name for this schema. Installing uPLSQL into shared schema is really not recommended as you loose isolation of framework. -If the installation and utPLSQL owner user is one and the same, the user must have the following Oracle system permissions before you can proceed with the installation. +If the installing user and utPLSQL owner is one and the same, the user must have the following Oracle system permissions before you can proceed with the installation. - CREATE SESSION - CREATE PROCEDURE @@ -113,6 +149,7 @@ If the installation and utPLSQL owner user is one and the same, the user must ha - CREATE VIEW - CREATE SYNONYM - ALTER SESSION + - CREATE TRIGGER In addition the user must be granted the execute privilege on `DBMS_LOCK` and `DBMS_CRYPTO` packages. @@ -121,11 +158,9 @@ The uninstall process will **not** drop profiler tables, as they can potentially It is up to DBA to maintain the storage of the profiler tables. -Additionally the user performing the installation must have a `ADMINISTER DATABASE TRIGGER` privilege. This is required for installation of trigger that is responsible for parsing annotations at at compile-time of a package. - # Manual installation procedure -### Creating schema for utPLSQL +## Creating schema for utPLSQL To create the utPLSQL schema and grant all the required privileges execute script `create_utplsql_owner.sql` from the `source` directory with parameters: - `user name` - the name of the user that will own of utPLSQL object @@ -138,8 +173,8 @@ cd source sqlplus sys/sys_password@database as sysdba @create_utPLSQL_owner.sql ut3 ut3 users ``` -### Installing utPLSQL -To install the utPLSQL framework into your database run the `/source/install.sql` script and provide `schema_name` where utPLSQL is to be installed. +## Installing utPLSQL +To install the utPLSQL framework into your database, go to `source` directory, run the `install.sql` providing the `schema_name` for utPLSQL as parameter. Schema must be created prior to calling the `install` script. You may install utPLSQL from any account that has sufficient privileges to create objects in other users schema. @@ -149,7 +184,25 @@ cd source sqlplus admin/admins_password@database @install.sql ut3 ``` -### Allowing other users to access the utPLSQL framework +## Installing DDL trigger +To minimize startup time of utPLSQL framework (especially on a database with large schema) it is recommended to install utPLSQL DDL trigger to enable utPLSQL annotation to be updated at compile-time. + +It's recommended to install DDL trigger when connected as `SYSDBA` user. Trigger is created in utPLSQL schema. +If using the owner schema of utPLSQL to install trigger, the owner needs to have `ADMINISTER DATABASE TRIGGER` and `CREATE TRIGGER` system privileges. +If using different user to install trigger, the user needs to have `ADMINISTER DATABASE TRIGGER` and `CREATE ANY TRIGGER` system privileges. + +To install DDL trigger go to `source` directory, run the `install_ddl_trigger.sql` providing the `schema_name` for utPLSQL as parameter. + +Example invocation: +```bash +cd source +sqlplus admin/admins_password@database @install_ddl_trigger.sql ut3 +``` + +*Note:* Trigger can be installed ant any point in time. + + +## Allowing other users to access the utPLSQL framework In order to allow other users to access utPLSQL, synonyms must be created and privileges granted. You have two options: diff --git a/source/check_sys_grants.sql b/source/check_sys_grants.sql index ae861ed33..9b1fbbc0c 100644 --- a/source/check_sys_grants.sql +++ b/source/check_sys_grants.sql @@ -1,8 +1,6 @@ +DEFINE expected_grants = "&1" declare - c_expected_grants constant dbmsoutput_linesarray - := dbmsoutput_linesarray( - 'CREATE TYPE','CREATE VIEW','CREATE SYNONYM','CREATE SEQUENCE','CREATE PROCEDURE','CREATE TABLE', 'ADMINISTER DATABASE TRIGGER' - ); + c_expected_grants constant dbmsoutput_linesarray := dbmsoutput_linesarray( &expected_grants ); l_expected_grants dbmsoutput_linesarray := c_expected_grants; l_missing_grants varchar2(4000); diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 58f675a14..41bbb000a 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -51,30 +51,34 @@ create or replace package body ut_annotation_manager as return l_result; end; - function get_annotation_objs_info(a_object_owner varchar2, a_object_type varchar2, a_parse_date timestamp := null) return ut_annotation_objs_cache_info is - l_rows sys_refcursor; - l_ut_owner varchar2(250) := ut_utils.ut_owner; - l_objects_view varchar2(200) := ut_metadata.get_objects_view_name(); - l_cursor_text varchar2(32767); - l_result ut_annotation_objs_cache_info; - l_object_owner varchar2(250); - l_object_type varchar2(250); + function get_annotation_objs_info( + a_object_owner varchar2, + a_object_type varchar2, + a_parse_date timestamp := null, + a_full_scan boolean := true + ) return ut_annotation_objs_cache_info is + l_rows sys_refcursor; + l_ut_owner varchar2(250) := ut_utils.ut_owner; + l_objects_view varchar2(200) := ut_metadata.get_objects_view_name(); + l_cursor_text varchar2(32767); + l_result ut_annotation_objs_cache_info; + l_object_owner varchar2(250); + l_object_type varchar2(250); begin ut_event_manager.trigger_event( - 'get_annotation_objs_info - start ( ut_trigger_check.is_alive = ' - || case when ut_trigger_check.is_alive() then 'Y' else 'N' end || ' )' + 'get_annotation_objs_info - start ( a_full_scan = ' || ut_utils.to_string(a_full_scan) || ' )' ); - if ut_trigger_check.is_alive() then + if not a_full_scan then l_cursor_text := q'[select ]'||l_ut_owner||q'[.ut_annotation_obj_cache_info( - object_owner => i.object_owner, - object_name => i.object_name, - object_type => i.object_type, + object_owner => i.object_owner, + object_name => i.object_name, + object_type => i.object_type, needs_refresh => 'N' ) from ]'||l_ut_owner||q'[.ut_annotation_cache_info i where i.object_owner = :a_object_owner - and i.object_type = :a_object_type]'; + and i.object_type = :a_object_type]'; open l_rows for l_cursor_text using a_object_owner, a_object_type; else if a_object_owner is not null then @@ -85,17 +89,17 @@ create or replace package body ut_annotation_manager as end if; l_cursor_text := q'[select ]'||l_ut_owner||q'[.ut_annotation_obj_cache_info( - object_owner => o.owner, - object_name => o.object_name, - object_type => o.object_type, + object_owner => o.owner, + object_name => o.object_name, + object_type => o.object_type, needs_refresh => case when o.last_ddl_time < cast(i.parse_time as date) then 'N' else 'Y' end ) from ]'||l_objects_view||q'[ o left join ]'||l_ut_owner||q'[.ut_annotation_cache_info i - on o.owner = i.object_owner + on o.owner = i.object_owner and o.object_name = i.object_name and o.object_type = i.object_type - where o.owner = ']'||l_object_owner||q'[' + where o.owner = ']'||l_object_owner||q'[' and o.object_type = ']'||l_object_type||q'[' and ]' || case @@ -105,7 +109,7 @@ create or replace package body ut_annotation_manager as end; open l_rows for l_cursor_text using a_parse_date; end if; - fetch l_rows bulk collect into l_result limit 1000000; + fetch l_rows bulk collect into l_result limit 10000000; close l_rows; ut_event_manager.trigger_event('get_annotation_objs_info - end (count='||l_result.count||')'); return l_result; @@ -207,14 +211,15 @@ create or replace package body ut_annotation_manager as end; - procedure rebuild_annotation_cache( + procedure refresh_annotation_cache( a_object_owner varchar2, a_object_type varchar2, a_info_rows ut_annotation_objs_cache_info ) is l_objects_to_parse ut_annotation_objs_cache_info; begin - select value(x)bulk collect into l_objects_to_parse + select value(x) + bulk collect into l_objects_to_parse from table(a_info_rows) x where x.needs_refresh = 'Y'; ut_event_manager.trigger_event('rebuild_annotation_cache - start (l_objects_to_parse.count = '||l_objects_to_parse.count||')'); @@ -243,12 +248,10 @@ create or replace package body ut_annotation_manager as --public definitions ------------------------------------------------------------ procedure rebuild_annotation_cache(a_object_owner varchar2, a_object_type varchar2) is + l_annotation_objs_info ut_annotation_objs_cache_info; begin - rebuild_annotation_cache( - a_object_owner, - a_object_type, - get_annotation_objs_info(a_object_owner, a_object_type, null) - ); + l_annotation_objs_info := get_annotation_objs_info(a_object_owner, a_object_type, null, true); + refresh_annotation_cache( a_object_owner, a_object_type, l_annotation_objs_info ); end; procedure trigger_obj_annotation_rebuild is @@ -273,9 +276,23 @@ create or replace package body ut_annotation_manager as select a_object_name as name, column_value||chr(10) as text from table(l_sql_lines); return l_result; end; - begin - ut_trigger_check.is_alive(); + 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; + l_sources_view varchar2(200) := ut_metadata.get_source_view_name(); + begin + 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; + return l_result; + end; + + begin if ora_dict_obj_type in ('PACKAGE','PROCEDURE','FUNCTION','TYPE') then l_object_to_parse := ut_annotation_obj_cache_info(ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type, 'Y'); @@ -287,8 +304,10 @@ create or replace package body ut_annotation_manager as get_source_from_sql_text(ora_dict_obj_name, l_sql_text, l_parts) ); elsif ora_sysevent = 'ALTER' then - null; - --update parse_time + 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) + ); elsif ora_sysevent = 'DROP' then ut_annotation_cache_manager.remove_from_cache(ut_annotation_objs_cache_info(l_object_to_parse)); end if; @@ -296,18 +315,18 @@ create or replace package body ut_annotation_manager as end; function get_annotated_objects(a_object_owner varchar2, a_object_type varchar2, a_parse_date timestamp := null) return ut_annotated_objects pipelined is - l_info_rows ut_annotation_objs_cache_info; + l_annotation_objs_info ut_annotation_objs_cache_info; l_cursor sys_refcursor; l_results ut_annotated_objects; c_object_fetch_limit constant integer := 10; + l_full_scan_needed boolean := not ut_trigger_check.is_alive(); begin ut_event_manager.trigger_event('get_annotated_objects - start'); - - l_info_rows := get_annotation_objs_info(a_object_owner, a_object_type, a_parse_date); - rebuild_annotation_cache(a_object_owner, a_object_type, l_info_rows); + l_annotation_objs_info := get_annotation_objs_info(a_object_owner, a_object_type, a_parse_date, l_full_scan_needed); + refresh_annotation_cache(a_object_owner, a_object_type, l_annotation_objs_info); --pipe annotations from cache - l_cursor := ut_annotation_cache_manager.get_annotations_for_objects(l_info_rows, a_parse_date); + l_cursor := ut_annotation_cache_manager.get_annotations_for_objects(l_annotation_objs_info, a_parse_date); loop fetch l_cursor bulk collect into l_results limit c_object_fetch_limit; for i in 1 .. l_results.count loop @@ -357,5 +376,6 @@ create or replace package body ut_annotation_manager as end if; return l_result; end; + end ut_annotation_manager; / diff --git a/source/core/annotations/ut_annotation_manager.pks b/source/core/annotations/ut_annotation_manager.pks index 729d2d4ee..237d36724 100644 --- a/source/core/annotations/ut_annotation_manager.pks +++ b/source/core/annotations/ut_annotation_manager.pks @@ -56,7 +56,10 @@ create or replace package ut_annotation_manager authid current_user as */ procedure purge_cache(a_object_owner varchar2, a_object_type varchar2); - + + /* + * Returns a hash value of suitepath based on input path and random seed + */ function hash_suite_path(a_path varchar2, a_random_seed positiven) return varchar2; end ut_annotation_manager; diff --git a/source/core/annotations/ut_trigger_annotation_parsing.trg b/source/core/annotations/ut_trigger_annotation_parsing.trg index 3e25fd86a..32710e6c5 100644 --- a/source/core/annotations/ut_trigger_annotation_parsing.trg +++ b/source/core/annotations/ut_trigger_annotation_parsing.trg @@ -2,7 +2,12 @@ create or replace trigger ut_trigger_annotation_parsing after create or alter or drop on database begin - if ( ora_dict_obj_type in ('PACKAGE','PROCEDURE','FUNCTION','TYPE') + if (ora_dict_obj_owner = UPPER('&&UT3_OWNER') + and ora_dict_obj_name = 'UT3_TRIGGER_ALIVE' + and ora_dict_obj_type = 'SYNONYM') + then + execute immediate 'begin ut_trigger_check.is_alive(); end;'; + elsif ( ora_dict_obj_type in ('PACKAGE','PROCEDURE','FUNCTION','TYPE') and ora_dict_obj_owner not in ( 'ANONYMOUS','APPQOSSYS','AUDSYS','DBSFWUSER','DBSNMP','DIP','GGSYS','GSMADMIN_INTERNAL', @@ -10,9 +15,6 @@ begin 'SYSBACKUP','SYSDG','SYSKM','SYSRAC','SYSTEM','WMSYS','XDB','XS$NULL') and not (ora_dict_obj_type = 'TYPE' and ora_dict_obj_name like 'SYS\_PLSQL\_%' escape '\') ) - or (ora_dict_obj_owner = UPPER('&&UT3_OWNER') - and ora_dict_obj_name = 'UT3_TRIGGER_ALIVE' - and ora_dict_obj_type = 'SYNONYM') then execute immediate 'begin ut_annotation_manager.trigger_obj_annotation_rebuild; end;'; end if; diff --git a/source/core/annotations/ut_trigger_check.pkb b/source/core/annotations/ut_trigger_check.pkb index 64ce395c8..9b655a0a1 100644 --- a/source/core/annotations/ut_trigger_check.pkb +++ b/source/core/annotations/ut_trigger_check.pkb @@ -29,7 +29,7 @@ create or replace package body ut_trigger_check is procedure is_alive is begin - if ora_dict_obj_owner = ut_utils.ut_owner and ora_dict_obj_name = gc_check_object_name and ora_dict_obj_type = 'SYNONYM' then + 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 g_is_trigger_live := true; else g_is_trigger_live := false; diff --git a/source/core/annotations/ut_trigger_check.pks b/source/core/annotations/ut_trigger_check.pks index 061582773..b378948cb 100644 --- a/source/core/annotations/ut_trigger_check.pks +++ b/source/core/annotations/ut_trigger_check.pks @@ -24,7 +24,7 @@ create or replace package ut_trigger_check authid definer is function is_alive return boolean; /** - * If called from a DDL trigger when creating object gc_check_object_name, sts alive flag to true + * If called from a DDL trigger when creating object gc_check_object_name, sets alive flag to true * Otherwise sets alive flag to false. */ procedure is_alive; diff --git a/source/install.sql b/source/install.sql index 3163e1c26..9ebeb37d5 100644 --- a/source/install.sql +++ b/source/install.sql @@ -31,7 +31,7 @@ prompt &&line_separator alter session set current_schema = &&ut3_owner; @@check_object_grants.sql -@@check_sys_grants.sql +@@check_sys_grants.sql "'CREATE TYPE','CREATE VIEW','CREATE SYNONYM','CREATE SEQUENCE','CREATE PROCEDURE','CREATE TABLE'" --set define off --dbms_output buffer cache table diff --git a/source/install_ddl_trigger.sql b/source/install_ddl_trigger.sql index 39b975716..3725ff332 100644 --- a/source/install_ddl_trigger.sql +++ b/source/install_ddl_trigger.sql @@ -17,5 +17,6 @@ @@define_ut3_owner_param.sql +@@check_sys_grants.sql "'ADMINISTER DATABASE TRIGGER','CREATE TRIGGER'" @@install_component.sql 'core/annotations/ut_trigger_annotation_parsing.trg' diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pkb b/test/ut3_tester/core/annotations/test_annotation_manager.pkb index d5d2d1749..4778117c5 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pkb @@ -25,6 +25,9 @@ create or replace package body test_annotation_manager is pragma autonomous_transaction; begin execute immediate q'[drop package dummy_package]'; + exception + when others then + null; end; procedure recompile_dummy_package is @@ -86,6 +89,9 @@ create or replace package body test_annotation_manager is procedure drop_parse_proc_as_ut3$user# is begin ut3_tester_helper.main_helper.drop_parse_proc_as_ut3$user#(); + exception + when others then + null; end; procedure cleanup_annotation_cache is @@ -93,11 +99,160 @@ create or replace package body test_annotation_manager is ut3_tester_helper.main_helper.cleanup_annotation_cache(); end; + procedure assert_dummy_package(a_start_date date) is + l_actual_cache_id integer; + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + select max(cache_id) + into l_actual_cache_id + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_PACKAGE' + and parse_time >= a_start_date; + ut.expect(l_actual_cache_id).to_be_not_null; + + open l_actual for + select annotation_position, annotation_name, annotation_text, subobject_name + from ut3.ut_annotation_cache where cache_id = l_actual_cache_id + order by annotation_position; + + ut.expect(l_actual).to_be_empty(); + end; + + procedure assert_dummy_test_package(a_start_date date) is + l_actual_cache_id integer; + l_actual sys_refcursor; + l_expected sys_refcursor; + begin + select max(cache_id) + into l_actual_cache_id + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE' + and parse_time >= a_start_date; + ut.expect(l_actual_cache_id).to_be_not_null; + + open l_actual for + select annotation_position, annotation_name, annotation_text, subobject_name + from ut3.ut_annotation_cache where cache_id = l_actual_cache_id + order by annotation_position; + + open l_expected for + select 2 as annotation_position, 'suite' as annotation_name, + 'dummy_test_suite' as annotation_text, '' as subobject_name + from dual union all + select 3, 'rollback' , 'manual', '' as subobject_name + from dual union all + select 5, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name + from dual union all + select 6, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name + from dual; + + ut.expect(l_actual).to_equal(l_expected); + end; + + + procedure trg_skip_existing_package is + l_actual_cache_id integer; + begin + --Arrange + disable_ddl_trigger(); + create_dummy_test_package(); + --Act + enable_ddl_trigger(); + --Assert + select max(cache_id) + into l_actual_cache_id + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE'; + + ut.expect(l_actual_cache_id).to_be_null; + end; + + --%test(Adds existing package to cache when package recompiled) + procedure trg_add_existing_on_compile is + l_start_date date; + begin + --Arrange + disable_ddl_trigger(); + create_dummy_test_package(); + --Act + enable_ddl_trigger(); + l_start_date := sysdate; + recompile_dummy_test_package(); + --Assert + assert_dummy_test_package(l_start_date); + end; + + --%test(Adds existing package to cache when schema cache refreshed) + procedure trg_add_existing_on_refresh is + l_start_date date; + begin + --Arrange + disable_ddl_trigger(); + create_dummy_test_package(); + create_dummy_package(); + --Act + enable_ddl_trigger(); + l_start_date := sysdate; + ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); + --Assert + assert_dummy_test_package(l_start_date); + assert_dummy_package(l_start_date); + end; + + procedure trg_not_add_new_package is + l_actual sys_refcursor; + begin + --Act + create_dummy_package(); + --Assert + open l_actual for + select * + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_PACKAGE'; + + ut.expect(l_actual).to_be_empty(); + end; + + procedure trg_add_new_test_package is + l_actual sys_refcursor; + l_expected sys_refcursor; + l_start_date date; + begin + --Arrange + l_start_date := sysdate; + --Act + create_dummy_test_package(); + --Assert + assert_dummy_test_package(l_start_date); + end; + + --%test(Removes annotations from cache when object was removed and user can't see whole schema) + procedure trg_no_data_for_dropped_object is + l_actual sys_refcursor; + begin + drop_dummy_test_package(); + --Assert + open l_actual for + select * + from ut3.ut_annotation_cache_info + where object_owner = sys_context('USERENV', 'CURRENT_USER') + and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE'; + + ut.expect(l_actual).to_be_empty(); + + end; + + --%test(Updates annotation cache when package recompiled) + procedure trg_update_modified_package is + begin + null; + end; procedure add_new_package is l_actual_cache_id integer; - l_actual integer; - l_start_date date; + l_actual sys_refcursor; + l_start_date date; begin --Act l_start_date := sysdate; @@ -111,17 +266,16 @@ create or replace package body test_annotation_manager is ut.expect(l_actual_cache_id).to_be_not_null; - select count(1) - into l_actual - from ut3.ut_annotation_cache - where cache_id = l_actual_cache_id; + open l_actual for + select * + from ut3.ut_annotation_cache + where cache_id = l_actual_cache_id; - ut.expect(l_actual).to_equal(0); + ut.expect(l_actual).to_be_empty(); end; procedure update_modified_package is - l_actual_cache_id integer; l_actual integer; l_start_date date; begin @@ -135,28 +289,15 @@ create or replace package body test_annotation_manager is $else dbms_lock.sleep(1); $end + --Act ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); --Assert - select max(cache_id) - into l_actual_cache_id - from ut3.ut_annotation_cache_info - where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_PACKAGE' - and parse_time >= l_start_date; - - ut.expect(l_actual_cache_id).to_be_not_null; - - select count(1) - into l_actual - from ut3.ut_annotation_cache - where cache_id = l_actual_cache_id; - - ut.expect(l_actual).to_equal(0); + assert_dummy_package(l_start_date); end; procedure add_new_test_package is - l_actual_cache_id integer; l_actual sys_refcursor; l_expected sys_refcursor; l_start_date date; @@ -166,31 +307,7 @@ create or replace package body test_annotation_manager is --Act ut3.ut_annotation_manager.rebuild_annotation_cache(sys_context('USERENV', 'CURRENT_USER'),'PACKAGE'); --Assert - select max(cache_id) - into l_actual_cache_id - from ut3.ut_annotation_cache_info - where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE' - and parse_time >= l_start_date; - - ut.expect(l_actual_cache_id).to_be_not_null; - - open l_actual for - select annotation_position, annotation_name, annotation_text, subobject_name - from ut3.ut_annotation_cache where cache_id = l_actual_cache_id - order by annotation_position; - - open l_expected for - select 2 as annotation_position, 'suite' as annotation_name, - 'dummy_test_suite' as annotation_text, '' as subobject_name - from dual union all - select 3, 'rollback' , 'manual', '' as subobject_name - from dual union all - select 5, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name - from dual union all - select 6, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name - from dual; - - ut.expect(l_actual).to_equal(l_expected); + assert_dummy_test_package(l_start_date); end; @@ -232,7 +349,6 @@ create or replace package body test_annotation_manager is procedure keep_dropped_data_in_cache is - l_actual_cache_id integer; l_actual sys_refcursor; l_expected sys_refcursor; l_start_date date; @@ -243,30 +359,7 @@ create or replace package body test_annotation_manager is --Act parse_dummy_test_as_ut3$user#(); --Assert - select max(cache_id) - into l_actual_cache_id - from ut3.ut_annotation_cache_info - where object_owner = sys_context('USERENV', 'CURRENT_USER') and object_type = 'PACKAGE' and object_name = 'DUMMY_TEST_PACKAGE' - and parse_time >= l_start_date; - - ut.expect(l_actual_cache_id).not_to_be_null(); - - open l_actual for - select annotation_position, annotation_name, annotation_text, subobject_name - from ut3.ut_annotation_cache where cache_id = l_actual_cache_id - order by annotation_position; - - open l_expected for - select 2 as annotation_position, 'suite' as annotation_name, 'dummy_test_suite' as annotation_text, '' as subobject_name - from dual union all - select 3, 'rollback' , 'manual', '' as subobject_name - from dual union all - select 5, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name - from dual union all - select 6, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name - from dual; - - ut.expect(l_actual).to_equal(l_expected); + assert_dummy_test_package(l_start_date); end; procedure no_data_for_dropped_object is diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pks b/test/ut3_tester/core/annotations/test_annotation_manager.pks index fbb513ec1..fd5bc3410 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pks +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pks @@ -6,6 +6,10 @@ create or replace package test_annotation_manager is --%aftereach procedure cleanup_annotation_cache; + procedure disable_ddl_trigger; + + procedure enable_ddl_trigger; + procedure create_dummy_package; procedure drop_dummy_package; @@ -18,45 +22,69 @@ create or replace package test_annotation_manager is procedure drop_dummy_test_package; - --%context(Without DDL trigger) + --%context(With DDL trigger enabled) - --%beforeall - procedure disable_ddl_trigger; + --%aftereach(drop_dummy_test_package,drop_dummy_package) - --%afterall - procedure enable_ddl_trigger; + --%test(Does not detect unit test packages created before enabling trigger) + procedure trg_skip_existing_package; + + --%test(Adds existing package to cache when package recompiled) + procedure trg_add_existing_on_compile; - --%beforeeach(create_dummy_package) - --%aftereach(drop_dummy_package) + --%test(Adds existing package to cache when schema cache refreshed) + procedure trg_add_existing_on_refresh; - --%test(Adds new package to annotation cache info) - procedure add_new_package; + --%test(Doesn't add package to annotation cache info when it is not unit test package) + procedure trg_not_add_new_package; - --%test(Updates annotation cache info for modified package) - procedure update_modified_package; + --%test(Populates annotation cache when package created) + procedure trg_add_new_test_package; - --%test(Adds annotations to cache for unit test package) - --%beforetest(create_dummy_test_package) - --%aftertest(drop_dummy_test_package) - procedure add_new_test_package; + --%test(Removes annotations from cache when object was removed and user can't see whole schema) + --%beforetest(create_dummy_test_package) + procedure trg_no_data_for_dropped_object; - --%test(Updates annotations in cache for modified test package) - procedure update_modified_test_package; + --%test(Updates annotation cache when package recompiled) + procedure trg_update_modified_package; - --%test(Keeps annotations in cache when object was removed but user can't see whole schema) - --%beforetest(create_dummy_test_package,create_parse_proc_as_ut3$user#) - --%aftertest(drop_parse_proc_as_ut3$user#) - procedure keep_dropped_data_in_cache; + --%endcontext - --%test(Does not return data for dropped object) - procedure no_data_for_dropped_object; + --%context(Without DDL trigger enabled) - --%test(Remove object from cache when object dropped and user can see whole schema) - procedure cleanup_dropped_data_in_cache; + --%beforeall(disable_ddl_trigger) - --%endcontext + --%afterall(enable_ddl_trigger) - --TODO add tests with trigger + --%beforeeach(create_dummy_package) + --%aftereach(drop_dummy_package) + + --%test(Adds new package to annotation cache info when it is not unit test package) + procedure add_new_package; + + --%test(Updates annotation cache info for modified package) + procedure update_modified_package; + + --%test(Adds annotations to cache for unit test package) + --%beforetest(create_dummy_test_package) + --%aftertest(drop_dummy_test_package) + procedure add_new_test_package; + + --%test(Updates annotations in cache for modified test package) + procedure update_modified_test_package; + + --%test(Keeps annotations in cache when object was removed but user can't see whole schema) + --%beforetest(create_dummy_test_package,create_parse_proc_as_ut3$user#) + --%aftertest(drop_parse_proc_as_ut3$user#) + procedure keep_dropped_data_in_cache; + + --%test(Does not return data for dropped object) + procedure no_data_for_dropped_object; + + --%test(Remove object from cache when object dropped and user can see whole schema) + procedure cleanup_dropped_data_in_cache; + + --%endcontext end test_annotation_manager; / From 8f6d6c20bf070dac879a65a41cf3f60397124eb4 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Mon, 10 Jun 2019 00:13:30 +0100 Subject: [PATCH 156/181] Addressed review comments. Refactored install scripts to avoid duplication. Added check for `oracle_maintained` schema when firing DDL trigger. --- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/install.md | 39 ++++++++++++------- source/check_sys_grants.sql | 2 +- .../ut_trigger_annotation_parsing.trg | 27 ++++++++----- source/core/annotations/ut_trigger_check.pkb | 1 + source/core/annotations/ut_trigger_check.pks | 6 +-- source/core/ut_suite_manager.pkb | 1 - source/install_headless.sql | 19 +-------- source/install_headless_with_trigger.sql | 19 +-------- source/set_install_params.sql | 34 ++++++++++++++++ 10 files changed, 83 insertions(+), 67 deletions(-) create mode 100644 source/set_install_params.sql diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index dae921832..79d9acf94 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -430,7 +430,7 @@ Unable to join sets: Please make sure that your join clause is not refferring to collection element ``` -***Note*** +**Note** >`join_by` option is slower to process as it needs to perform a cursor join. ## Defining item lists in option diff --git a/docs/userguide/install.md b/docs/userguide/install.md index e3469fa6a..173acc7d3 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -89,10 +89,23 @@ The headless scripts accept three optional parameters that define: The scripts need to be executed by `SYSDBA`, in order to grant access to `DBMS_LOCK` and `DBMS_CRYPTO` system packages. -*Note:* Grant on `DBMS_LOCK` is required only for installation on Oracle versions below 18c. For versions 18c and above, utPLSQL uses `DBMS_SESSION.SLEEP` so access to `DBMS_LOCK` package is no longer needed. - -*Note:* The user performing the installation must have the `ADMINISTER DATABASE TRIGGER` privilege. This is required for installation of trigger that is responsible for parsing annotations at at compile-time of a package. - +**Note:** +> Grant on `DBMS_LOCK` is required only for installation on Oracle versions below 18c. For versions 18c and above, utPLSQL uses `DBMS_SESSION.SLEEP` so access to `DBMS_LOCK` package is no longer needed. + +**Note:** +> The user performing the installation must have the `ADMINISTER DATABASE TRIGGER` privilege. This is required for installation of trigger that is responsible for parsing annotations at at compile-time of a package. + +**Note:** +> When installing with DDL trigger, utPLSQL will not be registering unit tests for any of oracle-maintained schemas. +For Oracle 11g following users are excluded: +> 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 +> +> For Oracle 12c and above the users returned by below query are excluded by utPLSQL: +> +>```sql +> select username from all_users where oracle_maintained='Y'; +>``` + ## Installation without DDL trigger To install the utPLSQL into a new database schema and grant it to public, execute the script `install_headless.sql` as SYSDBA. @@ -125,15 +138,12 @@ cd source sqlplus sys/sys_pass@db as sysdba @install_headless_with_trigger.sql utp3 my_verySecret_password utp3_tablespace ``` -*Note:* - -When installing utPLSQL into database with existing unit test packages, utPLSQL will not be able to already-existing unit test packages. -When utPSLQL was installed with DDL trigger, you have to do one of: -- Recompile existing Unit Test packages to make utPLSQL aware of their existence -- Invoke `exec ut_runner.rebuild_annotation_cache(a_schema_name=> ... );` for every schema containing unit tests in your database - -Steps above are required to assure annotation cache is populated properly from existing objects. -Rebuilding annotation cache might be faster than code recompilation. +**Note:** +>When installing utPLSQL into database with existing unit test packages, utPLSQL will not be able to already-existing unit test packages. When utPSLQL was installed with DDL trigger, you have to do one of: +>- Recompile existing Unit Test packages to make utPLSQL aware of their existence +>- Invoke `exec ut_runner.rebuild_annotation_cache(a_schema_name=> ... );` for every schema containing unit tests in your database +> +> Steps above are required to assure annotation cache is populated properly from existing objects. Rebuilding annotation cache might be faster than code recompilation. # Recommended Schema It is highly recommended to install utPLSQL in it's own schema. You are free to choose any name for this schema. @@ -199,7 +209,8 @@ cd source sqlplus admin/admins_password@database @install_ddl_trigger.sql ut3 ``` -*Note:* Trigger can be installed ant any point in time. +**Note:** +>Trigger can be installed ant any point in time. ## Allowing other users to access the utPLSQL framework diff --git a/source/check_sys_grants.sql b/source/check_sys_grants.sql index 9b1fbbc0c..a31e9a9e1 100644 --- a/source/check_sys_grants.sql +++ b/source/check_sys_grants.sql @@ -1,4 +1,4 @@ -DEFINE expected_grants = "&1" +define expected_grants = "&1" declare c_expected_grants constant dbmsoutput_linesarray := dbmsoutput_linesarray( &expected_grants ); diff --git a/source/core/annotations/ut_trigger_annotation_parsing.trg b/source/core/annotations/ut_trigger_annotation_parsing.trg index 32710e6c5..1927befec 100644 --- a/source/core/annotations/ut_trigger_annotation_parsing.trg +++ b/source/core/annotations/ut_trigger_annotation_parsing.trg @@ -1,22 +1,29 @@ create or replace trigger ut_trigger_annotation_parsing after create or alter or drop on database +declare + l_restricted_users ora_name_list_t; begin if (ora_dict_obj_owner = UPPER('&&UT3_OWNER') and ora_dict_obj_name = 'UT3_TRIGGER_ALIVE' and ora_dict_obj_type = 'SYNONYM') then execute immediate 'begin ut_trigger_check.is_alive(); end;'; - elsif ( ora_dict_obj_type in ('PACKAGE','PROCEDURE','FUNCTION','TYPE') - and ora_dict_obj_owner - not in ( - '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') - and not (ora_dict_obj_type = 'TYPE' and ora_dict_obj_name like 'SYS\_PLSQL\_%' escape '\') - ) - then - execute immediate 'begin ut_annotation_manager.trigger_obj_annotation_rebuild; end;'; + elsif 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 + select /*+ result_cache */ username bulk collect into l_restricted_users + from all_users where oracle_maintained = 'Y'; + $end + if not (ora_dict_obj_type = 'TYPE' and ora_dict_obj_name like 'SYS\_PLSQL\_%' escape '\') + and not ora_dict_obj_owner member of l_restricted_users + then + execute immediate 'begin ut_annotation_manager.trigger_obj_annotation_rebuild; end;'; + end if; end if; exception when others then null; diff --git a/source/core/annotations/ut_trigger_check.pkb b/source/core/annotations/ut_trigger_check.pkb index 9b655a0a1..e2811b3c3 100644 --- a/source/core/annotations/ut_trigger_check.pkb +++ b/source/core/annotations/ut_trigger_check.pkb @@ -16,6 +16,7 @@ create or replace package body ut_trigger_check is limitations under the License. */ + gc_check_object_name constant varchar2(128) := 'UT3_TRIGGER_ALIVE'; g_is_trigger_live boolean := false; function is_alive return boolean is diff --git a/source/core/annotations/ut_trigger_check.pks b/source/core/annotations/ut_trigger_check.pks index b378948cb..237af3c68 100644 --- a/source/core/annotations/ut_trigger_check.pks +++ b/source/core/annotations/ut_trigger_check.pks @@ -16,16 +16,14 @@ create or replace package ut_trigger_check authid definer is limitations under the License. */ - gc_check_object_name constant varchar2(128) := 'UT3_TRIGGER_ALIVE'; - /** * checks if the trigger &&UT3_OWNER._PARSE is enabled and operational. */ function is_alive return boolean; /** - * If called from a DDL trigger when creating object gc_check_object_name, sets alive flag to true - * Otherwise sets alive flag to false. + * If called from a DDL trigger sets alive flag to true. + * If called outside of DDL trigger, sets alive flag to false. */ procedure is_alive; diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 298d07176..b59c92a94 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -332,7 +332,6 @@ create or replace package body ut_suite_manager is function get_missing_objects(a_object_owner varchar2) return ut_varchar2_rows is l_rows sys_refcursor; l_ut_owner varchar2(250) := ut_utils.ut_owner; - l_objects_view varchar2(200) := ut_metadata.get_objects_view_name(); l_cursor_text varchar2(32767); l_result ut_varchar2_rows; l_object_owner varchar2(250); diff --git a/source/install_headless.sql b/source/install_headless.sql index 8acc080fa..5162b4c03 100644 --- a/source/install_headless.sql +++ b/source/install_headless.sql @@ -14,25 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -set echo off -set verify off -column 1 new_value 1 noprint -column 2 new_value 2 noprint -column 3 new_value 3 noprint -select null as "1", null as "2" , null as "3" from dual where 1=0; -column sep new_value sep noprint -select '--------------------------------------------------------------' as sep from dual; - -spool params.sql.tmp - -column ut3_owner new_value ut3_owner noprint -column ut3_password new_value ut3_password noprint -column ut3_tablespace new_value ut3_tablespace noprint - -select coalesce('&&1','UT3') ut3_owner, - coalesce('&&2','XNtxj8eEgA6X6b6f') ut3_password, - coalesce('&&3','users') ut3_tablespace from dual; +@@set_install_params.sql @@create_utplsql_owner.sql &&ut3_owner &&ut3_password &&ut3_tablespace @@install.sql &&ut3_owner diff --git a/source/install_headless_with_trigger.sql b/source/install_headless_with_trigger.sql index 511dd6514..7140ee822 100644 --- a/source/install_headless_with_trigger.sql +++ b/source/install_headless_with_trigger.sql @@ -14,25 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -set echo off -set verify off -column 1 new_value 1 noprint -column 2 new_value 2 noprint -column 3 new_value 3 noprint -select null as "1", null as "2" , null as "3" from dual where 1=0; -column sep new_value sep noprint -select '--------------------------------------------------------------' as sep from dual; - -spool params.sql.tmp - -column ut3_owner new_value ut3_owner noprint -column ut3_password new_value ut3_password noprint -column ut3_tablespace new_value ut3_tablespace noprint - -select coalesce('&&1','UT3') ut3_owner, - coalesce('&&2','XNtxj8eEgA6X6b6f') ut3_password, - coalesce('&&3','users') ut3_tablespace from dual; +@@set_install_params.sql @@create_utplsql_owner.sql &&ut3_owner &&ut3_password &&ut3_tablespace @@install.sql &&ut3_owner diff --git a/source/set_install_params.sql b/source/set_install_params.sql new file mode 100644 index 000000000..1c7da89e9 --- /dev/null +++ b/source/set_install_params.sql @@ -0,0 +1,34 @@ +/* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +set echo off +set verify off +column 1 new_value 1 noprint; +column 2 new_value 2 noprint; +column 3 new_value 3 noprint; +select null as "1", null as "2" , null as "3" from dual where 1=0; +column sep new_value sep noprint +select '--------------------------------------------------------------' as sep from dual; + +column ut3_owner new_value ut3_owner noprint +column ut3_password new_value ut3_password noprint +column ut3_tablespace new_value ut3_tablespace noprint + +select coalesce('&&1','UT3') ut3_owner, + coalesce('&&2','XNtxj8eEgA6X6b6f') ut3_password, + coalesce('&&3','users') ut3_tablespace + from dual; From 56803f7f32235a21168af2869079b1929b0375ac Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Mon, 10 Jun 2019 01:07:51 +0100 Subject: [PATCH 157/181] Fixed issue with style check. Reorganized code to avoid problems with conditional compilation on 12.2 for triggers. --- development/utplsql_style_check.sql | 4 ++-- .../annotations/ut_annotation_manager.pkb | 21 +++++++++++++++---- .../ut_trigger_annotation_parsing.trg | 19 +++-------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/development/utplsql_style_check.sql b/development/utplsql_style_check.sql index 71c419806..00d562541 100644 --- a/development/utplsql_style_check.sql +++ b/development/utplsql_style_check.sql @@ -40,8 +40,8 @@ select i.name, i.type, i.object_name, i.object_type, i.usage, i.line, i.col, cou and i.usage_context_id = p.usage_id where i.type like 'VARIABLE' and i.usage = 'DECLARATION' and i.object_type not in ('TYPE') - and (i.name not like 'L#_%' escape '#' and p.type in ('PROCEDURE','FUNCTION','ITERATOR') - or i.name not like 'G#_%' escape '#' and p.type not in ('PROCEDURE','FUNCTION','ITERATOR')) + and (i.name not like 'L#_%' escape '#' and p.type in ('PROCEDURE','FUNCTION','ITERATOR','TRIGGER') + or i.name not like 'G#_%' escape '#' and p.type not in ('PROCEDURE','FUNCTION','ITERATOR','TRIGGER')) and p.type != 'RECORD' order by object_name, object_type, line, col ; diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 41bbb000a..70abafef7 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -255,9 +255,10 @@ create or replace package body ut_annotation_manager as end; procedure trigger_obj_annotation_rebuild is - l_sql_text ora_name_list_t; - l_parts binary_integer; - l_object_to_parse ut_annotation_obj_cache_info; + l_sql_text ora_name_list_t; + l_parts binary_integer; + l_object_to_parse ut_annotation_obj_cache_info; + 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; @@ -291,9 +292,21 @@ create or replace package body ut_annotation_manager as using a_object_name, a_object_type, a_object_owner, a_object_name; return l_result; end; - + begin 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 + select username bulk collect into l_restricted_users + from all_users where oracle_maintained = 'Y'; + $end + if ora_dict_obj_owner member of l_restricted_users then + return; + end if; l_object_to_parse := ut_annotation_obj_cache_info(ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type, 'Y'); diff --git a/source/core/annotations/ut_trigger_annotation_parsing.trg b/source/core/annotations/ut_trigger_annotation_parsing.trg index 1927befec..437b7742d 100644 --- a/source/core/annotations/ut_trigger_annotation_parsing.trg +++ b/source/core/annotations/ut_trigger_annotation_parsing.trg @@ -1,29 +1,16 @@ create or replace trigger ut_trigger_annotation_parsing after create or alter or drop on database -declare - l_restricted_users ora_name_list_t; begin if (ora_dict_obj_owner = UPPER('&&UT3_OWNER') and ora_dict_obj_name = 'UT3_TRIGGER_ALIVE' and ora_dict_obj_type = 'SYNONYM') then execute immediate 'begin ut_trigger_check.is_alive(); end;'; - elsif 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 - select /*+ result_cache */ username bulk collect into l_restricted_users - from all_users where oracle_maintained = 'Y'; - $end - if not (ora_dict_obj_type = 'TYPE' and ora_dict_obj_name like 'SYS\_PLSQL\_%' escape '\') - and not ora_dict_obj_owner member of l_restricted_users - then + elsif ora_dict_obj_type in ('PACKAGE','PROCEDURE','FUNCTION','TYPE') + and not (ora_dict_obj_type = 'TYPE' and ora_dict_obj_name like 'SYS\_PLSQL\_%' escape '\') + then execute immediate 'begin ut_annotation_manager.trigger_obj_annotation_rebuild; end;'; - end if; end if; exception when others then null; From e1a4e58b67f898ffc07a6cead0420c8fe8d989c0 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Mon, 10 Jun 2019 08:02:40 +0000 Subject: [PATCH 158/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index ae9d49bd2..a6c08b142 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index dcd197373..59018dafc 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 8ed1c349f..6c42cc288 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 983d4206a..b5860bd56 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index a6dd40837..dd5d1fa75 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 51d4f741f..db7bb7948 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 416bb2824..76653a6b2 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 131e7ccab..99d49b279 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 841c6b97f..9a3b61fe2 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index b4fac8f14..4afa41ae2 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 9162797c1..49cf4cd31 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 1b0be19b3..b40853f33 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index e297d1eff..f92ee996e 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 0b0ce0759..e43cfd548 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 42f9dbc6c..0da6be7d8 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index c42e2986a..3b20f5938 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 5cbfaa7da..f04f068d3 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3006--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 97b614e3b..b75b2c1d7 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -773,7 +773,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.3006-develop + * secion v3.1.7.3035-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 41b0f84f7..10bdab4c7 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.3006-develop'; + gc_version constant varchar2(50) := 'v3.1.7.3035-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 1af249a2db668375d8b703d652707e4cae67d98f Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Mon, 10 Jun 2019 23:41:24 +0100 Subject: [PATCH 159/181] Fixing sonar exclusions for analysis and coverage. --- sonar-project.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index d6744053e..c3acb5c43 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -10,6 +10,7 @@ sonar.projectVersion=v3.1.7-develop # the sonar-project.properties file. sonar.sources=./source sonar.coverageReportPaths=coverage.xml +sonar.coverage.exclusions=**/*.sql,**/*.pks sonar.tests=./test sonar.testExecutionReportPaths=./test_results.xml sonar.links.issue=https://github.com/utPLSQL/utPLSQL/issues @@ -20,7 +21,7 @@ sonar.plsql.file.suffixes=sql,tab,pkb,tpb sonar.language=plsql -sonar.exclusions=create_synonyms_and_grants_for_public.sql, create_user_grants.sql, create_user_synonyms.sql, create_utplsql_owner.sql, define_ut3_owner_param.sql, install.sql, install_above_12_1.sql, install_component.sql, install_headless.sql, uninstall.sql, uninstall_all.sql, uninstall_coverage_tables.sql +sonar.exclusions=**/*.sql sonar.pullrequest.provider=github sonar.pullrequest.github.endpoint=https://api.github.com/ From 75d2053967643102bbd8a688edaf19d6b1a929e9 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Mon, 10 Jun 2019 23:21:06 +0000 Subject: [PATCH 160/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index a6c08b142..1d8f95c0a 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 59018dafc..90491dba1 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 6c42cc288..a9ec7a1ec 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index b5860bd56..f7347b2f1 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index dd5d1fa75..25a68c06b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index db7bb7948..ef7ae347f 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 76653a6b2..78bcd2908 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 99d49b279..f63348c1a 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 9a3b61fe2..cdeea1903 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 4afa41ae2..f91abdb92 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 49cf4cd31..525e4a8df 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index b40853f33..9c67d6b30 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index f92ee996e..8dbea743f 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index e43cfd548..a128429b8 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 0da6be7d8..0b0d4b8c5 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 3b20f5938..b2c0c2857 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index f04f068d3..1a8de7596 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3035--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index b75b2c1d7..17a4b2b25 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -773,7 +773,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.3035-develop + * secion v3.1.7.3038-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 10bdab4c7..b9c7a42c7 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.3035-develop'; + gc_version constant varchar2(50) := 'v3.1.7.3038-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 5f07682601f3754f7251e935b85add5b41a4f719 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Wed, 12 Jun 2019 02:28:28 +0100 Subject: [PATCH 161/181] Fixed output_buffer purging error. Resolves #934 --- source/core/coverage/ut_coverage_helper.pkb | 2 +- .../core/coverage/ut_coverage_sources_tmp.sql | 47 +----------- .../output_buffers/ut_output_buffer_base.tpb | 76 +++++++++++++++++++ .../output_buffers/ut_output_buffer_base.tps | 15 ++-- .../ut_output_buffer_info_tmp.sql | 40 +--------- .../output_buffers/ut_output_buffer_tmp.sql | 56 +------------- .../ut_output_clob_buffer_tmp.sql | 46 +---------- .../ut_output_clob_table_buffer.tpb | 61 +-------------- .../ut_output_clob_table_buffer.tps | 8 +- .../output_buffers/ut_output_table_buffer.tpb | 61 +-------------- .../output_buffers/ut_output_table_buffer.tps | 8 +- source/install.sql | 9 ++- source/uninstall_objects.sql | 34 ++++----- test/ut3_tester/core/test_output_buffer.pkb | 38 +++++++++- test/ut3_tester/core/test_output_buffer.pks | 8 ++ 15 files changed, 165 insertions(+), 344 deletions(-) create mode 100644 source/core/output_buffers/ut_output_buffer_base.tpb diff --git a/source/core/coverage/ut_coverage_helper.pkb b/source/core/coverage/ut_coverage_helper.pkb index cfa3e413c..5f9744265 100644 --- a/source/core/coverage/ut_coverage_helper.pkb +++ b/source/core/coverage/ut_coverage_helper.pkb @@ -44,7 +44,7 @@ create or replace package body ut_coverage_helper is pragma autonomous_transaction; begin null; - execute immediate 'truncate table ut_coverage_sources_tmp$'; + execute immediate 'truncate table ut_coverage_sources_tmp'; commit; end; diff --git a/source/core/coverage/ut_coverage_sources_tmp.sql b/source/core/coverage/ut_coverage_sources_tmp.sql index bcc661a22..29b53d147 100644 --- a/source/core/coverage/ut_coverage_sources_tmp.sql +++ b/source/core/coverage/ut_coverage_sources_tmp.sql @@ -1,4 +1,4 @@ -create global temporary table ut_coverage_sources_tmp$( +create global temporary table ut_coverage_sources_tmp( /* utPLSQL - Version 3 Copyright 2016 - 2018 utPLSQL Project @@ -21,46 +21,5 @@ create global temporary table ut_coverage_sources_tmp$( constraint ut_coverage_sources_tmp_pk primary key (owner,name,line) ) on commit preserve rows; -create unique index ut_coverage_sources_tmp_uk on ut_coverage_sources_tmp$ (owner,name,to_be_skipped, line); - -declare - ex_nonedition_user exception; - ex_view_doesnt_exist exception; - pragma exception_init(ex_nonedition_user,-42314); - pragma exception_init(ex_view_doesnt_exist,-942); - v_view_source varchar2(32767); -begin - begin - execute immediate 'drop view ut_coverage_sources_tmp'; - exception - when ex_view_doesnt_exist then - null; - end; - v_view_source := ' ut_coverage_sources_tmp as -/* -utPLSQL - Version 3 -Copyright 2016 - 2018 utPLSQL Project -Licensed under the Apache License, Version 2.0 (the "License"): -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -select full_name - ,owner - ,name - ,line - ,to_be_skipped - ,text - from ut_coverage_sources_tmp$'; - - execute immediate 'create or replace editioning view '||v_view_source; -exception - when ex_nonedition_user then - execute immediate 'create or replace view '||v_view_source; -end; -/ +--is this needed? +--create unique index ut_coverage_sources_tmp_uk on ut_coverage_sources_tmp$ (owner,name,to_be_skipped, line); diff --git a/source/core/output_buffers/ut_output_buffer_base.tpb b/source/core/output_buffers/ut_output_buffer_base.tpb new file mode 100644 index 000000000..12eb08791 --- /dev/null +++ b/source/core/output_buffers/ut_output_buffer_base.tpb @@ -0,0 +1,76 @@ +create or replace type body ut_output_buffer_base is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + 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 + cleanup_buffer(); + self.self_type := coalesce(a_self_type,self.self_type); + self.output_id := coalesce(a_output_id, self.output_id, sys_guid()); + self.start_date := coalesce(self.start_date, sysdate); + self.last_message_id := 0; + select count(*) into l_exists from ut_output_buffer_info_tmp where output_id = self.output_id; + if ( l_exists > 0 ) then + update ut_output_buffer_info_tmp set start_date = self.start_date where output_id = self.output_id; + else + insert into ut_output_buffer_info_tmp(output_id, start_date) values (self.output_id, self.start_date); + end if; + commit; + 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 + open l_lines for + select text, item_type + from table(self.get_lines(a_initial_timeout, a_timeout_sec)); + 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 + l_data := self.get_lines_cursor(a_initial_timeout, a_timeout_sec); + loop + fetch l_data into l_clob, l_item_type; + exit when l_data%notfound; + l_lines := ut_utils.clob_to_table(l_clob); + for i in 1 .. l_lines.count loop + dbms_output.put_line(l_lines(i)); + end loop; + end loop; + close l_data; + end; + + member procedure cleanup_buffer(self in ut_output_buffer_base, a_retention_time_sec natural := null) is + gc_buffer_retention_sec constant naturaln := coalesce(a_retention_time_sec, 60 * 60 * 24); -- 24 hours + l_retention_days number := gc_buffer_retention_sec / (60 * 60 * 24); + l_max_retention_date date := sysdate - l_retention_days; + pragma autonomous_transaction; + begin + delete from ut_output_buffer_info_tmp i where i.start_date <= l_max_retention_date; + commit; + end; + +end; +/ \ No newline at end of file diff --git a/source/core/output_buffers/ut_output_buffer_base.tps b/source/core/output_buffers/ut_output_buffer_base.tps index 59226a7fb..cffdc63bc 100644 --- a/source/core/output_buffers/ut_output_buffer_base.tps +++ b/source/core/output_buffers/ut_output_buffer_base.tps @@ -1,4 +1,4 @@ -create or replace type ut_output_buffer_base authid definer as object( +create or replace type ut_output_buffer_base force authid definer as object( /* utPLSQL - Version 3 Copyright 2016 - 2018 utPLSQL Project @@ -17,13 +17,18 @@ create or replace type ut_output_buffer_base authid definer as object( */ output_id raw(32), - member procedure init(self in out nocopy ut_output_buffer_base), + is_closed number(1,0), + start_date date, + last_message_id number(38,0), + self_type varchar2(250 byte), + member procedure init(self in out nocopy ut_output_buffer_base, a_output_id raw := null, a_self_type varchar2 := null), + member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor, + member procedure lines_to_dbms_output(self in ut_output_buffer_base, a_initial_timeout natural := null, a_timeout_sec natural := null), + member procedure cleanup_buffer(self in ut_output_buffer_base, a_retention_time_sec natural := null), not instantiable member procedure close(self in out nocopy ut_output_buffer_base), not instantiable member procedure send_line(self in out nocopy ut_output_buffer_base, a_text varchar2, a_item_type varchar2 := null), not instantiable member procedure send_lines(self in out nocopy ut_output_buffer_base, a_text_list ut_varchar2_rows, a_item_type varchar2 := null), not instantiable member procedure send_clob(self in out nocopy ut_output_buffer_base, a_text clob, a_item_type varchar2 := null), - not instantiable member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined, - not instantiable member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor, - not instantiable member procedure lines_to_dbms_output(self in ut_output_buffer_base, a_initial_timeout natural := null, a_timeout_sec natural := null) + not instantiable member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined ) not final not instantiable / diff --git a/source/core/output_buffers/ut_output_buffer_info_tmp.sql b/source/core/output_buffers/ut_output_buffer_info_tmp.sql index 5880022f5..c6e8995fb 100644 --- a/source/core/output_buffers/ut_output_buffer_info_tmp.sql +++ b/source/core/output_buffers/ut_output_buffer_info_tmp.sql @@ -1,4 +1,4 @@ -create table ut_output_buffer_info_tmp$( +create table ut_output_buffer_info_tmp( /* utPLSQL - Version 3 Copyright 2016 - 2018 utPLSQL Project @@ -23,41 +23,3 @@ create table ut_output_buffer_info_tmp$( ) organization index nologging initrans 10 ; --- This is needed to be EBR ready as editioning view can only be created by edition enabled user -declare - ex_nonedition_user exception; - ex_view_doesnt_exist exception; - pragma exception_init(ex_nonedition_user,-42314); - pragma exception_init(ex_view_doesnt_exist,-942); - v_view_source varchar2(32767); -begin - begin - execute immediate 'drop view ut_output_buffer_info_tmp'; - exception - when ex_view_doesnt_exist then - null; - end; - v_view_source := ' ut_output_buffer_info_tmp as -/* -utPLSQL - Version 3 -Copyright 2016 - 2018 utPLSQL Project -Licensed under the Apache License, Version 2.0 (the "License"): -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -select output_id - ,start_date - from ut_output_buffer_info_tmp$'; - - execute immediate 'create or replace editioning view '||v_view_source; -exception - when ex_nonedition_user then - execute immediate 'create or replace view '||v_view_source; -end; -/ diff --git a/source/core/output_buffers/ut_output_buffer_tmp.sql b/source/core/output_buffers/ut_output_buffer_tmp.sql index e78a71c15..7ae024555 100644 --- a/source/core/output_buffers/ut_output_buffer_tmp.sql +++ b/source/core/output_buffers/ut_output_buffer_tmp.sql @@ -1,9 +1,4 @@ -declare - v_table_sql varchar2(32767); - e_non_assm exception; - pragma exception_init(e_non_assm, -43853); -begin - v_table_sql := 'create table ut_output_buffer_tmp$( +create table ut_output_buffer_tmp( /* utPLSQL - Version 3 Copyright 2016 - 2018 utPLSQL Project @@ -31,52 +26,7 @@ begin constraint ut_output_buffer_tmp_ck check( is_finished = 0 and (text is not null or item_type is not null ) or is_finished = 1 and text is null and item_type is null ), - constraint ut_output_buffer_fk1 foreign key (output_id) references ut_output_buffer_info_tmp$(output_id) + constraint ut_output_buffer_fk foreign key (output_id) references ut_output_buffer_info_tmp(output_id) on delete cascade ) organization index nologging initrans 100 - overflow nologging initrans 100 -'; - execute immediate v_table_sql; -end; -/ + overflow nologging initrans 100; --- This is needed to be EBR ready as editioning view can only be created by edition enabled user -declare - ex_nonedition_user exception; - ex_view_doesnt_exist exception; - pragma exception_init(ex_nonedition_user,-42314); - pragma exception_init(ex_view_doesnt_exist,-942); - v_view_source varchar2(32767); -begin - begin - execute immediate 'drop view ut_output_buffer_tmp'; - exception - when ex_view_doesnt_exist then - null; - end; - v_view_source := ' ut_output_buffer_tmp as -/* -utPLSQL - Version 3 -Copyright 2016 - 2018 utPLSQL Project -Licensed under the Apache License, Version 2.0 (the "License"): -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -select output_id - ,message_id - ,text - ,item_type - ,is_finished - from ut_output_buffer_tmp$'; - - execute immediate 'create or replace editioning view '||v_view_source; -exception - when ex_nonedition_user then - execute immediate 'create or replace view '||v_view_source; -end; -/ diff --git a/source/core/output_buffers/ut_output_clob_buffer_tmp.sql b/source/core/output_buffers/ut_output_clob_buffer_tmp.sql index 57be1c6f4..0f56a837e 100644 --- a/source/core/output_buffers/ut_output_clob_buffer_tmp.sql +++ b/source/core/output_buffers/ut_output_clob_buffer_tmp.sql @@ -3,7 +3,7 @@ declare e_non_assm exception; pragma exception_init(e_non_assm, -43853); begin - v_table_sql := 'create table ut_output_clob_buffer_tmp$( + v_table_sql := 'create table ut_output_clob_buffer_tmp( /* utPLSQL - Version 3 Copyright 2016 - 2018 utPLSQL Project @@ -31,7 +31,7 @@ begin constraint ut_output_clob_buffer_tmp_ck check( is_finished = 0 and (text is not null or item_type is not null ) or is_finished = 1 and text is null and item_type is null ), - constraint ut_output_clob_buffer_tmp_fk1 foreign key (output_id) references ut_output_buffer_info_tmp$(output_id) + constraint ut_output_clob_buffer_tmp_fk foreign key (output_id) references ut_output_buffer_info_tmp(output_id) on delete cascade ) nologging initrans 100 '; begin @@ -45,45 +45,3 @@ begin end; end; / - --- This is needed to be EBR ready as editioning view can only be created by edition enabled user -declare - ex_nonedition_user exception; - ex_view_doesnt_exist exception; - pragma exception_init(ex_nonedition_user,-42314); - pragma exception_init(ex_view_doesnt_exist,-942); - v_view_source varchar2(32767); -begin - begin - execute immediate 'drop view ut_output_clob_buffer_tmp'; - exception - when ex_view_doesnt_exist then - null; - end; - v_view_source := ' ut_output_clob_buffer_tmp as -/* -utPLSQL - Version 3 -Copyright 2016 - 2018 utPLSQL Project -Licensed under the Apache License, Version 2.0 (the "License"): -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -select output_id - ,message_id - ,text - ,item_type - ,is_finished - from ut_output_clob_buffer_tmp$'; - - execute immediate 'create or replace editioning view '||v_view_source; -exception - when ex_nonedition_user then - execute immediate 'create or replace view '||v_view_source; -end; -/ diff --git a/source/core/output_buffers/ut_output_clob_table_buffer.tpb b/source/core/output_buffers/ut_output_clob_table_buffer.tpb index 56873a418..a8d979946 100644 --- a/source/core/output_buffers/ut_output_clob_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_clob_table_buffer.tpb @@ -18,27 +18,10 @@ create or replace type body ut_output_clob_table_buffer is 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 - self.output_id := coalesce(a_output_id, sys_guid()); - self.start_date := sysdate; - self.last_message_id := 0; - self.init(); - self.cleanup_buffer(); + self.init(a_output_id, $$plsql_unit); return; end; - overriding member procedure init(self in out nocopy ut_output_clob_table_buffer) is - pragma autonomous_transaction; - l_exists int; - begin - select count(*) into l_exists from ut_output_buffer_info_tmp where output_id = self.output_id; - if ( l_exists > 0 ) then - update ut_output_buffer_info_tmp set start_date = self.start_date where output_id = self.output_id; - else - insert into ut_output_buffer_info_tmp(output_id, start_date) values (self.output_id, self.start_date); - end if; - commit; - end; - overriding member procedure close(self in out nocopy ut_output_clob_table_buffer) is pragma autonomous_transaction; begin @@ -46,6 +29,7 @@ create or replace type body ut_output_clob_table_buffer is insert into ut_output_clob_buffer_tmp(output_id, message_id, is_finished) values (self.output_id, self.last_message_id, 1); commit; + 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 @@ -169,46 +153,5 @@ create or replace type body ut_output_clob_table_buffer is return; end; - overriding member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor is - l_lines sys_refcursor; - begin - open l_lines for - select text, item_type - from table(self.get_lines(a_initial_timeout, a_timeout_sec)); - return l_lines; - end; - - overriding member procedure lines_to_dbms_output(self in ut_output_clob_table_buffer, 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 - l_data := self.get_lines_cursor(a_initial_timeout, a_timeout_sec); - loop - fetch l_data into l_clob, l_item_type; - exit when l_data%notfound; - l_lines := ut_utils.clob_to_table(l_clob); - for i in 1 .. l_lines.count loop - dbms_output.put_line(l_lines(i)); - end loop; - end loop; - close l_data; - end; - - member procedure cleanup_buffer(self in ut_output_clob_table_buffer, a_retention_time_sec natural := null) is - gc_buffer_retention_sec constant naturaln := coalesce(a_retention_time_sec, 60 * 60 * 24); -- 24 hours - l_retention_days number := gc_buffer_retention_sec / (60 * 60 * 24); - l_max_retention_date date := sysdate - l_retention_days; - pragma autonomous_transaction; - begin - delete from ut_output_clob_buffer_tmp t - where t.output_id - in (select i.output_id from ut_output_buffer_info_tmp i where i.start_date <= l_max_retention_date); - - delete from ut_output_buffer_info_tmp i where i.start_date <= l_max_retention_date; - commit; - end; - end; / diff --git a/source/core/output_buffers/ut_output_clob_table_buffer.tps b/source/core/output_buffers/ut_output_clob_table_buffer.tps index 83e342106..ac9a502cd 100644 --- a/source/core/output_buffers/ut_output_clob_table_buffer.tps +++ b/source/core/output_buffers/ut_output_clob_table_buffer.tps @@ -16,17 +16,11 @@ create or replace type ut_output_clob_table_buffer under ut_output_buffer_base ( limitations under the License. */ - start_date date, - last_message_id number(38,0), 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, - overriding member procedure init(self in out nocopy ut_output_clob_table_buffer), overriding member procedure send_line(self in out nocopy ut_output_clob_table_buffer, a_text varchar2, a_item_type varchar2 := null), 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), overriding member procedure send_clob(self in out nocopy ut_output_clob_table_buffer, a_text clob, a_item_type varchar2 := null), overriding member procedure close(self in out nocopy ut_output_clob_table_buffer), - overriding member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined, - overriding member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor, - overriding member procedure lines_to_dbms_output(self in ut_output_clob_table_buffer, a_initial_timeout natural := null, a_timeout_sec natural := null), - member procedure cleanup_buffer(self in ut_output_clob_table_buffer, a_retention_time_sec natural := null) + overriding member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined ) not final / diff --git a/source/core/output_buffers/ut_output_table_buffer.tpb b/source/core/output_buffers/ut_output_table_buffer.tpb index afcbcbc95..44e91cc38 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_table_buffer.tpb @@ -18,27 +18,10 @@ create or replace type body ut_output_table_buffer is 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 - self.output_id := coalesce(a_output_id, sys_guid()); - self.start_date := sysdate; - self.last_message_id := 0; - self.init(); - self.cleanup_buffer(); + self.init(a_output_id, $$plsql_unit); return; end; - overriding member procedure init(self in out nocopy ut_output_table_buffer) is - pragma autonomous_transaction; - l_exists int; - begin - select count(*) into l_exists from ut_output_buffer_info_tmp where output_id = self.output_id; - if ( l_exists > 0 ) then - update ut_output_buffer_info_tmp set start_date = self.start_date where output_id = self.output_id; - else - insert into ut_output_buffer_info_tmp(output_id, start_date) values (self.output_id, self.start_date); - end if; - commit; - end; - overriding member procedure close(self in out nocopy ut_output_table_buffer) is pragma autonomous_transaction; begin @@ -46,6 +29,7 @@ create or replace type body ut_output_table_buffer is insert into ut_output_buffer_tmp(output_id, message_id, is_finished) values (self.output_id, self.last_message_id, 1); commit; + 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 @@ -187,46 +171,5 @@ create or replace type body ut_output_table_buffer is return; end; - overriding member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor is - l_lines sys_refcursor; - begin - open l_lines for - select text, item_type - from table(self.get_lines(a_initial_timeout, a_timeout_sec)); - return l_lines; - end; - - overriding member procedure lines_to_dbms_output(self in ut_output_table_buffer, 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 - l_data := self.get_lines_cursor(a_initial_timeout, a_timeout_sec); - loop - fetch l_data into l_clob, l_item_type; - exit when l_data%notfound; - l_lines := ut_utils.clob_to_table(l_clob); - for i in 1 .. l_lines.count loop - dbms_output.put_line(l_lines(i)); - end loop; - end loop; - close l_data; - end; - - member procedure cleanup_buffer(self in ut_output_table_buffer, a_retention_time_sec natural := null) is - gc_buffer_retention_sec constant naturaln := coalesce(a_retention_time_sec, 60 * 60 * 24); -- 24 hours - l_retention_days number := gc_buffer_retention_sec / (60 * 60 * 24); - l_max_retention_date date := sysdate - l_retention_days; - pragma autonomous_transaction; - begin - delete from ut_output_buffer_tmp t - where t.output_id - in (select i.output_id from ut_output_buffer_info_tmp i where i.start_date <= l_max_retention_date); - - delete from ut_output_buffer_info_tmp i where i.start_date <= l_max_retention_date; - commit; - end; - end; / diff --git a/source/core/output_buffers/ut_output_table_buffer.tps b/source/core/output_buffers/ut_output_table_buffer.tps index 9cf64927c..77a057b78 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tps +++ b/source/core/output_buffers/ut_output_table_buffer.tps @@ -16,17 +16,11 @@ create or replace type ut_output_table_buffer under ut_output_buffer_base ( limitations under the License. */ - start_date date, - last_message_id number(38,0), constructor function ut_output_table_buffer(self in out nocopy ut_output_table_buffer, a_output_id raw := null) return self as result, - overriding member procedure init(self in out nocopy ut_output_table_buffer), overriding member procedure send_line(self in out nocopy ut_output_table_buffer, a_text varchar2, a_item_type varchar2 := null), overriding member procedure send_lines(self in out nocopy ut_output_table_buffer, a_text_list ut_varchar2_rows, a_item_type varchar2 := null), overriding member procedure send_clob(self in out nocopy ut_output_table_buffer, a_text clob, a_item_type varchar2 := null), overriding member procedure close(self in out nocopy ut_output_table_buffer), - overriding member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined, - overriding member function get_lines_cursor(a_initial_timeout natural := null, a_timeout_sec natural := null) return sys_refcursor, - overriding member procedure lines_to_dbms_output(self in ut_output_table_buffer, a_initial_timeout natural := null, a_timeout_sec natural := null), - member procedure cleanup_buffer(self in ut_output_table_buffer, a_retention_time_sec natural := null) + overriding member function get_lines(a_initial_timeout natural := null, a_timeout_sec natural := null) return ut_output_data_rows pipelined ) not final / diff --git a/source/install.sql b/source/install.sql index 145357052..e6ccf7d28 100644 --- a/source/install.sql +++ b/source/install.sql @@ -92,14 +92,15 @@ alter session set current_schema = &&ut3_owner; @@install_component.sql 'expectations/data_values/ut_key_anyvalues.tps' ---output buffer base api -@@install_component.sql 'core/output_buffers/ut_output_data_row.tps' -@@install_component.sql 'core/output_buffers/ut_output_data_rows.tps' -@@install_component.sql 'core/output_buffers/ut_output_buffer_base.tps' --output buffer table @@install_component.sql 'core/output_buffers/ut_output_buffer_info_tmp.sql' @@install_component.sql 'core/output_buffers/ut_output_buffer_tmp.sql' @@install_component.sql 'core/output_buffers/ut_output_clob_buffer_tmp.sql' +--output buffer base api +@@install_component.sql 'core/output_buffers/ut_output_data_row.tps' +@@install_component.sql 'core/output_buffers/ut_output_data_rows.tps' +@@install_component.sql 'core/output_buffers/ut_output_buffer_base.tps' +@@install_component.sql 'core/output_buffers/ut_output_buffer_base.tpb' --output buffer table api @@install_component.sql 'core/output_buffers/ut_output_table_buffer.tps' @@install_component.sql 'core/output_buffers/ut_output_table_buffer.tpb' diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index b109efd89..f34b964de 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -52,9 +52,7 @@ drop package ut_coverage; drop package ut_coverage_helper; -drop view ut_coverage_sources_tmp; - -drop table ut_coverage_sources_tmp$; +drop table ut_coverage_sources_tmp purge; drop package ut_teamcity_reporter_helper; @@ -70,17 +68,17 @@ drop package ut_suite_builder; drop package ut_suite_cache_manager; -drop table ut_suite_cache; +drop table ut_suite_cache purge; drop sequence ut_suite_cache_seq; -drop table ut_suite_cache_package; +drop table ut_suite_cache_package purge; -drop table ut_suite_cache_schema; +drop table ut_suite_cache_schema purge; drop package ut; -drop table ut_dbms_output_cache; +drop table ut_dbms_output_cache purge; drop type ut_expectation_compound force; @@ -160,9 +158,9 @@ drop type ut_cursor_column_tab force; drop type ut_cursor_column force; -drop table ut_compound_data_tmp; +drop table ut_compound_data_tmp purge; -drop table ut_compound_data_diff_tmp; +drop table ut_compound_data_diff_tmp purge; drop trigger ut_trigger_annotation_parsing; @@ -172,11 +170,11 @@ drop package ut_annotation_parser; drop package ut_annotation_cache_manager; -drop table ut_annotation_cache cascade constraints; +drop table ut_annotation_cache cascade constraints purge; -drop table ut_annotation_cache_info cascade constraints; +drop table ut_annotation_cache_info cascade constraints purge; -drop table ut_annotation_cache_schema cascade constraints; +drop table ut_annotation_cache_schema cascade constraints purge; drop sequence ut_annotation_cache_seq; @@ -260,17 +258,11 @@ drop type ut_output_clob_table_buffer force; drop type ut_output_buffer_base force; -drop view ut_output_buffer_tmp; - -drop table ut_output_buffer_tmp$ purge; - -drop view ut_output_clob_buffer_tmp; - -drop table ut_output_clob_buffer_tmp$ purge; +drop table ut_output_buffer_tmp purge; -drop view ut_output_buffer_info_tmp; +drop table ut_output_clob_buffer_tmp purge; -drop table ut_output_buffer_info_tmp$; +drop table ut_output_buffer_info_tmp purge; drop type ut_output_data_rows force; diff --git a/test/ut3_tester/core/test_output_buffer.pkb b/test/ut3_tester/core/test_output_buffer.pkb index 40af7e0b0..7aab6f389 100644 --- a/test/ut3_tester/core/test_output_buffer.pkb +++ b/test/ut3_tester/core/test_output_buffer.pkb @@ -109,6 +109,42 @@ create or replace package body test_output_buffer is ut.expect(l_remaining).to_equal(0); end; - + + procedure test_purge(a_buffer ut3.ut_output_buffer_base ) is + l_stale_buffer ut3.ut_output_buffer_base := a_buffer; + l_fresh_buffer ut3.ut_output_buffer_base; + l_buffer ut3.ut_output_buffer_base; + begin + --Arrange + l_stale_buffer.start_date := sysdate - 2; + --initialize with new start date + l_stale_buffer.init(); + l_stale_buffer.send_line('some text'); + l_stale_buffer.close(); + + l_fresh_buffer := ut3.ut_output_table_buffer(); + l_fresh_buffer.send_line('some text'); + l_fresh_buffer.close(); + + --Act - purge is performed on new buffer create + l_buffer := ut3.ut_output_table_buffer(); + + --Assert + -- Data in "fresh" buffer remains + ut.expect( l_fresh_buffer.get_lines_cursor(0,0), l_buffer.self_type ).to_have_count(1); + -- Data in "slate" buffer is purged and so the call to get_lines_cursor throws ORA-20218 + ut.expect( l_stale_buffer.get_lines_cursor(0,0), l_buffer.self_type ).to_be_empty(); + end; + + procedure test_purge_text_buffer is + begin + test_purge(ut3.ut_output_table_buffer()); + end; + + procedure test_purge_clob_buffer is + begin + test_purge(ut3.ut_output_clob_table_buffer()); + end; + end test_output_buffer; / diff --git a/test/ut3_tester/core/test_output_buffer.pks b/test/ut3_tester/core/test_output_buffer.pks index 8f4d5873d..24c2c01eb 100644 --- a/test/ut3_tester/core/test_output_buffer.pks +++ b/test/ut3_tester/core/test_output_buffer.pks @@ -18,5 +18,13 @@ create or replace package test_output_buffer is --%test(Waits For The Data To Appear For Specified Time) procedure test_waiting_for_data; + --%test(Purges text buffer data older than one day and leaves the rest) + --%throws(-20218) + procedure test_purge_text_buffer; + + --%test(Purges clob buffer data older than one day and leaves the rest) + --%throws(-20218) + procedure test_purge_clob_buffer; + end test_output_buffer; / From 910f29c9bce00238a6569d82a654bb6b8b67dcad Mon Sep 17 00:00:00 2001 From: Travis CI Date: Wed, 12 Jun 2019 09:25:09 +0000 Subject: [PATCH 162/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 1d8f95c0a..170c4e62d 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 90491dba1..0c2309521 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index a9ec7a1ec..5d9308310 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index f7347b2f1..00f28566c 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 25a68c06b..3362da169 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index ef7ae347f..a922e9520 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 78bcd2908..b07e349e8 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index f63348c1a..189dcc704 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index cdeea1903..04d56d6a2 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index f91abdb92..5e658cbec 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 525e4a8df..26ecd67f2 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 9c67d6b30..b238c69f5 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 8dbea743f..ea5218db7 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index a128429b8..962dbfdd8 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 0b0d4b8c5..cd35cf12e 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index b2c0c2857..5a2a211e6 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 1a8de7596..a25f54d33 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3038--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 17a4b2b25..0dc2cc657 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -773,7 +773,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.3038-develop + * secion v3.1.7.3041-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index b9c7a42c7..e25c40dee 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.3038-develop'; + gc_version constant varchar2(50) := 'v3.1.7.3041-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From dc78df39eb1111261337372e235e2519d223bec6 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 12 Jun 2019 16:02:13 +0200 Subject: [PATCH 163/181] add test cases for warning texts in tests, suites --- test/ut3_user/reporters/test_realtime_reporter.pks | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/ut3_user/reporters/test_realtime_reporter.pks b/test/ut3_user/reporters/test_realtime_reporter.pks index 04cd288e1..e57ccab21 100644 --- a/test/ut3_user/reporters/test_realtime_reporter.pks +++ b/test/ut3_user/reporters/test_realtime_reporter.pks @@ -44,7 +44,13 @@ create or replace package test_realtime_reporter as --%test(Provide the error stack of a testsuite) procedure error_stack_of_testsuite; - + + --%test(Provide warnings of a test) + procedure warnings_of_test; + + --%test(Provide warnings of a testsuite) + procedure warnings_of_testsuite; + --%test(Provide a description of the reporter explaining the use for SQL Developer) procedure get_description; From 6dd53a96e3d4c0c093c29fe150415fc2272037a8 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 12 Jun 2019 16:05:34 +0200 Subject: [PATCH 164/181] implement new test cases and adapt existing ones Structure of test cases is affected since new PL/SQL package is created which is also used in the whole run. --- .../reporters/test_realtime_reporter.pkb | 69 +++++++++++++++++-- 1 file changed, 64 insertions(+), 5 deletions(-) diff --git a/test/ut3_user/reporters/test_realtime_reporter.pkb b/test/ut3_user/reporters/test_realtime_reporter.pkb index 8387fa4bd..659afce13 100644 --- a/test/ut3_user/reporters/test_realtime_reporter.pkb +++ b/test/ut3_user/reporters/test_realtime_reporter.pkb @@ -99,6 +99,23 @@ create or replace package body test_realtime_reporter as raise no_data_found; end; end;]'; + + execute immediate q'[create or replace package check_realtime_reporting4 is + --%suite + --%suitepath(realtime_reporting) + /* tag annotation without parameter will raise a warning */ + --%tags + + --%test + procedure test_8_with_warning; + end;]'; + execute immediate q'[create or replace package body check_realtime_reporting4 is + procedure test_8_with_warning is + begin + commit; -- this will raise a warning + ut3.ut.expect(8).to_equal(8); + end; + end;]'; <> declare @@ -128,6 +145,10 @@ create or replace package body test_realtime_reporter as open l_expected for select 'pre-run' as event_type, null as item_id from dual union all select 'pre-suite' as event_type, 'realtime_reporting' as item_id from dual union all + select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting4' as item_id from dual union all + select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting4.test_8_with_warning' as item_id from dual union all + select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting4.test_8_with_warning' as item_id from dual union all + select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting4' as item_id from dual union all select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting3' as item_id from dual union all select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error' as item_id from dual union all select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error' as item_id from dual union all @@ -179,6 +200,9 @@ create or replace package body test_realtime_reporter as select 'event/items/suite/items/suite' as node_path from dual union all select 'event/items/suite/items/suite/items' as node_path from dual union all select 'event/items/suite/items/suite/items/test' as node_path from dual union all + select 'event/items/suite/items/suite' as node_path from dual union all + select 'event/items/suite/items/suite/items' as node_path from dual union all + select 'event/items/suite/items/suite/items/test' as node_path from dual union all select 'event/items/suite/items/suite/items/test' as node_path from dual union all select 'event/items/suite/items/suite' as node_path from dual union all select 'event/items/suite/items/suite/items' as node_path from dual union all @@ -196,7 +220,7 @@ create or replace package body test_realtime_reporter as procedure total_number_of_tests is l_actual integer; - l_expected integer := 7; + l_expected integer := 8; begin select t.event_doc.extract('/event/totalNumberOfTests/text()').getnumberval() into l_actual @@ -242,9 +266,9 @@ create or replace package body test_realtime_reporter as and t.event_doc.extract('//test/@id').getstringval() is not null; open l_expected for select level as test_number, - 7 as total_number_of_tests + 8 as total_number_of_tests from dual - connect by level <= 7; + connect by level <= 8; ut.expect(l_actual).to_equal(l_expected).unordered; end pre_test_nodes; @@ -270,9 +294,9 @@ create or replace package body test_realtime_reporter as and t.event_doc.extract('//test/counter/warning/text()').getnumberval() is not null; open l_expected for select level as test_number, - 7 as total_number_of_tests + 8 as total_number_of_tests from dual - connect by level <= 7; + connect by level <= 8; ut.expect(l_actual).to_equal(l_expected).unordered; end post_test_nodes; @@ -379,6 +403,41 @@ create or replace package body test_realtime_reporter as ut.expect(l_actual).to_be_like(l_expected); end error_stack_of_testsuite; + procedure warnings_of_test is + l_actual clob; + l_expected_list ut3.ut_varchar2_list; + l_expected clob; + begin + select t.event_doc.extract('//event/test/warnings/text()').getstringval() + into l_actual + from table(g_events) t + where t.event_doc.extract('/event[@type="post-test"]/test/@id').getstringval() + = 'realtime_reporting.check_realtime_reporting4.test_8_with_warning'; + ut3_tester_helper.main_helper.append_to_list(l_expected_list, ''); + l_expected := ut3_tester_helper.main_helper.table_to_clob(l_expected_list); + ut.expect(l_actual).to_be_like(l_expected); + end warnings_of_test; + + procedure warnings_of_testsuite is + l_actual clob; + l_expected_list ut3.ut_varchar2_list; + l_expected clob; + begin + select t.event_doc.extract('//event/suite/warnings/text()').getstringval() + into l_actual + from table(g_events) t + where t.event_doc.extract('/event[@type="post-suite"]/suite/@id').getstringval() + = 'realtime_reporting.check_realtime_reporting4'; + ut3_tester_helper.main_helper.append_to_list(l_expected_list, ''); + l_expected := ut3_tester_helper.main_helper.table_to_clob(l_expected_list); + ut.expect(l_actual).to_be_like(l_expected); + end warnings_of_testsuite; + procedure get_description is l_reporter ut3.ut_realtime_reporter; l_actual varchar2(4000); From 8aee0b0ab77c6582078ef11369c4ca54ae0d0c19 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 12 Jun 2019 16:06:04 +0200 Subject: [PATCH 165/181] emit warning texts on test and suite level --- source/reporters/ut_realtime_reporter.tpb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/reporters/ut_realtime_reporter.tpb b/source/reporters/ut_realtime_reporter.tpb index 7c674cc7d..493dbe513 100644 --- a/source/reporters/ut_realtime_reporter.tpb +++ b/source/reporters/ut_realtime_reporter.tpb @@ -141,6 +141,7 @@ create or replace type body ut_realtime_reporter is self.print_end_node('counter'); self.print_cdata_node('errorStack', ut_utils.table_to_clob(a_suite.get_error_stack_traces())); self.print_cdata_node('serverOutput', a_suite.get_serveroutputs()); + self.print_cdata_node('warnings', ut_utils.table_to_clob(a_suite.warnings)); self.print_end_node('suite'); self.print_end_node('event'); self.flush_print_buffer('post-suite'); @@ -196,6 +197,7 @@ create or replace type body ut_realtime_reporter is end loop expectations; self.print_end_node('failedExpectations'); end if; + self.print_cdata_node('warnings', ut_utils.table_to_clob(a_test.warnings)); self.print_end_node('test'); self.print_end_node('event'); self.flush_print_buffer('post-test'); From 0be72e48dccc1d5ff94afc88ba0fea9ec0253fe5 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 12 Jun 2019 16:24:07 +0200 Subject: [PATCH 166/181] complete cleanup after run --- test/ut3_user/reporters/test_realtime_reporter.pkb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/ut3_user/reporters/test_realtime_reporter.pkb b/test/ut3_user/reporters/test_realtime_reporter.pkb index 659afce13..28724facf 100644 --- a/test/ut3_user/reporters/test_realtime_reporter.pkb +++ b/test/ut3_user/reporters/test_realtime_reporter.pkb @@ -454,6 +454,7 @@ create or replace package body test_realtime_reporter as execute immediate 'drop package check_realtime_reporting1'; execute immediate 'drop package check_realtime_reporting2'; execute immediate 'drop package check_realtime_reporting3'; + execute immediate 'drop package check_realtime_reporting4'; end remove_test_suites; end test_realtime_reporter; From c6c3af573e5ff01ea7c9804389a0732570703e48 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Thu, 13 Jun 2019 08:03:20 +0000 Subject: [PATCH 167/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 170c4e62d..5bd515ed4 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 0c2309521..cb71fd4c9 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 5d9308310..aaf801028 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index 00f28566c..fcb71d47b 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 3362da169..5995bd8a0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index a922e9520..4a6ad6bce 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index b07e349e8..da59f8890 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 189dcc704..c45165428 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 04d56d6a2..f446e86d5 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 5e658cbec..a59828be9 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 26ecd67f2..fac7c7c80 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index b238c69f5..23b5925d3 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index ea5218db7..30e8b847f 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 962dbfdd8..8813cab2e 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index cd35cf12e..56375da73 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index 5a2a211e6..eef920780 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index a25f54d33..f363ddc80 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3041--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 0dc2cc657..3b6a09ddf 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -773,7 +773,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.3041-develop + * secion v3.1.7.3051-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index e25c40dee..41090accc 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.3041-develop'; + gc_version constant varchar2(50) := 'v3.1.7.3051-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 85942e987da4222c6e51f80069cf8ed47aeb6e4b Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sat, 15 Jun 2019 17:33:16 +0100 Subject: [PATCH 168/181] Removed dependency on `dbms_utility.name_resolve`. Fixed issue with utPLSQL failing to run when schema contains package named the same as schema owning it. It is now possible to have utPLSQL test package like this: ``` create or replace package some_schema.some_schema as --%suite --%test procedure sample_test; end; / create or replace package body some_schema.some_schema as procedure sample_test is begin ut.expect(1).to_equal(1); end; end; / ``` The tests from the package can be invoked by calling: `exec ut.run('some_schema.some_schema');` If only schema is provided, all test packages in schema are executed. `exec ut.run('some_schema');` Resolves #569 Resolves #885 --- source/core/types/ut_executable.tpb | 15 ++-- source/core/types/ut_executable.tps | 2 +- source/core/ut_metadata.pkb | 74 +++++-------------- source/core/ut_metadata.pks | 12 --- .../test_before_after_annotations.pkb | 3 +- test/ut3_user/api/test_ut_run.pkb | 38 +++++++++- test/ut3_user/api/test_ut_run.pks | 11 +++ 7 files changed, 76 insertions(+), 79 deletions(-) diff --git a/source/core/types/ut_executable.tpb b/source/core/types/ut_executable.tpb index b41e75388..2fc1e3a7e 100644 --- a/source/core/types/ut_executable.tpb +++ b/source/core/types/ut_executable.tpb @@ -29,9 +29,13 @@ create or replace type body ut_executable is return; end; - member function form_name return varchar2 is + member function form_name(a_skip_current_user_schema boolean := false) return varchar2 is + l_owner_name varchar2(250) := owner_name; begin - return ut_metadata.form_name(owner_name, object_name, procedure_name); + if a_skip_current_user_schema and sys_context('userenv', 'current_schema') = owner_name then + l_owner_name := null; + end if; + 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 @@ -71,10 +75,9 @@ create or replace type body ut_executable is begin if not ut_metadata.package_valid(self.owner_name, self.object_name) then - self.error_stack := l_message_part || 'package does not exist or is invalid: ' ||upper(self.owner_name||'.'||self.object_name); + self.error_stack := l_message_part || 'package '||upper(self.owner_name||'.'||self.object_name)||' does not exist or is invalid.'; elsif not ut_metadata.procedure_exists(self.owner_name, self.object_name, self.procedure_name) then - self.error_stack := l_message_part || 'procedure does not exist ' - || upper(self.owner_name || '.' || self.object_name || '.' ||self.procedure_name); + 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; @@ -115,7 +118,7 @@ create or replace type body ut_executable is ' l_error_backtrace varchar2(32767);' || chr(10) || 'begin' || chr(10) || ' begin' || chr(10) || - ' ' || self.form_name() || ';' || 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) || diff --git a/source/core/types/ut_executable.tps b/source/core/types/ut_executable.tps index 8186e4bae..9154881f2 100644 --- a/source/core/types/ut_executable.tps +++ b/source/core/types/ut_executable.tps @@ -30,7 +30,7 @@ create or replace type ut_executable under ut_event_item( */ seq_no integer, 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, - member function form_name return varchar2, + member function form_name(a_skip_current_user_schema boolean := false) return varchar2, member procedure do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item), /** * executes the defines executable diff --git a/source/core/ut_metadata.pkb b/source/core/ut_metadata.pkb index 43a57afa9..30262533a 100644 --- a/source/core/ut_metadata.pkb +++ b/source/core/ut_metadata.pkb @@ -21,31 +21,6 @@ create or replace package body ut_metadata as g_cached_object varchar2(500); ------------------------------ --public definitions - - procedure do_resolve(a_owner in out nocopy varchar2, a_object in out nocopy varchar2, a_procedure_name in out nocopy varchar2) is - l_name varchar2(200); - l_context integer := 1; --plsql - begin - l_name := form_name(a_owner, a_object, a_procedure_name); - do_resolve(l_name,l_context,a_owner,a_object, a_procedure_name); - end do_resolve; - - procedure do_resolve(a_fully_qualified_name in varchar2,a_context in integer,a_owner out nocopy varchar2, a_object out nocopy varchar2, - a_procedure_name out nocopy varchar2) is - l_dblink varchar2(200); - l_part1_type number; - l_object_number number; - begin - dbms_utility.name_resolve(name => a_fully_qualified_name - ,context => a_context - ,schema => a_owner - ,part1 => a_object - ,part2 => a_procedure_name - ,dblink => l_dblink - ,part1_type => l_part1_type - ,object_number => l_object_number); - end; - function form_name(a_owner_name varchar2, a_object varchar2, a_subprogram varchar2 default null) return varchar2 is l_name varchar2(200); begin @@ -61,25 +36,16 @@ create or replace package body ut_metadata as function package_valid(a_owner_name varchar2, a_package_name in varchar2) return boolean as l_cnt number; - l_schema varchar2(200); - l_package_name varchar2(200); - l_procedure_name varchar2(200); l_view_name varchar2(200) := get_objects_view_name; begin - l_schema := a_owner_name; - l_package_name := a_package_name; - - do_resolve(l_schema, l_package_name, l_procedure_name); - - execute immediate q'[select count(decode(status, 'VALID', 1, null)) / count(*) + execute immediate q'[select count(*) from ]'||l_view_name||q'[ - where owner = :l_schema - and object_name = :l_package_name - and object_type in ('PACKAGE')]' - into l_cnt using l_schema, l_package_name; - - -- expect both package and body to be valid + 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); return l_cnt = 1; exception when others then @@ -89,22 +55,12 @@ create or replace package body ut_metadata as function procedure_exists(a_owner_name varchar2, a_package_name in varchar2, a_procedure_name in varchar2) return boolean as l_cnt number; - l_schema varchar2(200); - l_package_name varchar2(200); - l_procedure_name varchar2(200); l_view_name varchar2(200) := get_dba_view('dba_procedures'); begin - - l_schema := a_owner_name; - l_package_name := a_package_name; - l_procedure_name := a_procedure_name; - - do_resolve(l_schema, l_package_name, l_procedure_name); - execute immediate 'select count(*) from '||l_view_name - ||' where owner = :l_schema and object_name = :l_package_name and procedure_name = :l_procedure_name' - into l_cnt using l_schema, l_package_name, l_procedure_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. return l_cnt = 1; @@ -327,12 +283,16 @@ create or replace package body ut_metadata as end; function get_object_name(a_full_object_name in varchar2) return varchar2 is - l_schema varchar2(250); - l_object varchar2(250); - l_procedure_name varchar2(250); + l_result varchar2(250); begin - ut_metadata.do_resolve(a_full_object_name,7,l_schema,l_object, l_procedure_name); - return l_object; + l_result := regexp_substr( + a_full_object_name, + '^([A-Za-z0-9$#_]+|".*?")\.([A-Za-z0-9$#_]+|".*?")', subexpression => 2 + ); + if not l_result like '"%"' then + l_result := upper(l_result); + end if; + return l_result; end; function get_anydata_compound_type(a_data_value anydata) return varchar2 is diff --git a/source/core/ut_metadata.pks b/source/core/ut_metadata.pks index 184943f2a..fdd984813 100644 --- a/source/core/ut_metadata.pks +++ b/source/core/ut_metadata.pks @@ -64,18 +64,6 @@ create or replace package ut_metadata authid current_user as function procedure_exists(a_owner_name varchar2, a_package_name in varchar2, a_procedure_name in varchar2) return boolean; - /** - * Resolves [owner.]object[.procedure] using dbms_utility.name_resolve and returns resolved parts - * - */ - procedure do_resolve(a_owner in out nocopy varchar2, a_object in out nocopy varchar2, a_procedure_name in out nocopy varchar2); - - /** - * Resolves single string [owner.]object[.procedure] using dbms_utility.name_resolve and returns parts [owner] [object] [procedure] - */ - procedure do_resolve(a_fully_qualified_name in varchar2,a_context in integer,a_owner out nocopy varchar2, - a_object out nocopy varchar2, a_procedure_name out nocopy varchar2); - /** * Return the text of the source line for a given object (body). It excludes package spec and type spec */ diff --git a/test/ut3_tester/core/annotations/test_before_after_annotations.pkb b/test/ut3_tester/core/annotations/test_before_after_annotations.pkb index 9ee917d84..e2f34e847 100644 --- a/test/ut3_tester/core/annotations/test_before_after_annotations.pkb +++ b/test/ut3_tester/core/annotations/test_before_after_annotations.pkb @@ -282,8 +282,7 @@ create or replace package body test_before_after_annotations is ); ut.expect(g_tests_results).to_match( '1\) beforetest_missing_procedure\s+' || - 'Call params for beforetest are not valid: procedure does not exist ' || - 'UT3_TESTER.DUMMY_BEFORE_AFTER_TEST.NON_EXISTENT_PROCEDURE' + 'Call params for beforetest are not valid: procedure UT3_TESTER\.DUMMY_BEFORE_AFTER_TEST\.NON_EXISTENT_PROCEDURE does not exist\.' ,'m' ); end; diff --git a/test/ut3_user/api/test_ut_run.pkb b/test/ut3_user/api/test_ut_run.pkb index e59571723..3fb2fbfec 100644 --- a/test/ut3_user/api/test_ut_run.pkb +++ b/test/ut3_user/api/test_ut_run.pkb @@ -1,5 +1,7 @@ create or replace package body test_ut_run is + g_owner varchar2(250) := sys_context('userenv', 'current_schema'); + procedure clear_expectations is begin ut3_tester_helper.main_helper.clear_expectations(); @@ -576,7 +578,7 @@ Failures:% select * bulk collect into l_results from table(ut3.ut.run('failing_invalid_spec')); l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); - ut.expect(l_actual).to_be_like('%Call params for % are not valid: package does not exist or is invalid: %FAILING_INVALID_SPEC%'); + ut.expect(l_actual).to_be_like('%Call params for % are not valid: package %FAILING_INVALID_SPEC% does not exist or is invalid.%'); end; @@ -739,6 +741,40 @@ Failures:% end loop; end; + procedure run_schema_name_test is + l_results ut3.ut_varchar2_list; + l_expected clob; + begin + select * bulk collect into l_results + from table ( ut3.ut.run( g_owner||'.'||g_owner ) ); + l_expected := '%1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)%'; + ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_results) ).to_be_like( l_expected ); + end; + + procedure create_schema_name_package is + pragma autonomous_transaction; + begin + execute immediate ' + create or replace package '||g_owner||'.'||g_owner||' as + --%suite + + --%test + procedure sample_test; + end;'; + + execute immediate ' + create or replace package body '||g_owner||'.'||g_owner||' as + procedure sample_test is begin ut.expect(1).to_equal(1); end; + end;'; + + end; + + procedure drop_schema_name_package is + pragma autonomous_transaction; + begin + execute immediate 'drop package '||g_owner||'.'||g_owner; + end; + procedure run_with_random_order is l_random_results ut3.ut_varchar2_list; l_results ut3.ut_varchar2_list; diff --git a/test/ut3_user/api/test_ut_run.pks b/test/ut3_user/api/test_ut_run.pks index 4616763d0..406c70b09 100644 --- a/test/ut3_user/api/test_ut_run.pks +++ b/test/ut3_user/api/test_ut_run.pks @@ -85,6 +85,7 @@ create or replace package test_ut_run is --%context(ut_run_function) + --%displayname(ut.run() function options) --%beforeall(create_ut3$user#_tests) --%afterall(drop_ut3$user#_tests) @@ -145,9 +146,18 @@ create or replace package test_ut_run is procedure run_and_report_warnings; procedure create_bad_annot; procedure drop_bad_annot; + + --%test(Can run test package that is named the same as schema name) + --%beforetest(create_schema_name_package) + --%aftertest(drop_schema_name_package) + procedure run_schema_name_test; + procedure create_schema_name_package; + procedure drop_schema_name_package; + --%endcontext --%context(random_order) + --%displayname(Random test execution order) --%beforeall(create_ut3$user#_tests) --%afterall(drop_ut3$user#_tests) @@ -164,6 +174,7 @@ create or replace package test_ut_run is --%endcontext --%context(run with tags) + --%displayname(Call ut.run with #tags) --%beforeall(create_ut3$user#_tests) --%afterall(drop_ut3$user#_tests) From e0d6768ea76f6134ce1bafeac6bce410b8d235b5 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Jun 2019 13:26:22 +0100 Subject: [PATCH 169/181] Fixed issue with parsing by trigger when source contains leading comments. --- source/core/annotations/ut_annotation_manager.pkb | 3 ++- .../core/annotations/test_annotation_manager.pkb | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 70abafef7..3a6c5c950 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -267,10 +267,11 @@ create or replace package body ut_annotation_manager as l_sql_text ora_name_list_t := a_sql_text; begin if a_parts > 0 then - l_sql_text(1) := regexp_replace(l_sql_text(1),'^\s*create(\s+or\s+replace){0,1}(\s+(editionable|noneditionable)){0,1}\s+{0,1}', modifier => 'i'); for i in 1..a_parts loop ut_utils.append_to_clob(l_sql_clob, l_sql_text(i)); end loop; + l_sql_clob := ut3.ut_utils.replace_multiline_comments(l_sql_clob); + l_sql_clob := regexp_replace(l_sql_clob, '^(.*?[^-]{2,}\s*create(\s+or\s+replace){0,1}(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni'); l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) ); end if; open l_result for diff --git a/test/ut3_tester/core/annotations/test_annotation_manager.pkb b/test/ut3_tester/core/annotations/test_annotation_manager.pkb index 4778117c5..e64adc861 100644 --- a/test/ut3_tester/core/annotations/test_annotation_manager.pkb +++ b/test/ut3_tester/core/annotations/test_annotation_manager.pkb @@ -39,10 +39,19 @@ create or replace package body test_annotation_manager is procedure create_dummy_test_package is pragma autonomous_transaction; begin - execute immediate q'[create or replace package dummy_test_package as + execute immediate q'[ + /* + * Some multiline comments before package spec + create or replace package dummy_test_package dummy comment to prove that we pick the right piece of code + */ + -- create or replace package dummy_test_package dummy comment to prove that we pick the right piece of code + --Some single-line comment before package spec + create or replace package dummy_test_package as --%suite(dummy_test_suite) --%rollback(manual) + --create or replace package dummy_test_package dummy comment to prove that we pick the right piece of code + --%test(dummy_test) --%beforetest(some_procedure) procedure some_dummy_test_procedure; @@ -142,9 +151,9 @@ create or replace package body test_annotation_manager is from dual union all select 3, 'rollback' , 'manual', '' as subobject_name from dual union all - select 5, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name + select 7, 'test' , 'dummy_test', 'some_dummy_test_procedure' as subobject_name from dual union all - select 6, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name + select 8, 'beforetest' , 'some_procedure', 'some_dummy_test_procedure' as subobject_name from dual; ut.expect(l_actual).to_equal(l_expected); From 69c2393248625b1f90aed4bba073003c3d954d6b Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Jun 2019 13:44:34 +0100 Subject: [PATCH 170/181] Fixed typo. --- source/core/annotations/ut_annotation_manager.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 3a6c5c950..b5d12187b 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -270,7 +270,7 @@ create or replace package body ut_annotation_manager as for i in 1..a_parts loop ut_utils.append_to_clob(l_sql_clob, l_sql_text(i)); end loop; - l_sql_clob := ut3.ut_utils.replace_multiline_comments(l_sql_clob); + l_sql_clob := ut_utils.replace_multiline_comments(l_sql_clob); l_sql_clob := regexp_replace(l_sql_clob, '^(.*?[^-]{2,}\s*create(\s+or\s+replace){0,1}(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni'); l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) ); end if; From a0e98ed19f15217b57e5eba575be15e86b812921 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Jun 2019 19:39:35 +0100 Subject: [PATCH 171/181] Improved time needed for clob-to-table conversion. Timing before change (with dbms_lob.read): `clob_to_table - Took:+000000000 00:00:00.012957000` After change: `clob_to_table - Took:+000000000 00:00:00.001236000` Speed improved by order of magnitude. --- source/core/ut_utils.pkb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 3b6a09ddf..44fab2ad8 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -241,7 +241,9 @@ create or replace package body ut_utils is begin while l_offset <= l_length loop l_amount := a_max_amount - coalesce( length(l_last_line), 0 ); - dbms_lob.read(a_clob, l_amount, l_offset, l_buffer); +-- dbms_lob.read(a_clob, l_amount, l_offset, l_buffer); + l_buffer := substr(a_clob, l_offset, l_amount); + l_amount := length(l_buffer); l_offset := l_offset + l_amount; l_string_results := string_to_table( l_last_line || l_buffer, a_delimiter, l_skip_leading_delimiter ); From 8defe567d102c6d92ee56eb3be4263de8e984e61 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Jun 2019 19:42:19 +0100 Subject: [PATCH 172/181] Resolved issues with regex for DDL trigger processing. --- source/core/annotations/ut_annotation_manager.pkb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index b5d12187b..8ab115856 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -264,14 +264,17 @@ create or replace package body ut_annotation_manager as l_sql_clob clob; l_sql_lines ut_varchar2_rows := ut_varchar2_rows(); l_result sys_refcursor; - l_sql_text ora_name_list_t := a_sql_text; begin if a_parts > 0 then for i in 1..a_parts loop - ut_utils.append_to_clob(l_sql_clob, l_sql_text(i)); + ut_utils.append_to_clob(l_sql_clob, a_sql_text(i)); end loop; l_sql_clob := ut_utils.replace_multiline_comments(l_sql_clob); - l_sql_clob := regexp_replace(l_sql_clob, '^(.*?[^-]{2,}\s*create(\s+or\s+replace){0,1}(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni'); + -- replace comment lines that contain "-- create or replace" + l_sql_clob := regexp_replace(l_sql_clob, '^.*[-]{2,}\s*create(\s+or\s+replace).*$', modiafier => 'mi'); + -- remove the "create [or replace] [[non]editionable] " so that we have only "type|package" for parsing + -- needed for dbms_preprocessor + l_sql_clob := regexp_replace(l_sql_clob, '^(.*?\s*create(\s+or\s+replace)?(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni'); l_sql_lines := ut_utils.convert_collection( ut_utils.clob_to_table(l_sql_clob) ); end if; open l_result for From 4014b1fc10dc009d0f02f4d93559dbf92577cae6 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Jun 2019 19:52:07 +0100 Subject: [PATCH 173/181] Adressed review comment. --- source/core/ut_metadata.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/core/ut_metadata.pkb b/source/core/ut_metadata.pkb index 30262533a..0e8a8b79b 100644 --- a/source/core/ut_metadata.pkb +++ b/source/core/ut_metadata.pkb @@ -292,7 +292,7 @@ create or replace package body ut_metadata as if not l_result like '"%"' then l_result := upper(l_result); end if; - return l_result; + return sys.dbms_assert.qualified_sql_name(l_result); end; function get_anydata_compound_type(a_data_value anydata) return varchar2 is From 780cfc0c535afc5ad599509ffaaea7c7dc534066 Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Sun, 16 Jun 2019 19:59:25 +0100 Subject: [PATCH 174/181] Fixed typo. --- source/core/annotations/ut_annotation_manager.pkb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 8ab115856..013e271c1 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -271,7 +271,7 @@ create or replace package body ut_annotation_manager as end loop; l_sql_clob := ut_utils.replace_multiline_comments(l_sql_clob); -- replace comment lines that contain "-- create or replace" - l_sql_clob := regexp_replace(l_sql_clob, '^.*[-]{2,}\s*create(\s+or\s+replace).*$', modiafier => 'mi'); + 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 l_sql_clob := regexp_replace(l_sql_clob, '^(.*?\s*create(\s+or\s+replace)?(\s+(editionable|noneditionable))?\s+?)((package|type).*)', '\5', 1, 1, 'ni'); From 8fd5eb9bd3b2302f4cee1f68e6b4af9c9d665643 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Mon, 17 Jun 2019 00:29:30 +0000 Subject: [PATCH 175/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 5bd515ed4..10e9010a7 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index cb71fd4c9..3e8ddd05e 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index aaf801028..e63ef745c 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index fcb71d47b..dadcf1d2e 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 5995bd8a0..78c83e60f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 4a6ad6bce..25d4904d8 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index da59f8890..3caa695a5 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index c45165428..7f1a75ef4 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index f446e86d5..30559a9a0 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index a59828be9..365a5af4e 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index fac7c7c80..3e2b661a9 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 23b5925d3..86c90f5d2 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 30e8b847f..e1be8e08b 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index 8813cab2e..e389c686a 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 56375da73..a3ed48e07 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index eef920780..d9badd832 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index f363ddc80..bb423fef1 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3051--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 3b6a09ddf..881609888 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -773,7 +773,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.3051-develop + * secion v3.1.7.3073-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 41090accc..39bfafe56 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.3051-develop'; + gc_version constant varchar2(50) := 'v3.1.7.3073-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 1205ff47325f80c63c867adefa93a85e0722811d Mon Sep 17 00:00:00 2001 From: Travis CI Date: Mon, 17 Jun 2019 07:05:37 +0000 Subject: [PATCH 176/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 10e9010a7..0d2b9fd52 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 3e8ddd05e..2d7028ca6 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index e63ef745c..dba1d530e 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index dadcf1d2e..e5fa75bb1 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 78c83e60f..974c195dc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 25d4904d8..8851f8c58 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 3caa695a5..0336b3429 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 7f1a75ef4..59618289d 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index 30559a9a0..a7ff66cb2 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 365a5af4e..765876c1f 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 3e2b661a9..4c3f50715 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 86c90f5d2..94b570355 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index e1be8e08b..fc6344875 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index e389c686a..b3a08cba8 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index a3ed48e07..05ca5765b 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index d9badd832..be8a324ac 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index bb423fef1..ee5e17acd 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3073--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 576b8ce7a..ad547de5f 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -775,7 +775,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.3073-develop + * secion v3.1.7.3076-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 39bfafe56..ec5790961 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.3073-develop'; + gc_version constant varchar2(50) := 'v3.1.7.3076-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From ba2e765fd989ef0b7b6a7b0847eb7a17d25605f8 Mon Sep 17 00:00:00 2001 From: Lukasz Date: Mon, 17 Jun 2019 18:36:31 +0100 Subject: [PATCH 177/181] Feature/json object (#928) * Initial checkin. General skelet of code * Adding json tree parsing. Enabling 12.2 * Update tests. Update sonar rules. * small fixes * PHASE 2: Moving diff into temp table and init data compare during compare implementation to avoid finding same differences twice Adding have count and negated have count matcher.l * Added more complex tests. Added test when extract a piece from two different jsons. Small fixes to code on same hierarchy parent arrays * Update mddocs Fix to json traverse array when object is element of array, the element name is content of object which can be different order but same semantic content. * Fixing sonar * Switch to use supertype * PHASE3 : Adding a functionality for install in pre 12.2 * PHASE3 : Adding a functionality for install in pre 12.2 * PHASE3 : Adding a functionality for install in pre 12.2 * PHASE3 : Adding a functionality for install in pre 12.2 * PHASE3 : Adding a functionality for install in pre 12.2 * PHASE3 : Adding a functionality for install in pre 12.2 * update tests * Update set define off * Code cleanup * fix slash * Creating a dummy specs and removing conditional compilation for code cleanup * PR fixes. * Reverting development script changes. * Refactored JSON code. Changed formatting of JSON-diff output. Changed date formats. * Fixed install on Oracle < 12.2 --- docs/userguide/advanced_data_comparison.md | 5 +- docs/userguide/expectations.md | 247 ++- source/api/ut.pkb | 5 + source/api/ut.pks | 2 + source/core/ut_suite_manager.pkb | 2 +- source/core/ut_utils.pkb | 1 + .../create_synonyms_and_grants_for_public.sql | 2 + source/create_user_grants.sql | 1 + source/create_user_synonyms.sql | 1 + .../data_values/ut_compound_data_helper.pkb | 113 ++ .../data_values/ut_compound_data_helper.pks | 39 +- .../data_values/ut_data_value_json.tpb | 166 ++ .../data_values/ut_data_value_json.tps | 32 + .../data_values/ut_json_data_diff_tmp.sql | 27 + .../expectations/data_values/ut_json_leaf.tpb | 32 + .../expectations/data_values/ut_json_leaf.tps | 42 + .../data_values/ut_json_leaf_tab.tps | 19 + .../data_values/ut_json_tree_details.tpb | 207 +++ .../data_values/ut_json_tree_details.tps | 54 + source/expectations/json_objects_specs.sql | 70 + source/expectations/matchers/ut_equal.tpb | 22 +- source/expectations/matchers/ut_equal.tps | 1 + .../expectations/matchers/ut_have_count.tpb | 10 +- source/expectations/ut_expectation.tpb | 10 +- source/expectations/ut_expectation.tps | 2 + source/expectations/ut_expectation_json.tpb | 61 + source/expectations/ut_expectation_json.tps | 29 + source/install.sql | 13 + source/uninstall_objects.sql | 21 + test/install_ut3_user_tests.sql | 6 + .../expectations/test_expectations_json.pkb | 1609 +++++++++++++++++ .../expectations/test_expectations_json.pks | 79 + 32 files changed, 2898 insertions(+), 32 deletions(-) create mode 100644 source/expectations/data_values/ut_data_value_json.tpb create mode 100644 source/expectations/data_values/ut_data_value_json.tps create mode 100644 source/expectations/data_values/ut_json_data_diff_tmp.sql create mode 100644 source/expectations/data_values/ut_json_leaf.tpb create mode 100644 source/expectations/data_values/ut_json_leaf.tps create mode 100644 source/expectations/data_values/ut_json_leaf_tab.tps create mode 100644 source/expectations/data_values/ut_json_tree_details.tpb create mode 100644 source/expectations/data_values/ut_json_tree_details.tps create mode 100644 source/expectations/json_objects_specs.sql create mode 100644 source/expectations/ut_expectation_json.tpb create mode 100644 source/expectations/ut_expectation_json.tps create mode 100644 test/ut3_user/expectations/test_expectations_json.pkb create mode 100644 test/ut3_user/expectations/test_expectations_json.pks diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 8851f8c58..fe5615315 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -7,10 +7,11 @@ utPLSQL expectations incorporates advanced data comparison options when comparin - refcursor - object type - nested table and varray +- json data-types Advanced data-comparison options are available for the [`equal`](expectations.md#equal) and [`contain`](expectations.md#include--contain) matcher. -## Syntax +Syntax ``` ut.expect( a_actual {data-type} ).to_( equal( a_expected {data-type})[.extendend_option()[.extendend_option()[...]]]); @@ -503,3 +504,5 @@ Finished in .046193 seconds 1 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s) ``` + + diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 4c3f50715..fdd037420 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -319,7 +319,7 @@ end; ## have_count Unary matcher that validates if the provided dataset count is equal to expected value. -Can be used with `refcursor` or `table type` +Can be used with `refcursor` , `json`or `table type` Usage: ```sql @@ -1177,7 +1177,218 @@ Finished in .048181 seconds ``` + +# Comparing Json objects + +utPLSQL is capable of comparing json data-types on Oracle 12.2 and above. + +### Notes on comparison of json data + +- Json data can contain objects, scalar or arrays. +- During comparison of json objects the order doesn't matter. +- During comparison of json arrays the index of element is taken into account +- To compare json you have to make sure its type of `json_element_t` or its subtypes + + + +Some examples of using json data-types in matcher are : + +```sql +create or replace package test_expectations_json is + + --%suite(json expectations) + + --%test(Gives success for identical data) + procedure success_on_same_data; +end; +/ + +create or replace package body test_expectations_json is + + procedure success_on_same_data is + l_expected json_element_t; + l_actual json_element_t; + begin + -- Arrange + l_expected := json_element_t.parse(' +{ + "Actors":[ + { + "name":"Tom Cruise", + "age":56, + "Born At":"Syracuse, NY", + "Birthdate":"July 3, 1962", + "photo":"https://jsonformatter.org/img/tom-cruise.jpg", + "wife":null, + "weight":67.5, + "hasChildren":true, + "hasGreyHair":false, + "children":[ + "Suri", + "Isabella Jane", + "Connor" + ] + }, + { + "name":"Robert Downey Jr.", + "age":53, + "Born At":"New York City, NY", + "Birthdate":"April 4, 1965", + "photo":"https://jsonformatter.org/img/Robert-Downey-Jr.jpg", + "wife":"Susan Downey", + "weight":77.1, + "hasChildren":true, + "hasGreyHair":false, + "children":[ + "Indio Falconer", + "Avri Roel", + "Exton Elias" + ] + } + ] +}'); + + l_actual := json_element_t.parse(' +{ + "Actors":[ + { + "name":"Tom Cruise", + "age":56, + "Born At":"Syracuse, NY", + "Birthdate":"July 3, 1962", + "photo":"https://jsonformatter.org/img/tom-cruise.jpg", + "wife":null, + "weight":67.5, + "hasChildren":true, + "hasGreyHair":false, + "children":[ + "Suri", + "Isabella Jane", + "Connor" + ] + }, + { + "name":"Robert Downey Jr.", + "age":53, + "Born At":"New York City, NY", + "Birthdate":"April 4, 1965", + "photo":"https://jsonformatter.org/img/Robert-Downey-Jr.jpg", + "wife":"Susan Downey", + "weight":77.1, + "hasChildren":true, + "hasGreyHair":false, + "children":[ + "Indio Falconer", + "Avri Roel", + "Exton Elias" + ] + } + ] +}'); + + ut3.ut.expect( l_actual ).to_equal( l_actual ); + + end; +end; +/ +``` + +It is possible to use a PL/SQL to extract a piece of JSON and compare it as follow + +```sql +create or replace package test_expectations_json is + + --%suite(json expectations) + + --%test(Gives success for identical pieces of two different jsons) + procedure to_diff_json_extract_same; + +end; +/ + +create or replace package body test_expectations_json is + + procedure to_diff_json_extract_same as + l_expected json_object_t; + l_actual json_object_t; + l_array_actual json_array_t; + l_array_expected json_array_t; + begin + -- Arrange + l_expected := json_object_t.parse(' { + "Actors": [ + { + "name": "Tom Cruise", + "age": 56, + "Born At": "Syracuse, NY", + "Birthdate": "July 3, 1962", + "photo": "https://jsonformatter.org/img/tom-cruise.jpg", + "wife": null, + "weight": 67.5, + "hasChildren": true, + "hasGreyHair": false, + "children": [ + "Suri", + "Isabella Jane", + "Connor" + ] + }, + { + "name": "Robert Downey Jr.", + "age": 53, + "Born At": "New York City, NY", + "Birthdate": "April 4, 1965", + "photo": "https://jsonformatter.org/img/Robert-Downey-Jr.jpg", + "wife": "Susan Downey", + "weight": 77.1, + "hasChildren": true, + "hasGreyHair": false, + "children": [ + "Indio Falconer", + "Avri Roel", + "Exton Elias" + ] + } + ] + }' + ); + + l_actual := json_object_t.parse(' { + "Actors": + { + "name": "Krzystof Jarzyna", + "age": 53, + "Born At": "Szczecin", + "Birthdate": "April 4, 1965", + "photo": "niewidzialny", + "wife": "Susan Downey", + "children": [ + "Indio Falconer", + "Avri Roel", + "Exton Elias" + ] + } + }' + ); + + l_array_actual := json_array_t(json_query(l_actual.stringify,'$.Actors.children')); + l_array_expected := json_array_t(json_query(l_expected.stringify,'$.Actors[1].children')); + --Act + ut3.ut.expect(l_array_actual).to_equal(l_array_expected); + + end; +end; +/ +``` + + + + + + + # Negating a matcher + Expectations provide a very convenient way to perform a check on a negated matcher. Syntax to check for matcher evaluating to true: @@ -1211,21 +1422,21 @@ Since NULL is neither *true* nor *false*, both expectations will report failure. The matrix below illustrates the data types supported by different matchers. -| Matcher | blob | boolean | clob | date | number | timestamp | timestamp
with
timezone | timestamp
with
local
timezone | varchar2 | interval
year
to
month | interval
day
to
second | cursor | nested
table
/ varray | object | -| :---------------------- | :--: | :-----: | :--: | :--: | :----: | :-------: | :---------------------------: | :------------------------------------: | :------: | :-----------------------------: | :-----------------------------: | :----: | :-------------------------: | :----: | -| **be_not_null** | X | X | X | X | X | X | X | X | X | X | X | X | X | X | -| **be_null** | X | X | X | X | X | X | X | X | X | X | X | X | X | X | -| **be_false** | | X | | | | | | | | | | | | | -| **be_true** | | X | | | | | | | | | | | | | -| **be_greater_than** | | | | X | X | X | X | X | | X | X | | | | -| **be_greater_or_equal** | | | | X | X | X | X | X | | X | X | | | | -| **be_less_or_equal** | | | | X | X | X | X | X | | X | X | | | | -| **be_less_than** | | | | X | X | X | X | X | | X | X | | | | -| **be_between** | | | | X | X | X | X | X | X | X | X | | | | -| **equal** | X | X | X | X | X | X | X | X | X | X | X | X | X | X | -| **contain** | | | | | | | | | | | | X | X | X | -| **match** | | | X | | | | | | X | | | | | | -| **be_like** | | | X | | | | | | X | | | | | | -| **be_empty** | X | | X | | | | | | | | | X | X | | -| **have_count** | | | | | | | | | | | | X | X | | +| Matcher | blob | boolean | clob | date | number | timestamp | timestamp
with
timezone | timestamp
with
local
timezone | varchar2 | interval
year
to
month | interval
day
to
second | cursor | nested
table
/ varray | object | json | +| :---------------------: | :--: | :-----: | :--: | :--: | :----: | :-------: | :---------------------------: | :------------------------------------: | :------: | :-----------------------------: | :-----------------------------: | :----: | :-------------------------: | :----: | :--: | +| **be_not_null** | X | X | X | X | X | X | X | X | X | X | X | X | X | X | X | +| **be_null** | X | X | X | X | X | X | X | X | X | X | X | X | X | X | X | +| **be_false** | | X | | | | | | | | | | | | | | +| **be_true** | | X | | | | | | | | | | | | | | +| **be_greater_than** | | | | X | X | X | X | X | | X | X | | | | | +| **be_greater_or_equal** | | | | X | X | X | X | X | | X | X | | | | | +| **be_less_or_equal** | | | | X | X | X | X | X | | X | X | | | | | +| **be_less_than** | | | | X | X | X | X | X | | X | X | | | | | +| **be_between** | | | | X | X | X | X | X | X | X | X | | | | | +| **equal** | X | X | X | X | X | X | X | X | X | X | X | X | X | X | X | +| **contain** | | | | | | | | | | | | X | X | X | | +| **match** | | | X | | | | | | X | | | | | | | +| **be_like** | | | X | | | | | | X | | | | | | | +| **be_empty** | X | | X | | | | | | | | | X | X | | X | +| **have_count** | | | | | | | | | | | | X | X | | X | diff --git a/source/api/ut.pkb b/source/api/ut.pkb index 1a95f0725..27d33835e 100644 --- a/source/api/ut.pkb +++ b/source/api/ut.pkb @@ -93,6 +93,11 @@ create or replace package body ut is 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 + return ut_expectation_json(ut_data_value_json(a_actual), a_message); + end; + procedure fail(a_message in varchar2) is begin ut_expectation_processor.report_failure(a_message); diff --git a/source/api/ut.pks b/source/api/ut.pks index 17b4a845e..5549a75c2 100644 --- a/source/api/ut.pks +++ b/source/api/ut.pks @@ -45,6 +45,8 @@ create or replace package ut authid current_user as function expect(a_actual in dsinterval_unconstrained, a_message varchar2 := null) return ut_expectation; + function expect(a_actual in json_element_t , a_message varchar2 := null) return ut_expectation_json; + procedure fail(a_message in varchar2); function run( diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 87121918c..21e070865 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -916,7 +916,7 @@ create or replace package body ut_suite_manager is where exists ( select 1 from ]'||l_ut_owner||q'[.ut_suite_cache c - where 1 = 1 ]'||case when can_skip_all_objects_scan(l_owner_name) then q'[ + where 1 = 1 ]'||case when not can_skip_all_objects_scan(l_owner_name) then q'[ and exists ( select 1 from all_objects a diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index ad547de5f..6b2adeb53 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -492,6 +492,7 @@ create or replace package body ut_utils is begin execute immediate 'delete from ut_compound_data_tmp'; execute immediate 'delete from ut_compound_data_diff_tmp'; + execute immediate 'delete from ut_json_data_diff_tmp'; end; function to_version(a_version_no varchar2) return t_version is diff --git a/source/create_synonyms_and_grants_for_public.sql b/source/create_synonyms_and_grants_for_public.sql index 609d78ccf..2cd553860 100644 --- a/source/create_synonyms_and_grants_for_public.sql +++ b/source/create_synonyms_and_grants_for_public.sql @@ -33,6 +33,7 @@ alter session set current_schema = &&ut3_owner; grant execute on &&ut3_owner..ut_expectation to public; grant execute on &&ut3_owner..ut_expectation_compound to public; +grant execute on &&ut3_owner..ut_expectation_json to public; grant execute on &&ut3_owner..ut_be_between to public; grant execute on &&ut3_owner..ut_be_empty to public; grant execute on &&ut3_owner..ut_be_false to public; @@ -113,6 +114,7 @@ prompt Creating synonyms for UTPLSQL objects in &&ut3_owner schema to PUBLIC create public synonym ut_expectation for &&ut3_owner..ut_expectation; create public synonym ut_expectation_compound for &&ut3_owner..ut_expectation_compound; +create public synonym ut_expectation_json for &&ut3_owner..ut_expectation_json; create public synonym be_between for &&ut3_owner..be_between; create public synonym be_empty for &&ut3_owner..be_empty; diff --git a/source/create_user_grants.sql b/source/create_user_grants.sql index 7aa5deb39..fe1d3da29 100644 --- a/source/create_user_grants.sql +++ b/source/create_user_grants.sql @@ -53,6 +53,7 @@ alter session set current_schema = &&ut3_owner; grant execute on &&ut3_owner..ut_expectation to &ut3_user; grant execute on &&ut3_owner..ut_expectation_compound to &ut3_user; +grant execute on &&ut3_owner..ut_expectation_json to &ut3_user; grant execute on &&ut3_owner..ut_be_between to &ut3_user; grant execute on &&ut3_owner..ut_be_empty to &ut3_user; diff --git a/source/create_user_synonyms.sql b/source/create_user_synonyms.sql index cb2f7ab67..8fd687181 100644 --- a/source/create_user_synonyms.sql +++ b/source/create_user_synonyms.sql @@ -55,6 +55,7 @@ prompt Creating synonyms for UTPLSQL objects in &&ut3_owner schema to user &&ut3 create or replace synonym &ut3_user..ut_expectation for &&ut3_owner..ut_expectation; create or replace synonym &ut3_user..ut_expectation_compound for &&ut3_owner..ut_expectation_compound; +create or replace synonym &ut3_user..ut_expectation_json for &&ut3_owner..ut_expectation_json; create or replace synonym &ut3_user..be_between for &&ut3_owner..be_between; create or replace synonym &ut3_user..be_empty for &&ut3_owner..be_empty; diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 1d5686f03..2a2ce9d9e 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -635,6 +635,119 @@ create or replace package body ut_compound_data_helper is 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 + l_result_diff tt_json_diff_tab := tt_json_diff_tab(); + begin + + 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) ; + 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 + l_diffs tt_json_diff_tab := compare_json_data(a_act_json_data,a_exp_json_data); + begin + forall i in 1..l_diffs.count + 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 + ); + + return l_diffs.count; + end; + + function get_json_diffs_type(a_diffs_all tt_json_diff_tab) return tt_json_diff_type_tab is + l_diffs_summary tt_json_diff_type_tab := tt_json_diff_type_tab(); + begin + select d.difference_type,count(1) + bulk collect into l_diffs_summary + from table(a_diffs_all) d + group by d.difference_type; + + 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 + 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; + + return l_diffs; + end; + begin g_anytype_name_map(dbms_types.typecode_date) := 'DATE'; g_anytype_name_map(dbms_types.typecode_number) := 'NUMBER'; diff --git a/source/expectations/data_values/ut_compound_data_helper.pks b/source/expectations/data_values/ut_compound_data_helper.pks index 1c00d2263..c6b6507fc 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pks +++ b/source/expectations/data_values/ut_compound_data_helper.pks @@ -19,6 +19,11 @@ create or replace package ut_compound_data_helper authid definer is gc_compare_unordered constant varchar2(10):='unordered'; gc_compare_normal constant varchar2(10):='normal'; + gc_json_missing constant varchar2(30) := 'missing properties'; + gc_json_type constant varchar2(30) := 'incorrect types'; + gc_json_notequal constant varchar2(30) := 'unequal values'; + gc_json_unknown constant varchar2(30) := 'unknown'; + type t_column_diffs is record( diff_type varchar2(1), expected_name varchar2(250), @@ -50,7 +55,30 @@ create or replace package ut_compound_data_helper authid definer is ); type t_diff_tab is table of t_diff_rec; - + + type t_json_diff_rec is record ( + difference_type varchar2(50), + act_element_name varchar2(4000), + act_element_value varchar2(4000), + act_json_type varchar2(4000), + act_access_path varchar2(4000), + act_parent_path varchar2(4000), + exp_element_name varchar2(4000), + exp_element_value varchar2(4000), + exp_json_type varchar2(4000), + exp_access_path varchar2(4000), + exp_parent_path varchar2(4000) + ); + + type tt_json_diff_tab is table of t_json_diff_rec; + + type t_json_diff_type_rec is record ( + difference_type varchar2(50), + no_of_occurence integer + ); + + type tt_json_diff_type_tab is table of t_json_diff_type_rec; + 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; @@ -99,5 +127,14 @@ create or replace package ut_compound_data_helper authid definer is */ function type_no_length ( a_type_name varchar2) return boolean; + 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; + + 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; + + function get_json_diffs_tmp(a_diff_id raw) return tt_json_diff_tab; + + + function get_json_diffs_type(a_diffs_all tt_json_diff_tab) return tt_json_diff_type_tab; + end; / diff --git a/source/expectations/data_values/ut_data_value_json.tpb b/source/expectations/data_values/ut_data_value_json.tpb new file mode 100644 index 000000000..ee761b141 --- /dev/null +++ b/source/expectations/data_values/ut_data_value_json.tpb @@ -0,0 +1,166 @@ +create or replace type body ut_data_value_json as + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + member procedure init (self in out nocopy ut_data_value_json, a_value json_element_t) is + begin + self.is_data_null := case when a_value is null then 1 else 0 end; + self.data_value := case when a_value is null then null else a_value.to_clob end; + self.self_type := $$plsql_unit; + self.data_type := 'json'; + self.json_tree := ut_json_tree_details(a_value); + 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 + init(a_value); + return; + end; + + overriding member function is_null return boolean is + begin + return (ut_utils.int_to_boolean(self.is_data_null)); + end; + + overriding member function is_empty return boolean is + begin + return self.data_value = '{}'; + end; + + overriding member function to_string return varchar2 is + begin + 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; + l_results ut_utils.t_clob_tab := ut_utils.t_clob_tab(); + l_result_string varchar2(32767); + l_other ut_data_value_json; + l_self ut_data_value_json := self; + l_diff_id ut_compound_data_helper.t_hash; + 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 ut_compound_data_helper.tt_json_diff_tab) return clob is + l_diff_summary ut_compound_data_helper.tt_json_diff_type_tab := ut_compound_data_helper.get_json_diffs_type(a_diff); + l_message_list ut_varchar2_list := ut_varchar2_list(); + begin + for i in 1..l_diff_summary.count loop + l_message_list.extend; + l_message_list(l_message_list.last) := l_diff_summary(i).no_of_occurence||' '||l_diff_summary(i).difference_type; + end loop; + 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 + return + case + when a_json_diff.difference_type = ut_compound_data_helper.gc_json_missing + then + case + when a_json_diff.act_element_name is not null then q'[ Missing property: ]'||a_json_diff.act_element_name + 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 + case + 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'[']' + 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 + if not a_other is of (ut_data_value_json) then + raise value_error; + end if; + dbms_lob.createtemporary(l_result, true); + l_other := treat(a_other as ut_data_value_json); + l_diff_id := ut_compound_data_helper.get_hash(self.data_id||l_other.data_id); + + if not l_self.is_null and not l_other.is_null then + l_diffs := ut_compound_data_helper.get_json_diffs_tmp(l_diff_id); + + l_message := ' '||l_diffs.count|| ' differences found' || + case when l_diffs.count > c_max_rows then ', showing first '|| c_max_rows else null end||chr(10); + ut_utils.append_to_clob( l_result, l_message ); + l_message := get_diff_by_type(l_diffs)||chr(10); + ut_utils.append_to_clob( l_result, l_message ); + + for i in 1 .. least( c_max_rows, l_diffs.count ) loop + l_results.extend; + l_results(l_results.last) := get_json_diff_text(l_diffs(i)); + end loop; + ut_utils.append_to_clob(l_result, l_results); + + end if; + + + l_result_string := ut_utils.to_string(l_result,null); + dbms_lob.freetemporary(l_result); + return l_result_string; + end; + + overriding member function compare_implementation(a_other ut_data_value) return integer is + l_self ut_data_value_json := self; + l_other ut_data_value := a_other; + begin + 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_compound_data_helper.t_hash; + begin + if a_other is of (ut_data_value_json) then + l_other := treat(a_other as ut_data_value_json); + l_diff_id := ut_compound_data_helper.get_hash(self.data_id||l_other.data_id); + l_result := + case + 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; + return l_result; + end; + + member function get_elements_count return integer is + begin + return json_element_t.parse(self.data_value).get_size; + end; + + member function get_json_count_info return varchar2 is + begin + return self.data_type||' [ count = '||self.get_elements_count||' ]'; + end; + + overriding member function get_object_info return varchar2 is + begin + return self.data_type; + end; + +end; +/ diff --git a/source/expectations/data_values/ut_data_value_json.tps b/source/expectations/data_values/ut_data_value_json.tps new file mode 100644 index 000000000..50f721bf6 --- /dev/null +++ b/source/expectations/data_values/ut_data_value_json.tps @@ -0,0 +1,32 @@ +create or replace type ut_data_value_json under ut_compound_data_value( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + data_value clob, + json_tree ut_json_tree_details, + member procedure init (self in out nocopy ut_data_value_json, a_value json_element_t), + constructor function ut_data_value_json(self in out nocopy ut_data_value_json, a_value json_element_t) return self as result, + overriding member function is_null return boolean, + overriding member function is_empty return boolean, + overriding member function to_string return varchar2, + overriding member function diff( a_other ut_data_value, a_match_options ut_matcher_options ) return varchar2, + overriding member function compare_implementation(a_other ut_data_value) return integer, + member function compare_implementation(a_other ut_data_value,a_match_options ut_matcher_options) return integer, + member function get_elements_count return integer, + member function get_json_count_info return varchar2, + overriding member function get_object_info return varchar2 +) +/ diff --git a/source/expectations/data_values/ut_json_data_diff_tmp.sql b/source/expectations/data_values/ut_json_data_diff_tmp.sql new file mode 100644 index 000000000..08de6ccf8 --- /dev/null +++ b/source/expectations/data_values/ut_json_data_diff_tmp.sql @@ -0,0 +1,27 @@ +create global temporary table ut_json_data_diff_tmp( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + diff_id raw(128), + difference_type varchar2(250), + act_element_name varchar2(2000), + act_element_value varchar2(4000), + act_json_type varchar2(100), + act_access_path varchar2(4000), + act_parent_path varchar2(4000), + exp_element_name varchar2(2000), + exp_element_value varchar2(4000), + exp_json_type varchar2(2000), + exp_access_path varchar2(4000), + exp_parent_path varchar2(4000) +) on commit preserve rows; diff --git a/source/expectations/data_values/ut_json_leaf.tpb b/source/expectations/data_values/ut_json_leaf.tpb new file mode 100644 index 000000000..83f1009ef --- /dev/null +++ b/source/expectations/data_values/ut_json_leaf.tpb @@ -0,0 +1,32 @@ +create or replace 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 + self.element_name := a_element_name; + self.element_value := a_element_value; + self.parent_name := a_parent_name; + self.hierarchy_level := a_hierarchy_level; + self.access_path := a_access_path; + self.index_position := a_index_position; + self.json_type := a_json_type; + self.is_array_element := a_array_element; + self.parent_type := a_parent_type; + 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 + 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); + return; + end; + +end; +/ diff --git a/source/expectations/data_values/ut_json_leaf.tps b/source/expectations/data_values/ut_json_leaf.tps new file mode 100644 index 000000000..b283367a4 --- /dev/null +++ b/source/expectations/data_values/ut_json_leaf.tps @@ -0,0 +1,42 @@ +create or replace type ut_json_leaf authid current_user as object ( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + element_name varchar2(4000), + element_value varchar2(4000), + parent_name varchar2(4000), + access_path varchar2(4000), + tlength integer, + display_path varchar2(4000), + hierarchy_level integer, + index_position integer, + json_type varchar2(2000), + is_array_element integer, + parent_type varchar2(2000), + parent_path varchar2(4000), + + 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), + + 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 +) +/ diff --git a/source/expectations/data_values/ut_json_leaf_tab.tps b/source/expectations/data_values/ut_json_leaf_tab.tps new file mode 100644 index 000000000..50a247ad6 --- /dev/null +++ b/source/expectations/data_values/ut_json_leaf_tab.tps @@ -0,0 +1,19 @@ +create or replace type ut_json_leaf_tab as + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ +table of ut_json_leaf +/ \ No newline at end of file diff --git a/source/expectations/data_values/ut_json_tree_details.tpb b/source/expectations/data_values/ut_json_tree_details.tpb new file mode 100644 index 000000000..a333ea71c --- /dev/null +++ b/source/expectations/data_values/ut_json_tree_details.tpb @@ -0,0 +1,207 @@ +create or replace type body ut_json_tree_details as + + member function get_json_type(a_json_piece json_element_t) return varchar2 is + begin + return + case + when a_json_piece.is_object then 'object' + when a_json_piece.is_array then 'array' + when a_json_piece.is_string then 'string' + when a_json_piece.is_number then 'number' + when a_json_piece.is_boolean then 'boolean' + when a_json_piece.is_true then 'true' + when a_json_piece.is_false then 'false' + 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 + l_json_el := treat(a_json_piece as json_object_t).get(a_key); + case + when l_json_el.is_string then l_val := ut_utils.to_string(l_json_el.to_string(),null); + when l_json_el.is_number then l_val := ut_utils.to_string(l_json_el.to_number()); + 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()); + when l_json_el.is_date then l_val := ut_utils.to_string(l_json_el.to_date()); + when l_json_el.is_timestamp then l_val := ut_utils.to_string(l_json_el.to_date()); + else null; + end case; + 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 + l_json_el := treat(a_json_piece as json_array_t).get(a_key); + case + when l_json_el.is_string then l_val := ut_utils.to_string(l_json_el.to_string(),null); + when l_json_el.is_number then l_val := ut_utils.to_string(l_json_el.to_number()); + 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()); + when l_json_el.is_date then l_val := ut_utils.to_string(l_json_el.to_date()); + when l_json_el.is_timestamp then l_val := ut_utils.to_string(l_json_el.to_date()); + else null; + end case; + 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 + self.json_tree_info.extend; + 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; + 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 + l_keys := coalesce(l_object.get_keys,json_key_list()); + + for i in 1 .. l_keys.count loop + l_type := get_json_type(l_object.get(l_keys(i))); + l_name := '"'||l_keys(i)||'"'; + l_path := a_access_path||'.'||l_name; + + 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 + ); + case l_type + when 'array' then + traverse_array ( + treat (l_object.get (l_keys(i)) as json_array_t), + l_name, + a_hierarchy_level + 1, + l_path + ); + when 'object' then + traverse_object( + treat (l_object.get (l_keys(i)) as json_object_t), + l_name, + a_hierarchy_level+1, + l_path + ); + else + 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 + l_array := treat(a_json_piece as json_array_t); + + for i in 0 .. l_array.get_size - 1 loop + l_type := get_json_type(l_array.get(i)); + l_name := case when l_type = 'object' then l_type else l_array.get(i).stringify end; + l_path := a_access_path||'['||i||']'; + + 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 + ); + case l_type + when 'array' then + traverse_array ( + treat (l_array.get (i) as json_array_t), + l_name, + a_hierarchy_level + 1, + l_path + ); + when 'object' then + traverse_object( + treat (l_array.get (i) as json_object_t), + l_name, + a_hierarchy_level + 1, + l_path + ); + else + 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 + if a_json_doc.is_object then + traverse_object(treat (a_json_doc as json_object_t)); + elsif a_json_doc.is_array then + 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 + self.json_tree_info := ut_json_leaf_tab(); + if a_json_doc is not null then + init(a_json_doc,a_level_in); + end if; + return; + end; + +end; +/ diff --git a/source/expectations/data_values/ut_json_tree_details.tps b/source/expectations/data_values/ut_json_tree_details.tps new file mode 100644 index 000000000..8e04e8b83 --- /dev/null +++ b/source/expectations/data_values/ut_json_tree_details.tps @@ -0,0 +1,54 @@ +create or replace type ut_json_tree_details force as object ( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + json_tree_info ut_json_leaf_tab, + member function get_json_type(a_json_piece json_element_t) return varchar2, + member function get_json_value(a_json_piece json_element_t,a_key varchar2) return varchar2, + member function get_json_value(a_json_piece json_element_t,a_key integer) return varchar2, + 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 in varchar2, + a_parent_type in varchar2, + a_array_element integer := 0, + a_parent_path varchar2 + ), + 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 := '$' + ), + 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 := '$' + ), + member procedure init(self in out nocopy ut_json_tree_details,a_json_doc in json_element_t, a_level_in integer := 0), + 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 +) +/ diff --git a/source/expectations/json_objects_specs.sql b/source/expectations/json_objects_specs.sql new file mode 100644 index 000000000..c0d42e8fb --- /dev/null +++ b/source/expectations/json_objects_specs.sql @@ -0,0 +1,70 @@ +BEGIN + + $if dbms_db_version.version = 12 and dbms_db_version.release >= 2 or dbms_db_version.version > 12 $then + dbms_output.put_line('Object exists , dont install'); + $else + dbms_output.put_line('Installing json structures specs.'); + execute immediate q'[create or replace TYPE JSON_Element_T FORCE AUTHID CURRENT_USER AS OBJECT( + dummyobjt NUMBER, + STATIC FUNCTION parse(jsn VARCHAR2) RETURN JSON_Element_T, + STATIC FUNCTION parse(jsn CLOB) RETURN JSON_Element_T, + STATIC FUNCTION parse(jsn BLOB) RETURN JSON_Element_T, + MEMBER FUNCTION to_Clob RETURN CLOB, + MEMBER FUNCTION stringify RETURN VARCHAR2, + MEMBER FUNCTION is_Object RETURN BOOLEAN, + MEMBER FUNCTION is_Array RETURN BOOLEAN, + MEMBER FUNCTION is_Scalar RETURN BOOLEAN, + MEMBER FUNCTION is_String RETURN BOOLEAN, + MEMBER FUNCTION is_Number RETURN BOOLEAN, + MEMBER FUNCTION is_Boolean RETURN BOOLEAN, + MEMBER FUNCTION is_True RETURN BOOLEAN, + MEMBER FUNCTION is_False RETURN BOOLEAN, + MEMBER FUNCTION is_Null RETURN BOOLEAN, + MEMBER FUNCTION is_Date RETURN BOOLEAN, + MEMBER FUNCTION is_Timestamp RETURN BOOLEAN, + MEMBER FUNCTION to_string RETURN VARCHAR2, + MEMBER FUNCTION to_number RETURN NUMBER, + MEMBER FUNCTION to_boolean RETURN BOOLEAN, + MEMBER FUNCTION to_date RETURN VARCHAR2, + + MEMBER FUNCTION get_Size(self IN JSON_ELEMENT_T) RETURN NUMBER +) NOT FINAL NOT INSTANTIABLE;]'; + + execute immediate q'[create or replace TYPE JSON_KEY_LIST FORCE AS VARRAY(32767) OF VARCHAR2(4000);]'; + + execute immediate q'[create or replace TYPE JSON_Array_T FORCE AUTHID CURRENT_USER UNDER JSON_Element_T( + CONSTRUCTOR FUNCTION JSON_Array_T RETURN SELF AS RESULT, + MEMBER FUNCTION get(pos NUMBER) RETURN JSON_Element_T, + MEMBER FUNCTION get_String(pos NUMBER) RETURN VARCHAR2, + MEMBER FUNCTION get_Number(pos NUMBER) RETURN NUMBER, + MEMBER FUNCTION get_Boolean(pos NUMBER) RETURN BOOLEAN, + MEMBER FUNCTION get_Date(pos NUMBER) RETURN DATE, + MEMBER FUNCTION get_Timestamp(pos NUMBER) RETURN TIMESTAMP, + MEMBER FUNCTION get_Clob(pos NUMBER) RETURN CLOB, + MEMBER PROCEDURE get_Clob(pos NUMBER, c IN OUT NOCOPY CLOB), + MEMBER FUNCTION get_Blob(pos NUMBER) RETURN BLOB, + MEMBER PROCEDURE get_Blob(pos NUMBER, b IN OUT NOCOPY BLOB), + MEMBER FUNCTION get_Type(pos NUMBER) RETURN VARCHAR2 +) FINAL;]'; + + execute immediate q'[create or replace TYPE JSON_Object_T AUTHID CURRENT_USER UNDER JSON_Element_T( + CONSTRUCTOR FUNCTION JSON_Object_T RETURN SELF AS RESULT, + MEMBER FUNCTION get(key VARCHAR2) RETURN JSON_Element_T, + MEMBER FUNCTION get_Object(key VARCHAR2) RETURN JSON_OBJECT_T, + MEMBER FUNCTION get_Array(key VARCHAR2) RETURN JSON_ARRAY_T, + MEMBER FUNCTION get_String(key VARCHAR2) RETURN VARCHAR2, + MEMBER FUNCTION get_Number(key VARCHAR2) RETURN NUMBER, + MEMBER FUNCTION get_Boolean(key VARCHAR2) RETURN BOOLEAN, + MEMBER FUNCTION get_Date(key VARCHAR2) RETURN DATE, + MEMBER FUNCTION get_Timestamp(key VARCHAR2) RETURN TIMESTAMP, + MEMBER FUNCTION get_Clob(key VARCHAR2) RETURN CLOB, + MEMBER PROCEDURE get_Clob(key VARCHAR2, c IN OUT NOCOPY CLOB), + MEMBER FUNCTION get_Blob(key VARCHAR2) RETURN BLOB, + MEMBER PROCEDURE get_Blob(key VARCHAR2, b IN OUT NOCOPY BLOB), + MEMBER FUNCTION get_Type(key VARCHAR2) RETURN VARCHAR2, + MEMBER FUNCTION get_Keys RETURN JSON_KEY_LIST +) FINAL;]'; + $end + +END; +/ \ No newline at end of file diff --git a/source/expectations/matchers/ut_equal.tpb b/source/expectations/matchers/ut_equal.tpb index a666caaa3..9df566af7 100644 --- a/source/expectations/matchers/ut_equal.tpb +++ b/source/expectations/matchers/ut_equal.tpb @@ -152,6 +152,12 @@ create or replace type body ut_equal as 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 + init(ut_data_value_json(a_expected), a_nulls_are_equal); + return; + end; + member function include(a_items varchar2) return ut_equal is l_result ut_equal := self; begin @@ -237,17 +243,17 @@ create or replace type body ut_equal as l_result varchar2(32767); begin if self.expected.data_type = a_actual.data_type and self.expected.is_diffable then - if self.expected is of (ut_data_value_refcursor) then l_result := 'Actual: '||a_actual.get_object_info()||' '||self.description()||': '||self.expected.get_object_info() - || chr(10) || 'Diff:' || - treat(expected as ut_data_value_refcursor).diff( a_actual, options ); + || chr(10) || 'Diff:' || + case + when self.expected is of (ut_data_value_refcursor) then + treat(expected as ut_data_value_refcursor).diff( a_actual, options ) + when self.expected is of (ut_data_value_json) then + treat(expected as ut_data_value_json).diff( a_actual, options ) else - l_result := - 'Actual: '||a_actual.get_object_info()||' '||self.description()||': '||self.expected.get_object_info() - || chr(10) || 'Diff:' || - expected.diff( a_actual, options ); - end if; + expected.diff( a_actual, options ) + end; else l_result := (self as ut_matcher).failure_message(a_actual) || ': '|| self.expected.to_string_report(); end if; diff --git a/source/expectations/matchers/ut_equal.tps b/source/expectations/matchers/ut_equal.tps index 68997fbcc..6158a6fd3 100644 --- a/source/expectations/matchers/ut_equal.tps +++ b/source/expectations/matchers/ut_equal.tps @@ -41,6 +41,7 @@ create or replace type ut_equal force under ut_comparison_matcher( constructor function ut_equal(self in out nocopy ut_equal, a_expected varchar2, a_nulls_are_equal boolean := null) return self as result, constructor function ut_equal(self in out nocopy ut_equal, a_expected yminterval_unconstrained, a_nulls_are_equal boolean := null) return self as result, constructor function ut_equal(self in out nocopy ut_equal, a_expected dsinterval_unconstrained, a_nulls_are_equal boolean := null) return self as result, + 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, member function include(a_items varchar2) return ut_equal, member function include(a_items ut_varchar2_list) return ut_equal, member function exclude(a_items varchar2) return ut_equal, diff --git a/source/expectations/matchers/ut_have_count.tpb b/source/expectations/matchers/ut_have_count.tpb index 135a948d5..1cca8a228 100644 --- a/source/expectations/matchers/ut_have_count.tpb +++ b/source/expectations/matchers/ut_have_count.tpb @@ -28,6 +28,8 @@ create or replace type body ut_have_count as begin if a_actual is of(ut_data_value_refcursor) and ( treat (a_actual as ut_data_value_refcursor).compound_type != 'object') then l_result := ( self.expected = treat(a_actual as ut_data_value_refcursor).elements_count ); + elsif a_actual is of(ut_data_value_json) then + l_result := ( self.expected = treat(a_actual as ut_data_value_json).get_elements_count ); else l_result := (self as ut_matcher).run_matcher(a_actual); end if; @@ -36,12 +38,16 @@ create or replace type body ut_have_count as overriding member function failure_message(a_actual ut_data_value) return varchar2 is begin - return 'Actual: (' || a_actual.get_object_info()||') was expected to have [ count = '||ut_utils.to_string(self.expected)||' ]'; + 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 - return 'Actual: ' || a_actual.get_object_info()||' was expected not to have [ count = '||ut_utils.to_string(self.expected)||' ]'; + 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; diff --git a/source/expectations/ut_expectation.tpb b/source/expectations/ut_expectation.tpb index 54de82b47..a94dadbc7 100644 --- a/source/expectations/ut_expectation.tpb +++ b/source/expectations/ut_expectation.tpb @@ -186,6 +186,10 @@ create or replace type body ut_expectation as 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 + 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 @@ -288,6 +292,10 @@ create or replace type body ut_expectation as 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 @@ -700,6 +708,6 @@ create or replace type body ut_expectation as begin self.not_to( ut_contain(a_expected).negated() ); end; - + end; / diff --git a/source/expectations/ut_expectation.tps b/source/expectations/ut_expectation.tps index eae74202e..79d81f106 100644 --- a/source/expectations/ut_expectation.tps +++ b/source/expectations/ut_expectation.tps @@ -51,6 +51,7 @@ create or replace type ut_expectation authid current_user as object( member procedure to_equal(self in ut_expectation, a_expected varchar2, a_nulls_are_equal boolean := null), member procedure to_equal(self in ut_expectation, a_expected yminterval_unconstrained, a_nulls_are_equal boolean := null), member procedure to_equal(self in ut_expectation, a_expected dsinterval_unconstrained, a_nulls_are_equal boolean := null), + member procedure to_equal(self in ut_expectation, a_expected json_element_t, a_nulls_are_equal boolean := null), member procedure not_to_equal(self in ut_expectation, a_expected anydata, a_nulls_are_equal boolean := null), member procedure not_to_equal(self in ut_expectation, a_expected anydata, a_exclude varchar2, a_nulls_are_equal boolean := null), @@ -69,6 +70,7 @@ create or replace type ut_expectation authid current_user as object( member procedure not_to_equal(self in ut_expectation, a_expected varchar2, a_nulls_are_equal boolean := null), member procedure not_to_equal(self in ut_expectation, a_expected yminterval_unconstrained, a_nulls_are_equal boolean := null), member procedure not_to_equal(self in ut_expectation, a_expected dsinterval_unconstrained, a_nulls_are_equal boolean := null), + member procedure not_to_equal(self in ut_expectation, a_expected json_element_t, a_nulls_are_equal boolean := null), member procedure to_be_like(self in ut_expectation, a_mask in varchar2, a_escape_char in varchar2 := null), diff --git a/source/expectations/ut_expectation_json.tpb b/source/expectations/ut_expectation_json.tpb new file mode 100644 index 000000000..d015aa5f4 --- /dev/null +++ b/source/expectations/ut_expectation_json.tpb @@ -0,0 +1,61 @@ +create or replace type body ut_expectation_json as + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + constructor function ut_expectation_json(self in out nocopy ut_expectation_json, a_actual_data ut_data_value, a_description varchar2) return self as result is + begin + self.actual_data := a_actual_data; + self.description := a_description; + return; + end; + + member procedure to_be_empty(self in ut_expectation_json) is + begin + self.to_( ut_be_empty() ); + end; + + member procedure not_to_be_empty(self in ut_expectation_json) is + begin + self.not_to( ut_be_empty() ); + 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 + self.to_( ut_have_count(a_expected) ); + end; + + member procedure not_to_have_count(self in ut_expectation_json, a_expected integer) is + begin + self.not_to( ut_have_count(a_expected) ); + end; + +end; +/ diff --git a/source/expectations/ut_expectation_json.tps b/source/expectations/ut_expectation_json.tps new file mode 100644 index 000000000..d032d7851 --- /dev/null +++ b/source/expectations/ut_expectation_json.tps @@ -0,0 +1,29 @@ +create or replace type ut_expectation_json under ut_expectation( + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + matcher ut_matcher, + + 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, + + member procedure to_be_empty(self in ut_expectation_json), + member procedure not_to_be_empty(self in ut_expectation_json), + member function to_equal(a_expected json_element_t , a_nulls_are_equal boolean := null) return ut_expectation_json, + member function not_to_equal(a_expected json_element_t , a_nulls_are_equal boolean := null) return ut_expectation_json, + member procedure to_have_count(self in ut_expectation_json, a_expected integer), + member procedure not_to_have_count(self in ut_expectation_json, a_expected integer) +) +/ diff --git a/source/install.sql b/source/install.sql index e6ccf7d28..842172a5f 100644 --- a/source/install.sql +++ b/source/install.sql @@ -34,6 +34,7 @@ alter session set current_schema = &&ut3_owner; @@check_sys_grants.sql "'CREATE TYPE','CREATE VIEW','CREATE SYNONYM','CREATE SEQUENCE','CREATE PROCEDURE','CREATE TABLE'" --set define off + --dbms_output buffer cache table @@install_component.sql 'core/ut_dbms_output_cache.sql' @@ -84,6 +85,8 @@ alter session set current_schema = &&ut3_owner; @@install_component.sql 'core/types/ut_reporter_base.tps' @@install_component.sql 'core/types/ut_reporters.tps' + +@@install_component.sql 'expectations/json_objects_specs.sql' @@install_component.sql 'expectations/matchers/ut_matcher_options_items.tps' @@install_component.sql 'expectations/matchers/ut_matcher_options.tps' @@install_component.sql 'expectations/data_values/ut_data_value.tps' @@ -196,7 +199,11 @@ prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema --expectations and matchers @@install_component.sql 'expectations/data_values/ut_compound_data_tmp.sql' @@install_component.sql 'expectations/data_values/ut_compound_data_diff_tmp.sql' +@@install_component.sql 'expectations/data_values/ut_json_data_diff_tmp.sql' @@install_component.sql 'expectations/data_values/ut_compound_data_value.tps' +@@install_component.sql 'expectations/data_values/ut_json_leaf.tps' +@@install_component.sql 'expectations/data_values/ut_json_leaf_tab.tps' +@@install_component.sql 'expectations/data_values/ut_json_tree_details.tps' @@install_component.sql 'expectations/data_values/ut_cursor_column.tps' @@install_component.sql 'expectations/data_values/ut_cursor_column_tab.tps' @@install_component.sql 'expectations/data_values/ut_cursor_details.tps' @@ -215,6 +222,7 @@ prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema @@install_component.sql 'expectations/data_values/ut_data_value_yminterval.tps' @@install_component.sql 'expectations/data_values/ut_data_value_xmltype.tps' @@install_component.sql 'expectations/data_values/ut_compound_data_helper.pks' +@@install_component.sql 'expectations/data_values/ut_data_value_json.tps' @@install_component.sql 'expectations/matchers/ut_matcher.tps' @@install_component.sql 'expectations/matchers/ut_comparison_matcher.tps' @@install_component.sql 'expectations/matchers/ut_be_false.tps' @@ -233,9 +241,12 @@ prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema @@install_component.sql 'expectations/matchers/ut_be_empty.tps' @@install_component.sql 'expectations/matchers/ut_match.tps' @@install_component.sql 'expectations/ut_expectation.tps' +@@install_component.sql 'expectations/data_values/ut_json_leaf.tpb' +@@install_component.sql 'expectations/data_values/ut_json_tree_details.tpb' @@install_component.sql 'expectations/data_values/ut_cursor_column.tpb' @@install_component.sql 'expectations/data_values/ut_cursor_details.tpb' @@install_component.sql 'expectations/ut_expectation_compound.tps' +@@install_component.sql 'expectations/ut_expectation_json.tps' @@install_component.sql 'expectations/matchers/ut_matcher_options_items.tpb' @@install_component.sql 'expectations/matchers/ut_matcher_options.tpb' @@ -256,6 +267,7 @@ prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema @@install_component.sql 'expectations/data_values/ut_data_value_varchar2.tpb' @@install_component.sql 'expectations/data_values/ut_data_value_yminterval.tpb' @@install_component.sql 'expectations/data_values/ut_data_value_xmltype.tpb' +@@install_component.sql 'expectations/data_values/ut_data_value_json.tpb' @@install_component.sql 'expectations/matchers/ut_matcher.tpb' @@install_component.sql 'expectations/matchers/ut_comparison_matcher.tpb' @@install_component.sql 'expectations/matchers/ut_be_false.tpb' @@ -275,6 +287,7 @@ prompt Installing DBMSPLSQL Tables objects into &&ut3_owner schema @@install_component.sql 'expectations/matchers/ut_match.tpb' @@install_component.sql 'expectations/ut_expectation.tpb' @@install_component.sql 'expectations/ut_expectation_compound.tpb' +@@install_component.sql 'expectations/ut_expectation_json.tpb' @@install_component.sql 'expectations/data_values/ut_key_anyvalues.tpb' --core reporter diff --git a/source/uninstall_objects.sql b/source/uninstall_objects.sql index f34b964de..a7e6b947e 100644 --- a/source/uninstall_objects.sql +++ b/source/uninstall_objects.sql @@ -82,6 +82,8 @@ drop table ut_dbms_output_cache purge; drop type ut_expectation_compound force; +drop type ut_expectation_json force; + drop type ut_expectation force; drop package ut_expectation_processor; @@ -132,6 +134,8 @@ drop type ut_data_value_number force; drop type ut_data_value_refcursor force; +drop type ut_data_value_json force; + drop type ut_data_value_dsinterval force; drop type ut_data_value_date force; @@ -152,6 +156,12 @@ drop type ut_matcher_options force; drop type ut_matcher_options_items force; +drop type ut_json_tree_details force; + +drop type ut_json_leaf_tab force; + +drop type ut_json_leaf; + drop type ut_cursor_details force; drop type ut_cursor_column_tab force; @@ -162,6 +172,8 @@ drop table ut_compound_data_tmp purge; drop table ut_compound_data_diff_tmp purge; +drop table ut_json_data_diff_tmp; + drop trigger ut_trigger_annotation_parsing; drop package ut_annotation_manager; @@ -198,6 +210,15 @@ drop package ut_metadata; drop package ut_ansiconsole_helper; +begin + $if dbms_db_version.version = 12 and dbms_db_version.release = 1 or dbms_db_version.version < 12 $then + execute immediate 'drop type json_element_t force'; + $else + dbms_output.put_line('Nothing to drop'); + $end +end; +/ + drop package ut_utils; drop sequence ut_savepoint_seq; diff --git a/test/install_ut3_user_tests.sql b/test/install_ut3_user_tests.sql index 67014f815..b7361e4aa 100644 --- a/test/install_ut3_user_tests.sql +++ b/test/install_ut3_user_tests.sql @@ -23,6 +23,9 @@ prompt Install user tests @@ut3_user/expectations/test_matchers.pks @@ut3_user/expectations/test_expectation_anydata.pks @@ut3_user/expectations/test_expectations_cursor.pks +set define on +@@install_above_12_1.sql 'ut3_user/expectations/test_expectations_json.pks' +set define off @@ut3_user/api/test_ut_runner.pks @@ut3_user/api/test_ut_run.pks @@ut3_user/reporters.pks @@ -61,6 +64,9 @@ set define off @@ut3_user/expectations/test_matchers.pkb @@ut3_user/expectations/test_expectation_anydata.pkb @@ut3_user/expectations/test_expectations_cursor.pkb +set define on +@@install_above_12_1.sql 'ut3_user/expectations/test_expectations_json.pkb' +set define off @@ut3_user/api/test_ut_runner.pkb @@ut3_user/api/test_ut_run.pkb @@ut3_user/reporters.pkb diff --git a/test/ut3_user/expectations/test_expectations_json.pkb b/test/ut3_user/expectations/test_expectations_json.pkb new file mode 100644 index 000000000..6214d2237 --- /dev/null +++ b/test/ut3_user/expectations/test_expectations_json.pkb @@ -0,0 +1,1609 @@ +create or replace package body test_expectations_json is + + procedure cleanup_expectations is + begin + ut3_tester_helper.main_helper.clear_expectations( ); + end; + + procedure success_on_same_data + as + l_expected json_element_t; + l_actual json_element_t; + begin + -- Arrange + l_actual := json_element_t.parse(' { + "Actors": [ + { + "name": "Tom Cruise", + "age": 56, + "Born At": "Syracuse, NY", + "Birthdate": "July 3, 1962", + "photo": "https://jsonformatter.org/img/tom-cruise.jpg", + "wife": null, + "weight": 67.5, + "hasChildren": true, + "hasGreyHair": false, + "children": [ + "Suri", + "Isabella Jane", + "Connor" + ] + }, + { + "name": "Robert Downey Jr.", + "age": 53, + "Born At": "New York City, NY", + "Birthdate": "April 4, 1965", + "photo": "https://jsonformatter.org/img/Robert-Downey-Jr.jpg", + "wife": "Susan Downey", + "weight": 77.1, + "hasChildren": true, + "hasGreyHair": false, + "children": [ + "Indio Falconer", + "Avri Roel", + "Exton Elias" + ] + } + ] + }'); + + --Act + ut3.ut.expect( l_actual ).to_equal( l_actual ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_on_diff_data + as + l_expected json_element_t; + l_actual json_element_t; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_expected := json_element_t.parse('{"Aidan Gillen": {"array": ["Game of Thrones","The Wire"],"string": "some string","int": "2","otherint": 4, "aboolean": "true", "boolean": false,"object": {"foo": "bar"}},"Amy Ryan": ["In Treatment","The Wire"],"Annie Fitzgerald": ["True Blood","Big Love","The Sopranos","Oz"],"Anwan Glover": ["Treme","The Wire"],"Alexander Skarsg?rd": ["Generation Kill","True Blood"],"Alice Farmer": ["The Corner","Oz","The Wire"]}'); + l_actual := json_element_t.parse('{"Aidan Gillen": {"array": ["Game of Thron\"es","The Wire"],"string": "some string","int": 2,"aboolean": true, "boolean": true,"object": {"foo": "bar","object1": {"new prop1": "new prop value"},"object2": {"new prop1": "new prop value"},"object3": {"new prop1": "new prop value"},"object4": {"new prop1": "new prop value"}}},"Amy Ryan": {"one": "In Treatment","two": "The Wire"},"Annie Fitzgerald": ["Big Love","True Blood"],"Anwan Glover": ["Treme","The Wire"],"Alexander Skarsgard": ["Generation Kill","True Blood"], "Clarke Peters": null}'); + + --Act + ut3.ut.expect( l_actual ).to_equal( l_expected ); + --Assert + l_expected_message := q'[%Diff: 20 differences found +%3 incorrect types, 4 unequal values, 13 missing properties +%Missing property: "Alexander Skarsg?rd" on path: $ +%Extra property: "Alexander Skarsgard" on path: $ +%Missing property: "Alice Farmer" on path: $ +%Extra property: "Clarke Peters" on path: $ +%Extra property: "one" on path: $."Amy Ryan" +%Missing property: "The Sopranos" on path: $."Annie Fitzgerald"[2] +%Extra property: "two" on path: $."Amy Ryan" +%Missing property: "Oz" on path: $."Annie Fitzgerald"[3] +%Missing property: "otherint" on path: $."Aidan Gillen" +%Extra property: "object1" on path: $."Aidan Gillen"."object" +%Extra property: "object2" on path: $."Aidan Gillen"."object" +%Extra property: "object3" on path: $."Aidan Gillen"."object" +%Extra property: "object4" on path: $."Aidan Gillen"."object" +%Actual type: 'array' was expected to be: 'object' on path: $."Amy Ryan" +%Actual type: 'string' was expected to be: 'number' on path: $."Aidan Gillen"."int" +%Actual type: 'string' was expected to be: 'boolean' on path: $."Aidan Gillen"."aboolean" +%Actual value: "True Blood" was expected to be: "Big Love" on path: $."Annie Fitzgerald"[0] +%Actual value: "Big Love" was expected to be: "True Blood" on path: $."Annie Fitzgerald"[1] +%Actual value: FALSE was expected to be: TRUE on path: $."Aidan Gillen"."boolean" +%Actual value: "Game of Thrones" was expected to be: "Game of Thron\"es" on path: $."Aidan Gillen"."array"[0]%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure null_json_variable + as + l_expected json_object_t ; + begin + -- Arrange + l_expected := cast (null as json_object_t ); + + --Act + ut3.ut.expect( l_expected ).to_be_null; + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure not_null_json_variable + as + l_expected json_object_t ; + begin + -- Arrange + l_expected := json_object_t(); + + --Act + ut3.ut.expect( l_expected ).not_to_be_null; + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_null_json_var + as + l_expected json_object_t ; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_expected := json_object_t('{ "t" : "1" }'); + + --Act + ut3.ut.expect( l_expected ).to_be_null; + --Assert + l_expected_message := q'[%Actual: (json) +%'{"t":"1"}' +%was expected to be null%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure fail_not_null_json_var + as + l_expected json_object_t; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_expected := cast (null as json_object_t ); + + --Act + ut3.ut.expect( l_expected ).not_to_be_null; + --Assert + l_expected_message := q'[%Actual: NULL (json) was expected not to be null%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure empty_json + as + l_expected json_object_t; + begin + -- Arrange + l_expected := json_object_t(); + + --Act + ut3.ut.expect( l_expected ).to_be_empty; + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure not_empty_json + as + l_expected json_object_t; + begin + -- Arrange + l_expected := json_object_t.parse('{ "name" : "test" }'); + + --Act + ut3.ut.expect( l_expected ).not_to_be_empty; + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_empty_json + as + l_expected json_object_t; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_expected := json_object_t.parse('{ "name" : "test" }'); + + --Act + ut3.ut.expect( l_expected ).to_be_empty; + --Assert + l_expected_message := q'[%Actual: (json) +%'{"name":"test"}' +%was expected to be empty%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure fail_not_empty_json + as + l_expected json_object_t; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_expected := json_object_t(); + + --Act + ut3.ut.expect( l_expected ).not_to_be_empty; + --Assert + l_expected_message := q'[%Actual: (json) +%'{}' +%was expected not to be empty%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure to_have_count as + l_actual json_element_t; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_actual := json_element_t.parse('{"Aidan Gillen": {"array": ["Game of Thrones","The Wire"],"string": "some string","int": "2","otherint": 4, "aboolean": "true", "boolean": false,"object": {"foo": "bar"}},"Amy Ryan": ["In Treatment","The Wire"],"Annie Fitzgerald": ["True Blood","Big Love","The Sopranos","Oz"],"Anwan Glover": ["Treme","The Wire"],"Alexander Skarsg?rd": ["Generation Kill","True Blood"],"Alice Farmer": ["The Corner","Oz","The Wire"]}'); + + --Act + ut3.ut.expect( l_actual ).to_have_count( 6 ); + + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + + end; + + procedure fail_to_have_count + as + l_actual json_element_t; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_actual := json_element_t.parse('{"Aidan Gillen": {"array": ["Game of Thrones","The Wire"],"string": "some string","int": "2","otherint": 4, "aboolean": "true", "boolean": false,"object": {"foo": "bar"}},"Amy Ryan": ["In Treatment","The Wire"],"Annie Fitzgerald": ["True Blood","Big Love","The Sopranos","Oz"],"Anwan Glover": ["Treme","The Wire"],"Alexander Skarsg?rd": ["Generation Kill","True Blood"],"Alice Farmer": ["The Corner","Oz","The Wire"]}'); + + --Act + ut3.ut.expect( l_actual ).to_have_count( 2 ); + --Assert + l_expected_message := q'[%Actual: (json [ count = 6 ]) was expected to have [ count = 2 ]%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + + end; + + procedure not_to_have_count + as + l_actual json_element_t; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_actual := json_element_t.parse('{"Aidan Gillen": {"array": ["Game of Thrones","The Wire"],"string": "some string","int": "2","otherint": 4, "aboolean": "true", "boolean": false,"object": {"foo": "bar"}},"Amy Ryan": ["In Treatment","The Wire"],"Annie Fitzgerald": ["True Blood","Big Love","The Sopranos","Oz"],"Anwan Glover": ["Treme","The Wire"],"Alexander Skarsg?rd": ["Generation Kill","True Blood"],"Alice Farmer": ["The Corner","Oz","The Wire"]}'); + + --Act + ut3.ut.expect( l_actual ).not_to_have_count( 7 ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure fail_not_to_have_count + as + l_actual json_element_t; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_actual := json_element_t.parse('{"Aidan Gillen": {"array": ["Game of Thrones","The Wire"],"string": "some string","int": "2","otherint": 4, "aboolean": "true", "boolean": false,"object": {"foo": "bar"}},"Amy Ryan": ["In Treatment","The Wire"],"Annie Fitzgerald": ["True Blood","Big Love","The Sopranos","Oz"],"Anwan Glover": ["Treme","The Wire"],"Alexander Skarsg?rd": ["Generation Kill","True Blood"],"Alice Farmer": ["The Corner","Oz","The Wire"]}'); + + --Act + ut3.ut.expect( l_actual ).not_to_have_count( 6 ); + --Assert + l_expected_message := q'[%Actual: json [ count = 6 ] was expected not to have [ count = 6 ]%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure to_have_count_array + as + l_actual json_element_t; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_actual := json_element_t.parse('["Game of Thrones","The Wire"]'); + + --Act + ut3.ut.expect( l_actual ).to_have_count( 2 ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure to_diff_json_extract_same + as + l_expected json_object_t; + l_actual json_object_t; + BEGIN + -- Arrange + l_expected := json_object_t.parse(' { + "Actors": [ + { + "name": "Tom Cruise", + "age": 56, + "Born At": "Syracuse, NY", + "Birthdate": "July 3, 1962", + "photo": "https://jsonformatter.org/img/tom-cruise.jpg", + "wife": null, + "weight": 67.5, + "hasChildren": true, + "hasGreyHair": false, + "children": [ + "Suri", + "Isabella Jane", + "Connor" + ] + }, + { + "name": "Robert Downey Jr.", + "age": 53, + "Born At": "New York City, NY", + "Birthdate": "April 4, 1965", + "photo": "https://jsonformatter.org/img/Robert-Downey-Jr.jpg", + "wife": "Susan Downey", + "weight": 77.1, + "hasChildren": true, + "hasGreyHair": false, + "children": [ + "Indio Falconer", + "Avri Roel", + "Exton Elias" + ] + } + ] + }' + ); + l_actual := json_object_t.parse(' { + "Actors": + { + "name": "Krzystof Jarzyna", + "age": 53, + "Born At": "Szczecin", + "Birthdate": "April 4, 1965", + "photo": "niewidzialny", + "wife": "Susan Downey", + "children": [ + "Indio Falconer", + "Avri Roel", + "Exton Elias" + ] + } + }' + ); + + + --Act + ut3.ut.expect(json_array_t(json_query(l_actual.stringify,'$.Actors.children'))).to_equal(json_array_t(json_query(l_expected + .stringify,'$.Actors[1].children'))); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure to_diff_json_extract_diff + as + l_expected json_object_t; + l_actual json_object_t; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_expected := json_object_t.parse(' { + "Actors": [ + { + "name": "Tom Cruise", + "age": 56, + "Born At": "Syracuse, NY", + "Birthdate": "July 3, 1962", + "photo": "https://jsonformatter.org/img/tom-cruise.jpg", + "wife": null, + "weight": 67.5, + "hasChildren": true, + "hasGreyHair": false, + "children": [ + "Suri", + "Isabella Jane", + "Connor" + ] + }, + { + "name": "Robert Downey Jr.", + "age": 53, + "Born At": "New York City, NY", + "Birthdate": "April 4, 1965", + "photo": "https://jsonformatter.org/img/Robert-Downey-Jr.jpg", + "wife": "Susan Downey", + "weight": 77.1, + "hasChildren": true, + "hasGreyHair": false, + "children": [ + "Noemi", + "Avri Roel", + "Exton Elias" + ] + } + ] + }' + ); + l_actual := json_object_t.parse(' { + "Actors": + { + "name": "Krzystof Jarzyna", + "age": 53, + "Born At": "Szczecin", + "Birthdate": "April 4, 1965", + "photo": "niewidzialny", + "wife": "Susan Downey", + "children": [ + "Indio Falconer", + "Avri Roel", + "Exton Elias" + ] + } + }' + ); + + + --Act + ut3.ut.expect(json_array_t(json_query(l_actual.stringify,'$.Actors.children'))).to_equal(json_array_t(json_query(l_expected + .stringify,'$.Actors[1].children'))); + --Assert + l_expected_message := q'[%Actual: json was expected to equal: json +%Diff: 1 differences found +%1 unequal values +%Actual value: "Noemi" was expected to be: "Indio Falconer" on path: $[0]%]'; + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure long_json_test + as + l_actual json_element_t; + begin + l_actual := json_element_t.parse('[ + { + "_id": "5ce6dc0c3a11766d5a26f494", + "index": 0, + "guid": "a86b8b2d-216d-4061-bafa-f3820e41efbe", + "isActive": true, + "balance": "$1,754.93", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "green", + "name": "Pearlie Lott", + "gender": "female", + "company": "KOG", + "email": "pearlielott@kog.com", + "phone": "+1 (852) 567-2605", + "address": "357 Eldert Street, Benson, Montana, 5484", + "about": "Est officia consectetur reprehenderit fugiat culpa ea commodo aliqua deserunt enim eu. Exercitation adipisicing laboris nisi irure commodo dolor consectetur tempor minim sunt ullamco Lorem occaecat. Irure quis ut Lorem aliquip aute pariatur magna laboris duis veniam qui velit. Pariatur occaecat eu minim adipisicing est do. Occaecat do ipsum ut in enim quis voluptate et. Sit ea irure nulla culpa in eiusmod.\r\n", + "registered": "2018-08-24T12:46:31 -01:00", + "latitude": -22.323554, + "longitude": 139.071611, + "tags": [ + "id", + "do", + "amet", + "magna", + "est", + "veniam", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Tammi Lowe" + }, + { + "id": 1, + "name": "Simpson Miles" + }, + { + "id": 2, + "name": "Hogan Osborne" + } + ], + "greeting": "Hello, Pearlie Lott! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "5ce6dc0c2b56a6f3271fc272", + "index": 1, + "guid": "2a24b446-d11a-4a52-b6c8-86acba1dc65f", + "isActive": true, + "balance": "$1,176.58", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Bertha Mack", + "gender": "female", + "company": "AQUAFIRE", + "email": "berthamack@aquafire.com", + "phone": "+1 (804) 504-2151", + "address": "636 Bouck Court, Cresaptown, Vermont, 5203", + "about": "Ipsum est exercitation excepteur reprehenderit ipsum. Do velit dolore minim ad. Quis amet dolor dolore exercitation sint Lorem. Exercitation nulla magna ut incididunt enim veniam voluptate Lorem velit adipisicing sunt deserunt sunt aute. Ullamco id anim Lorem dolore do labore excepteur et reprehenderit sit adipisicing sunt esse veniam. Anim laborum labore labore incididunt in labore exercitation ad occaecat amet ea quis veniam ut.\r\n", + "registered": "2017-12-29T06:00:27 -00:00", + "latitude": 75.542572, + "longitude": 147.312705, + "tags": [ + "veniam", + "sunt", + "commodo", + "ad", + "enim", + "officia", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Riddle Williams" + }, + { + "id": 1, + "name": "Tracy Wagner" + }, + { + "id": 2, + "name": "Morrow Phillips" + } + ], + "greeting": "Hello, Bertha Mack! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "5ce6dc0c6d8631fbfdd2afc7", + "index": 2, + "guid": "66ca5411-4c88-4347-9972-e1016f628098", + "isActive": false, + "balance": "$2,732.22", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "blue", + "name": "Fox Morgan", + "gender": "male", + "company": "PERKLE", + "email": "foxmorgan@perkle.com", + "phone": "+1 (985) 401-3450", + "address": "801 Whitty Lane, Snyderville, Guam, 5253", + "about": "Ex officia eu Lorem velit ullamco qui cupidatat irure sunt ea ad deserunt. Officia est consequat aute labore occaecat aliquip. Velit commodo cillum incididunt cupidatat ad id veniam aute labore tempor qui culpa voluptate dolor. Occaecat in ea id labore exercitation non tempor occaecat laboris aute irure fugiat dolor mollit. Voluptate non proident officia deserunt ex et ullamco aute eiusmod cupidatat consequat elit id.\r\n", + "registered": "2015-04-02T06:40:53 -01:00", + "latitude": -27.612441, + "longitude": -134.005929, + "tags": [ + "occaecat", + "amet", + "eu", + "dolore", + "ad", + "fugiat", + "quis" + ], + "friends": [ + { + "id": 0, + "name": "Case Preston" + }, + { + "id": 1, + "name": "Pollard Dawson" + }, + { + "id": 2, + "name": "Frye Mann" + } + ], + "greeting": "Hello, Fox Morgan! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "5ce6dc0c0a7fea91e0a1fdf5", + "index": 3, + "guid": "f895a236-fc0d-4c08-b2f0-9d1638dc256d", + "isActive": true, + "balance": "$2,746.32", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Deleon Tucker", + "gender": "male", + "company": "ZANILLA", + "email": "deleontucker@zanilla.com", + "phone": "+1 (883) 415-2709", + "address": "540 Vandam Street, Chical, Wyoming, 5181", + "about": "Consectetur consectetur sint Lorem non id. Fugiat reprehenderit nulla dolore nisi culpa esse ea. Ad occaecat qui magna proident ex pariatur aliquip adipisicing do aute aute sunt. Aliqua aliqua et exercitation sunt ut adipisicing.\r\n", + "registered": "2017-10-08T09:05:49 -01:00", + "latitude": 34.893845, + "longitude": 110.699256, + "tags": [ + "culpa", + "sunt", + "sit", + "ut", + "eiusmod", + "laboris", + "ullamco" + ], + "friends": [ + { + "id": 0, + "name": "Bernadine Pennington" + }, + { + "id": 1, + "name": "Latoya Bradshaw" + }, + { + "id": 2, + "name": "Iva Caldwell" + } + ], + "greeting": "Hello, Deleon Tucker! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "5ce6dc0c18bc92716a12a8e4", + "index": 4, + "guid": "6ed45f42-1a2b-48b2-89ce-5fdb2505343b", + "isActive": true, + "balance": "$1,049.96", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "blue", + "name": "Schwartz Norman", + "gender": "male", + "company": "UPDAT", + "email": "schwartznorman@updat.com", + "phone": "+1 (826) 404-3309", + "address": "925 Harman Street, Cornucopia, Georgia, 5748", + "about": "Qui Lorem ullamco veniam irure aliquip amet exercitation. Velit nisi id laboris adipisicing in esse adipisicing commodo cillum do exercitation tempor. Consequat tempor dolor minim consequat minim ad do tempor excepteur.\r\n", + "registered": "2014-08-10T08:34:27 -01:00", + "latitude": 27.35547, + "longitude": -77.343791, + "tags": [ + "reprehenderit", + "nisi", + "duis", + "fugiat", + "id", + "non", + "laboris" + ], + "friends": [ + { + "id": 0, + "name": "Dora Combs" + }, + { + "id": 1, + "name": "Emerson Wade" + }, + { + "id": 2, + "name": "Alma Mccormick" + } + ], + "greeting": "Hello, Schwartz Norman! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "5ce6dc0cb7ae44eb76c3e5fd", + "index": 5, + "guid": "0516df27-73db-42a8-b2c3-d34bd976e031", + "isActive": false, + "balance": "$3,679.94", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Christi Oneal", + "gender": "female", + "company": "SUREPLEX", + "email": "christioneal@sureplex.com", + "phone": "+1 (985) 408-3098", + "address": "640 Fayette Street, Dennard, Washington, 7962", + "about": "Dolore fugiat sit non dolore nostrud mollit enim id sint culpa do reprehenderit ad. Velit occaecat incididunt nostrud aliqua incididunt do cillum occaecat laboris quis duis. Non tempor culpa aliquip est est consectetur ullamco elit. Voluptate et sit do et. Amet sit irure eu ex enim nulla anim deserunt ut. Sit aute ea ut fugiat eu tempor Lorem.\r\n", + "registered": "2015-05-10T09:24:56 -01:00", + "latitude": 43.343805, + "longitude": 79.535043, + "tags": [ + "occaecat", + "laboris", + "nulla", + "nisi", + "dolore", + "cillum", + "dolore" + ], + "friends": [ + { + "id": 0, + "name": "Marquez Wiggins" + }, + { + "id": 1, + "name": "Mai Fischer" + }, + { + "id": 2, + "name": "Newman Davenport" + } + ], + "greeting": "Hello, Christi Oneal! You have 8 unread messages.", + "favoriteFruit": "strawberry" + } +]'); + + --Act + ut3.ut.expect( l_actual ).to_equal( l_actual ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure json_same_diffrent_ord + as + l_expected json_element_t; + l_actual json_element_t; + begin + -- Arrange + l_expected := json_element_t.parse('{ + "records": [ + {"field1": "outer", "field2": "thought"}, + {"field2": "thought", "field1": "outer"} + ] , + "special message": "hello, world!" +}'); + l_actual := json_element_t.parse('{ + "special message": "hello, world!" , + "records": [ + {"field2": "thought" ,"field1": "outer"}, + {"field1": "outer" , "field2": "thought"} + ] +}'); + + --Act + ut3.ut.expect( l_actual ).to_equal( l_expected ); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure long_json_test2 + as + l_actual json_element_t; + begin + l_actual := json_element_t.parse('[ + { + "_id":"5ce6dc0c3a11766d5a26f494", + "index":0, + "guid":"a86b8b2d-216d-4061-bafa-f3820e41efbe", + "isActive":true, + "balance":"$1,754.93", + "picture":"http://placehold.it/32x32", + "age":39, + "eyeColor":"green", + "name":"Pearlie Lott", + "gender":"female", + "company":"KOG", + "email":"pearlielott@kog.com", + "phone":"+1 (852) 567-2605", + "address":"357 Eldert Street, Benson, Montana, 5484", + "about":"Est officia consectetur reprehenderit fugiat culpa ea commodo aliqua deserunt enim eu. Exercitation adipisicing laboris nisi irure commodo dolor consectetur tempor minim sunt ullamco Lorem occaecat. Irure quis ut Lorem aliquip aute pariatur magna laboris duis veniam qui velit. Pariatur occaecat eu minim adipisicing est do. Occaecat do ipsum ut in enim quis voluptate et. Sit ea irure nulla culpa in eiusmod.\r\n", + "registered":"2018-08-24T12:46:31 -01:00", + "latitude":-22.323554, + "longitude":139.071611, + "tags":[ + "id", + "do", + "amet", + "magna", + "est", + "veniam", + "voluptate" + ], + "friends":[ + { + "id":0, + "name":"Tammi Lowe" + }, + { + "id":1, + "name":"Simpson Miles" + }, + { + "id":2, + "name":"Hogan Osborne" + } + ], + "greeting":"Hello, Pearlie Lott! You have 2 unread messages.", + "favoriteFruit":"banana" + }, + { + "_id":"5ce6dc0c2b56a6f3271fc272", + "index":1, + "guid":"2a24b446-d11a-4a52-b6c8-86acba1dc65f", + "isActive":true, + "balance":"$1,176.58", + "picture":"http://placehold.it/32x32", + "age":30, + "eyeColor":"brown", + "name":"Bertha Mack", + "gender":"female", + "company":"AQUAFIRE", + "email":"berthamack@aquafire.com", + "phone":"+1 (804) 504-2151", + "address":"636 Bouck Court, Cresaptown, Vermont, 5203", + "about":"Ipsum est exercitation excepteur reprehenderit ipsum. Do velit dolore minim ad. Quis amet dolor dolore exercitation sint Lorem. Exercitation nulla magna ut incididunt enim veniam voluptate Lorem velit adipisicing sunt deserunt sunt aute. Ullamco id anim Lorem dolore do labore excepteur et reprehenderit sit adipisicing sunt esse veniam. Anim laborum labore labore incididunt in labore exercitation ad occaecat amet ea quis veniam ut.\r\n", + "registered":"2017-12-29T06:00:27 -00:00", + "latitude":75.542572, + "longitude":147.312705, + "tags":[ + "veniam", + "sunt", + "commodo", + "ad", + "enim", + "officia", + "nisi" + ], + "friends":[ + { + "id":0, + "name":"Riddle Williams" + }, + { + "id":1, + "name":"Tracy Wagner" + }, + { + "id":2, + "name":"Morrow Phillips" + } + ], + "greeting":"Hello, Bertha Mack! You have 8 unread messages.", + "favoriteFruit":"banana" + }, + { + "_id":"5ce6dc0c6d8631fbfdd2afc7", + "index":2, + "guid":"66ca5411-4c88-4347-9972-e1016f628098", + "isActive":false, + "balance":"$2,732.22", + "picture":"http://placehold.it/32x32", + "age":33, + "eyeColor":"blue", + "name":"Fox Morgan", + "gender":"male", + "company":"PERKLE", + "email":"foxmorgan@perkle.com", + "phone":"+1 (985) 401-3450", + "address":"801 Whitty Lane, Snyderville, Guam, 5253", + "about":"Ex officia eu Lorem velit ullamco qui cupidatat irure sunt ea ad deserunt. Officia est consequat aute labore occaecat aliquip. Velit commodo cillum incididunt cupidatat ad id veniam aute labore tempor qui culpa voluptate dolor. Occaecat in ea id labore exercitation non tempor occaecat laboris aute irure fugiat dolor mollit. Voluptate non proident officia deserunt ex et ullamco aute eiusmod cupidatat consequat elit id.\r\n", + "registered":"2015-04-02T06:40:53 -01:00", + "latitude":-27.612441, + "longitude":-134.005929, + "tags":[ + "occaecat", + "amet", + "eu", + "dolore", + "ad", + "fugiat", + "quis" + ], + "friends":[ + { + "id":0, + "name":"Case Preston" + }, + { + "id":1, + "name":"Pollard Dawson" + }, + { + "id":2, + "name":"Frye Mann" + } + ], + "greeting":"Hello, Fox Morgan! You have 2 unread messages.", + "favoriteFruit":"apple" + }, + { + "_id":"5ce6dc0c0a7fea91e0a1fdf5", + "index":3, + "guid":"f895a236-fc0d-4c08-b2f0-9d1638dc256d", + "isActive":true, + "balance":"$2,746.32", + "picture":"http://placehold.it/32x32", + "age":34, + "eyeColor":"green", + "name":"Deleon Tucker", + "gender":"male", + "company":"ZANILLA", + "email":"deleontucker@zanilla.com", + "phone":"+1 (883) 415-2709", + "address":"540 Vandam Street, Chical, Wyoming, 5181", + "about":"Consectetur consectetur sint Lorem non id. Fugiat reprehenderit nulla dolore nisi culpa esse ea. Ad occaecat qui magna proident ex pariatur aliquip adipisicing do aute aute sunt. Aliqua aliqua et exercitation sunt ut adipisicing.\r\n", + "registered":"2017-10-08T09:05:49 -01:00", + "latitude":34.893845, + "longitude":110.699256, + "tags":[ + "culpa", + "sunt", + "sit", + "ut", + "eiusmod", + "laboris", + "ullamco" + ], + "friends":[ + { + "id":0, + "name":"Bernadine Pennington" + }, + { + "id":1, + "name":"Latoya Bradshaw" + }, + { + "id":2, + "name":"Iva Caldwell" + } + ], + "greeting":"Hello, Deleon Tucker! You have 7 unread messages.", + "favoriteFruit":"banana" + }, + { + "_id":"5ce6dc0c18bc92716a12a8e4", + "index":4, + "guid":"6ed45f42-1a2b-48b2-89ce-5fdb2505343b", + "isActive":true, + "balance":"$1,049.96", + "picture":"http://placehold.it/32x32", + "age":30, + "eyeColor":"blue", + "name":"Schwartz Norman", + "gender":"male", + "company":"UPDAT", + "email":"schwartznorman@updat.com", + "phone":"+1 (826) 404-3309", + "address":"925 Harman Street, Cornucopia, Georgia, 5748", + "about":"Qui Lorem ullamco veniam irure aliquip amet exercitation. Velit nisi id laboris adipisicing in esse adipisicing commodo cillum do exercitation tempor. Consequat tempor dolor minim consequat minim ad do tempor excepteur.\r\n", + "registered":"2014-08-10T08:34:27 -01:00", + "latitude":27.35547, + "longitude":-77.343791, + "tags":[ + "reprehenderit", + "nisi", + "duis", + "fugiat", + "id", + "non", + "laboris" + ], + "friends":[ + { + "id":0, + "name":"Dora Combs" + }, + { + "id":1, + "name":"Emerson Wade" + }, + { + "id":2, + "name":"Alma Mccormick" + } + ], + "greeting":"Hello, Schwartz Norman! You have 1 unread messages.", + "favoriteFruit":"apple" + }, + { + "_id":"5ce6dc0cb7ae44eb76c3e5fd", + "index":5, + "guid":"0516df27-73db-42a8-b2c3-d34bd976e031", + "isActive":false, + "balance":"$3,679.94", + "picture":"http://placehold.it/32x32", + "age":32, + "eyeColor":"brown", + "name":"Christi Oneal", + "gender":"female", + "company":"SUREPLEX", + "email":"christioneal@sureplex.com", + "phone":"+1 (985) 408-3098", + "address":"640 Fayette Street, Dennard, Washington, 7962", + "about":"Dolore fugiat sit non dolore nostrud mollit enim id sint culpa do reprehenderit ad. Velit occaecat incididunt nostrud aliqua incididunt do cillum occaecat laboris quis duis. Non tempor culpa aliquip est est consectetur ullamco elit. Voluptate et sit do et. Amet sit irure eu ex enim nulla anim deserunt ut. Sit aute ea ut fugiat eu tempor Lorem.\r\n", + "registered":"2015-05-10T09:24:56 -01:00", + "latitude":43.343805, + "longitude":79.535043, + "tags":[ + "occaecat", + "laboris", + "nulla", + "nisi", + "dolore", + "cillum", + "dolore" + ], + "friends":[ + { + "id":0, + "name":"Marquez Wiggins" + }, + { + "id":1, + "name":"Mai Fischer" + }, + { + "id":2, + "name":"Newman Davenport" + } + ], + "greeting":"Hello, Christi Oneal! You have 8 unread messages.", + "favoriteFruit":"strawberry" + } +]'); + + --Act + ut3.ut.expect( l_actual ).to_equal( l_actual ); + --Assert + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure long_json_diff as + l_expected json_element_t; + l_actual json_element_t; + l_expected_message varchar2(32767); + l_actual_message varchar2(32767); + begin + -- Arrange + l_expected := json_element_t.parse('[ + { + "_id": "5ce6ec46cb9977b050f15d97", + "index": 0, + "guid": "1acb2b6b-15b5-4747-a62f-db477e18df61", + "isActive": false, + "balance": "$1,443.80", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "brown", + "name": "Carson Conley", + "gender": "male", + "company": "EYEWAX", + "email": "carsonconley@eyewax.com", + "phone": "+1 (873) 520-2117", + "address": "289 Wallabout Street, Cazadero, Nevada, 4802", + "about": "Lorem aliqua veniam eiusmod exercitation anim sunt esse qui tempor officia amet nulla labore enim. Fugiat eiusmod amet exercitation incididunt mollit pariatur amet et quis et ex amet adipisicing. Elit in commodo tempor adipisicing exercitation Lorem amet cillum sint sint aliquip. Officia enim do irure velit qui officia et reprehenderit qui enim.\r\n", + "registered": "2018-08-07T05:03:13 -01:00", + "latitude": -1.973252, + "longitude": 17.835529, + "tags": [ + "dolore", + "occaecat", + "proident", + "laborum", + "nostrud", + "non", + "occaecat" + ], + "friends": [ + { + "id": 0, + "name": "Riggs Cardenas" + }, + { + "id": 1, + "name": "Duncan Schultz" + }, + { + "id": 2, + "name": "Galloway Bond" + } + ], + "greeting": "Hello, Carson Conley! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "5ce6ec469ba57bef5c421021", + "index": 1, + "guid": "59be5b73-fffe-4a4f-acea-65c5abbdb53c", + "isActive": true, + "balance": "$3,895.35", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "brown", + "name": "Melton Carroll", + "gender": "male", + "company": "ISOSPHERE", + "email": "meltoncarroll@isosphere.com", + "phone": "+1 (804) 416-2235", + "address": "114 Windsor Place, Dubois, Oklahoma, 9648", + "about": "Pariatur ea voluptate aute dolor minim laborum cillum ad reprehenderit. Mollit sint voluptate duis et culpa amet irure laborum. Nulla veniam fugiat sint proident aliquip dolore laboris nisi et. Nisi in do aliqua voluptate cupidatat enim dolor minim minim qui tempor. Eu anim ea mollit sunt esse et est cillum cillum pariatur dolor. Ea anim duis sunt eiusmod sit cillum consectetur aliquip ad et elit culpa irure commodo.\r\n", + "registered": "2018-10-20T01:38:32 -01:00", + "latitude": 46.821539, + "longitude": 19.78817, + "tags": [ + "sunt", + "aliquip", + "commodo", + "occaecat", + "mollit", + "minim", + "sint" + ], + "friends": [ + { + "id": 0, + "name": "Tameka Reese" + }, + { + "id": 1, + "name": "Rosemarie Buckley" + }, + { + "id": 2, + "name": "Houston Moran" + } + ], + "greeting": "Hello, Melton Carroll! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "5ce6ec464e6f8751e75ed29f", + "index": 2, + "guid": "42e07b71-b769-4078-b226-f79048b75bd2", + "isActive": false, + "balance": "$3,366.81", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "blue", + "name": "Kathie Cameron", + "gender": "female", + "company": "EVENTIX", + "email": "kathiecameron@eventix.com", + "phone": "+1 (949) 416-3458", + "address": "171 Henderson Walk, Barstow, American Samoa, 3605", + "about": "Lorem est mollit consequat pariatur elit. Enim adipisicing ipsum sit labore exercitation fugiat qui eu enim. Quis irure Lorem exercitation laborum sunt quis Lorem pariatur officia veniam aute officia mollit quis.\r\n", + "registered": "2015-07-15T08:40:18 -01:00", + "latitude": -12.947501, + "longitude": 51.221756, + "tags": [ + "voluptate", + "officia", + "laborum", + "nulla", + "anim", + "mollit", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Noelle Leonard" + }, + { + "id": 1, + "name": "Sally Barr" + }, + { + "id": 2, + "name": "Rosie Rutledge" + } + ], + "greeting": "Hello, Kathie Cameron! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "5ce6ec4632328a654d592cb6", + "index": 3, + "guid": "6b9124a9-fbde-4c60-8dac-e296f5daa3c4", + "isActive": true, + "balance": "$2,374.96", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Ebony Carver", + "gender": "female", + "company": "EVENTEX", + "email": "ebonycarver@eventex.com", + "phone": "+1 (816) 535-3332", + "address": "452 Lott Street, Iberia, South Carolina, 1635", + "about": "Ea cupidatat occaecat in Lorem adipisicing quis sunt. Occaecat sit Lorem eiusmod et. Velit nostrud cupidatat do exercitation. Officia esse excepteur labore aliqua fugiat dolor duis. Ullamco qui ipsum eu do nostrud et laboris magna dolor cillum. Dolore eiusmod do occaecat dolore.\r\n", + "registered": "2017-04-12T09:20:02 -01:00", + "latitude": 65.70655, + "longitude": 150.667286, + "tags": [ + "do", + "laboris", + "exercitation", + "quis", + "laboris", + "amet", + "sint" + ], + "friends": [ + { + "id": 0, + "name": "Rowena Holloway" + }, + { + "id": 1, + "name": "Lee Chang" + }, + { + "id": 2, + "name": "Delaney Kennedy" + } + ], + "greeting": "Hello, Ebony Carver! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "5ce6ec46d9dbfbf9b184cee7", + "index": 4, + "guid": "9dece65b-6b48-4960-880b-7795ff63c81c", + "isActive": false, + "balance": "$2,927.54", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Mae Payne", + "gender": "female", + "company": "ZEPITOPE", + "email": "maepayne@zepitope.com", + "phone": "+1 (904) 531-2930", + "address": "575 Amity Street, Eden, Iowa, 4017", + "about": "Voluptate ex enim aliqua ea et proident ipsum est anim nostrud. Duis aliquip voluptate voluptate non aliquip. Elit commodo Lorem aliqua sit elit consectetur reprehenderit in aute minim. Dolor non incididunt do tempor aliquip esse non magna anim eiusmod ut id id.\r\n", + "registered": "2016-08-29T06:23:00 -01:00", + "latitude": -60.325313, + "longitude": 88.598722, + "tags": [ + "est", + "incididunt", + "officia", + "sunt", + "eu", + "ut", + "deserunt" + ], + "friends": [ + { + "id": 0, + "name": "Taylor Walton" + }, + { + "id": 1, + "name": "Celina Mcdonald" + }, + { + "id": 2, + "name": "Berry Rivers" + } + ], + "greeting": "Hello, Mae Payne! You have 4 unread messages.", + "favoriteFruit": "strawberry" + } +]'); + l_actual := json_element_t.parse('[ + { + "_id": "5ce6ec6660565269b16cf836", + "index": 0, + "guid": "c222eda5-d925-4163-89e3-4b0e50d5e297", + "isActive": false, + "balance": "$3,626.25", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Leigh Munoz", + "gender": "female", + "company": "OATFARM", + "email": "leighmunoz@oatfarm.com", + "phone": "+1 (969) 545-2708", + "address": "218 Mersereau Court, Homeworth, Connecticut, 4423", + "about": "Eiusmod exercitation incididunt ea incididunt anim voluptate. Duis laboris ut Lorem pariatur tempor voluptate occaecat laboris. Enim duis excepteur cillum ullamco pariatur sint. Dolor labore qui ullamco deserunt do consectetur labore velit occaecat officia incididunt Lorem dolore. Pariatur dolor voluptate ex adipisicing labore quis aliquip aliquip. Culpa tempor proident nisi occaecat aliqua mollit ullamco nisi cillum ipsum exercitation quis excepteur. Consequat officia ex ipsum id consequat deserunt sunt id nostrud magna.\r\n", + "registered": "2018-10-08T10:24:07 -01:00", + "latitude": -42.796797, + "longitude": -14.220273, + "tags": [ + "ex", + "elit", + "consectetur", + "ipsum", + "aute", + "ipsum", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Selena Dunn" + }, + { + "id": 1, + "name": "Wilda Haynes" + }, + { + "id": 2, + "name": "Calderon Long" + } + ], + "greeting": "Hello, Leigh Munoz! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "5ce6ec66383ddbf3c400e3ed", + "index": 1, + "guid": "2e778803-50d3-411f-b34d-47d0f19d03f7", + "isActive": false, + "balance": "$2,299.28", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "blue", + "name": "Velez Drake", + "gender": "male", + "company": "GENMY", + "email": "velezdrake@genmy.com", + "phone": "+1 (870) 564-2219", + "address": "526 Erskine Loop, Websterville, Nebraska, 1970", + "about": "Consectetur Lorem do ex est dolor. Consectetur do tempor amet elit. Amet dolore cupidatat Lorem sunt reprehenderit.\r\n", + "registered": "2017-11-24T04:42:37 -00:00", + "latitude": -45.78579, + "longitude": 142.062878, + "tags": [ + "do", + "esse", + "nisi", + "sunt", + "et", + "nisi", + "nostrud" + ], + "friends": [ + { + "id": 0, + "name": "Bessie Schmidt" + }, + { + "id": 1, + "name": "Harriett Lyons" + }, + { + "id": 2, + "name": "Jerry Gonzales" + } + ], + "greeting": "Hello, Velez Drake! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "5ce6ec660a8b5f95ed543305", + "index": 2, + "guid": "bb0eaa88-f7fd-4b72-8538-8c0b4595bcec", + "isActive": true, + "balance": "$3,085.28", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "green", + "name": "Gallegos Dominguez", + "gender": "male", + "company": "QOT", + "email": "gallegosdominguez@qot.com", + "phone": "+1 (947) 581-3675", + "address": "375 Temple Court, Beaulieu, Minnesota, 3880", + "about": "Qui consequat est aliquip esse minim Lorem qui quis. Enim consequat anim culpa consequat ex incididunt ad incididunt est id excepteur nulla culpa. Aliqua enim enim exercitation anim velit occaecat voluptate qui minim ut ullamco fugiat. Anim voluptate nulla minim labore dolore eu veniam. Exercitation sint eiusmod aute aliqua magna aliqua pariatur Lorem velit pariatur ex duis.\r\n", + "registered": "2019-03-11T12:36:55 -00:00", + "latitude": -1.619328, + "longitude": -160.580052, + "tags": [ + "ipsum", + "reprehenderit", + "id", + "aliqua", + "ad", + "do", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Justice Bruce" + }, + { + "id": 1, + "name": "Alta Clements" + }, + { + "id": 2, + "name": "Amy Hobbs" + } + ], + "greeting": "Hello, Gallegos Dominguez! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "5ce6ec6600fb7aaee2d1243e", + "index": 3, + "guid": "4a4363b5-9d65-4b22-9b58-a5c8c1c5bd5d", + "isActive": false, + "balance": "$3,152.70", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Bobbie Baldwin", + "gender": "female", + "company": "IDEGO", + "email": "bobbiebaldwin@idego.com", + "phone": "+1 (937) 501-3123", + "address": "271 Coles Street, Deltaville, Massachusetts, 349", + "about": "Dolor labore quis Lorem eiusmod duis adipisicing ut. Aute aute aliquip exercitation eiusmod veniam ullamco irure sit est. Ut Lorem incididunt do sint laborum cillum Lorem commodo duis. Dolor nulla ad consectetur non cillum. Est excepteur esse mollit elit laborum ullamco exercitation sit esse. Reprehenderit occaecat ad ad reprehenderit adipisicing non Lorem ipsum fugiat culpa. Do quis non exercitation ea magna elit non.\r\n", + "registered": "2014-06-25T07:44:03 -01:00", + "latitude": -70.045195, + "longitude": 117.328462, + "tags": [ + "anim", + "excepteur", + "aliqua", + "mollit", + "non", + "in", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Lora Little" + }, + { + "id": 1, + "name": "Stanton Pollard" + }, + { + "id": 2, + "name": "Bernice Knowles" + } + ], + "greeting": "Hello, Bobbie Baldwin! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "5ce6ec660585cbb589b34fc8", + "index": 4, + "guid": "18547241-6fd0-466d-9f79-21aeb0485294", + "isActive": false, + "balance": "$3,853.86", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "blue", + "name": "Erika Benton", + "gender": "female", + "company": "SURETECH", + "email": "erikabenton@suretech.com", + "phone": "+1 (833) 472-2277", + "address": "893 Jamison Lane, Grayhawk, Illinois, 1820", + "about": "Ullamco nisi quis esse fugiat eu proident nisi cupidatat reprehenderit nostrud nulla laborum duis. Duis quis ipsum ad voluptate enim. Et excepteur irure proident adipisicing enim eu veniam aliquip nostrud amet sit est. Non laborum reprehenderit qui ullamco occaecat elit sunt ea nostrud reprehenderit incididunt sunt.\r\n", + "registered": "2018-01-19T11:58:53 -00:00", + "latitude": -44.595301, + "longitude": 100.938225, + "tags": [ + "cupidatat", + "aliqua", + "nostrud", + "nostrud", + "ipsum", + "ipsum", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Addie Benjamin" + }, + { + "id": 1, + "name": "Brock Nolan" + }, + { + "id": 2, + "name": "Betty Suarez" + } + ], + "greeting": "Hello, Erika Benton! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "5ce6ec66ff15753596332021", + "index": 5, + "guid": "f865dabb-4871-4f29-9c56-17361d254f39", + "isActive": true, + "balance": "$3,474.90", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "blue", + "name": "Rice Owens", + "gender": "male", + "company": "ACIUM", + "email": "riceowens@acium.com", + "phone": "+1 (975) 576-3718", + "address": "400 Halleck Street, Lafferty, District Of Columbia, 495", + "about": "Cupidatat laborum mollit non eu aute amet consectetur aliqua officia consectetur consequat. Tempor labore pariatur Lorem sint quis laborum est dolore et. Est ipsum incididunt eiusmod enim nostrud laboris duis est enim proident do laborum id culpa.\r\n", + "registered": "2018-05-06T02:43:06 -01:00", + "latitude": 2.843708, + "longitude": -3.301217, + "tags": [ + "laboris", + "velit", + "dolore", + "sunt", + "ad", + "aliqua", + "duis" + ], + "friends": [ + { + "id": 0, + "name": "Ramirez King" + }, + { + "id": 1, + "name": "Jeannie Boyer" + }, + { + "id": 2, + "name": "Deloris Jensen" + } + ], + "greeting": "Hello, Rice Owens! You have 9 unread messages.", + "favoriteFruit": "banana" + } +]'); + + --Act + ut3.ut.expect( l_actual ).to_equal( l_expected ); + --Assert + l_expected_message := q'[%Diff: 133 differences found, showing first 20 +%132 unequal values, 1 missing properties +%Extra property: object on path: $[5] +%Actual value: "5ce6ec46cb9977b050f15d97" was expected to be: "5ce6ec6660565269b16cf836" on path: $[0]."_id" +%Actual value: "5ce6ec469ba57bef5c421021" was expected to be: "5ce6ec66383ddbf3c400e3ed" on path: $[1]."_id" +%Actual value: "5ce6ec4632328a654d592cb6" was expected to be: "5ce6ec6600fb7aaee2d1243e" on path: $[3]."_id" +%Actual value: "5ce6ec464e6f8751e75ed29f" was expected to be: "5ce6ec660a8b5f95ed543305" on path: $[2]."_id" +%Actual value: "5ce6ec46d9dbfbf9b184cee7" was expected to be: "5ce6ec660585cbb589b34fc8" on path: $[4]."_id" +%Actual value: "59be5b73-fffe-4a4f-acea-65c5abbdb53c" was expected to be: "2e778803-50d3-411f-b34d-47d0f19d03f7" on path: $[1]."guid" +%Actual value: "9dece65b-6b48-4960-880b-7795ff63c81c" was expected to be: "18547241-6fd0-466d-9f79-21aeb0485294" on path: $[4]."guid" +%Actual value: "42e07b71-b769-4078-b226-f79048b75bd2" was expected to be: "bb0eaa88-f7fd-4b72-8538-8c0b4595bcec" on path: $[2]."guid" +%Actual value: "6b9124a9-fbde-4c60-8dac-e296f5daa3c4" was expected to be: "4a4363b5-9d65-4b22-9b58-a5c8c1c5bd5d" on path: $[3]."guid" +%Actual value: "1acb2b6b-15b5-4747-a62f-db477e18df61" was expected to be: "c222eda5-d925-4163-89e3-4b0e50d5e297" on path: $[0]."guid" +%Actual value: FALSE was expected to be: TRUE on path: $[2]."isActive" +%Actual value: TRUE was expected to be: FALSE on path: $[3]."isActive" +%Actual value: TRUE was expected to be: FALSE on path: $[1]."isActive" +%Actual value: "$3,895.35" was expected to be: "$2,299.28" on path: $[1]."balance" +%Actual value: "$1,443.80" was expected to be: "$3,626.25" on path: $[0]."balance" +%Actual value: "$3,366.81" was expected to be: "$3,085.28" on path: $[2]."balance" +%Actual value: "$2,927.54" was expected to be: "$3,853.86" on path: $[4]."balance" +%Actual value: "$2,374.96" was expected to be: "$3,152.70" on path: $[3]."balance" +%Actual value: 23 was expected to be: 36 on path: $[2]."age"%]'; + + l_actual_message := ut3_tester_helper.main_helper.get_failed_expectations(1); + --Assert + ut.expect(l_actual_message).to_be_like(l_expected_message); + end; + + procedure check_json_objects is + l_expected json_object_t; + l_actual json_object_t; + begin + l_expected := json_object_t('{ "name" : "Bond", "proffesion" : "spy", "drink" : "martini"}'); + l_actual := json_object_t('{ "proffesion" : "spy","name" : "Bond", "drink" : "martini"}'); + ut3.ut.expect( l_actual ).to_equal( l_expected ); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + procedure check_json_arrays is + l_expected json_array_t; + l_actual json_array_t; + begin + l_expected := json_array_t('[ {"name" : "Bond", "proffesion" : "spy", "drink" : "martini"} , {"name" : "Kloss", "proffesion" : "spy", "drink" : "beer"} ]'); + l_actual := json_array_t('[ {"name" : "Bond", "proffesion" : "spy", "drink" : "martini"} , {"name" : "Kloss", "proffesion" : "spy", "drink" : "beer"} ]'); + ut3.ut.expect( l_actual ).to_equal( l_expected ); + ut.expect(ut3_tester_helper.main_helper.get_failed_expectations_num).to_equal(0); + end; + + +end; +/ diff --git a/test/ut3_user/expectations/test_expectations_json.pks b/test/ut3_user/expectations/test_expectations_json.pks new file mode 100644 index 000000000..64dff42e8 --- /dev/null +++ b/test/ut3_user/expectations/test_expectations_json.pks @@ -0,0 +1,79 @@ +create or replace package test_expectations_json is + + --%suite(json expectations) + --%suitepath(utplsql.test_user.expectations) + + --%aftereach + procedure cleanup_expectations; + + --%test(Gives success for identical data) + procedure success_on_same_data; + + --%test(Gives failure for different data) + procedure fail_on_diff_data; + + --%test( Json variable is null) + procedure null_json_variable; + + --%test( Json variable is not null) + procedure not_null_json_variable; + + --%test( Fail json variable is null) + procedure fail_null_json_var; + + --%test( Fail json variable is not null) + procedure fail_not_null_json_var; + + --%test(Json string is empty) + procedure empty_json; + + --%test(Json string is not empty) + procedure not_empty_json; + + --%test( Fail json string is empty) + procedure fail_empty_json; + + --%test( Fail json string is not empty) + procedure fail_not_empty_json; + + --%test( Json object to have count ) + procedure to_have_count; + + --%test( Fail Json object to have count) + procedure fail_to_have_count; + + --%test( Json object not to have count) + procedure not_to_have_count; + + --%test( Fail Json object not to have count) + procedure fail_not_to_have_count; + + --%test( Json object to have count on array) + procedure to_have_count_array; + + --%test( Two json use plsql function to extract same pieces and compare) + procedure to_diff_json_extract_same; + + --%test( Two json use plsql function to extract diff pieces and compare) + procedure to_diff_json_extract_diff; + + --%test( Long JSON test same ) + procedure long_json_test; + + --%test( JSON test same semantic content different order ) + procedure json_same_diffrent_ord; + + --%test( Long complex nested JSON test ) + procedure long_json_test2; + + --%test( Long complex json differences ) + procedure long_json_diff; + + --%test( Compare two objects json ) + procedure check_json_objects; + + --%test( Compare two json arrays ) + procedure check_json_arrays; + +end; +/ From b3245866cba7175f12f72f64a490a898944dfd0c Mon Sep 17 00:00:00 2001 From: Travis CI Date: Mon, 17 Jun 2019 17:49:27 +0000 Subject: [PATCH 178/181] Updated project version after build [skip ci] --- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/about/authors.md b/docs/about/authors.md index 0d2b9fd52..894d67d81 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index 2d7028ca6..ea8d75748 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index dba1d530e..95d5f4eea 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index e5fa75bb1..a13e60c1a 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 974c195dc..6011aa181 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index fe5615315..3757c4459 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 0336b3429..0aabddae8 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 59618289d..176baaa41 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index a7ff66cb2..ed684cfca 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index 765876c1f..a673ea733 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index fdd037420..58142bd75 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 94b570355..8e06e1493 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index fc6344875..3d4598980 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index b3a08cba8..b073305bd 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 05ca5765b..3a2fc3ca1 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index be8a324ac..b697907c2 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index ee5e17acd..0d9a00398 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3076--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) # Upgrading from version 2 diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 6b2adeb53..1c571b0d6 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -776,7 +776,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.3076-develop + * secion v3.1.7.3083-develop */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index ec5790961..a9af2d059 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.3076-develop'; + gc_version constant varchar2(50) := 'v3.1.7.3083-develop'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall'; From 273fd942c127a57620087c98d623b81e4a18ce06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20G=C4=99bal?= Date: Tue, 18 Jun 2019 00:09:11 +0100 Subject: [PATCH 179/181] Update readme.md --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 5fc53ed08..315124db6 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -![utPLSQL v3 | Powerful PL/SQL Unit Testing Framework](docs/images/utPLSQL-testing-framework-transparent_120.png) +![utPLSQL v3 | Testing Framework for PL/SQL](docs/images/utPLSQL-testing-framework-transparent_120.png) ---------- @@ -248,4 +248,4 @@ The utPLSQL project is community-driven and is not commercially motivated. Nonet utPLSQL has been supported by Redgate in the form of sponsored stickers and t-shirts. Thank you for helping us spreading the word! - \ No newline at end of file + From 27242af81568559463529e63eaa073a31cda231e Mon Sep 17 00:00:00 2001 From: Jacek Gebal Date: Tue, 18 Jun 2019 00:20:16 +0100 Subject: [PATCH 180/181] Updated copyright year --- LICENSE | 2 +- source/api/ut.pkb | 2 +- source/api/ut.pks | 2 +- source/api/ut_runner.pkb | 2 +- source/api/ut_runner.pks | 2 +- source/api/ut_suite_item_info.tpb | 2 +- source/api/ut_suite_item_info.tps | 2 +- source/api/ut_suite_items_info.tps | 2 +- source/core/annotations/ut_annotated_object.tps | 2 +- source/core/annotations/ut_annotated_objects.tps | 2 +- source/core/annotations/ut_annotation.tps | 2 +- source/core/annotations/ut_annotation_cache.sql | 2 +- source/core/annotations/ut_annotation_cache_info.sql | 2 +- source/core/annotations/ut_annotation_cache_manager.pkb | 2 +- source/core/annotations/ut_annotation_cache_manager.pks | 2 +- source/core/annotations/ut_annotation_cache_schema.sql | 2 +- source/core/annotations/ut_annotation_cache_seq.sql | 2 +- source/core/annotations/ut_annotation_manager.pkb | 2 +- source/core/annotations/ut_annotation_manager.pks | 2 +- source/core/annotations/ut_annotation_obj_cache_info.tps | 2 +- source/core/annotations/ut_annotation_objs_cache_info.tps | 2 +- source/core/annotations/ut_annotation_parser.pkb | 2 +- source/core/annotations/ut_annotation_parser.pks | 2 +- source/core/annotations/ut_annotations.tps | 2 +- source/core/annotations/ut_trigger_check.pkb | 2 +- source/core/annotations/ut_trigger_check.pks | 2 +- source/core/coverage/ut_coverage.pkb | 2 +- source/core/coverage/ut_coverage.pks | 2 +- source/core/coverage/ut_coverage_block.pkb | 2 +- source/core/coverage/ut_coverage_block.pks | 2 +- source/core/coverage/ut_coverage_helper.pkb | 2 +- source/core/coverage/ut_coverage_helper.pks | 2 +- source/core/coverage/ut_coverage_helper_block.pkb | 2 +- source/core/coverage/ut_coverage_helper_block.pks | 2 +- source/core/coverage/ut_coverage_helper_profiler.pkb | 2 +- source/core/coverage/ut_coverage_helper_profiler.pks | 2 +- source/core/coverage/ut_coverage_profiler.pkb | 2 +- source/core/coverage/ut_coverage_profiler.pks | 2 +- source/core/coverage/ut_coverage_reporter_base.tpb | 2 +- source/core/coverage/ut_coverage_reporter_base.tps | 2 +- source/core/coverage/ut_coverage_sources_tmp.sql | 2 +- source/core/events/ut_event_item.tps | 2 +- source/core/events/ut_event_listener.tps | 2 +- source/core/events/ut_event_manager.pkb | 2 +- source/core/events/ut_event_manager.pks | 2 +- source/core/output_buffers/ut_output_buffer_base.tpb | 2 +- source/core/output_buffers/ut_output_buffer_base.tps | 2 +- source/core/output_buffers/ut_output_buffer_info_tmp.sql | 2 +- source/core/output_buffers/ut_output_buffer_tmp.sql | 2 +- source/core/output_buffers/ut_output_clob_buffer_tmp.sql | 2 +- source/core/output_buffers/ut_output_clob_table_buffer.tpb | 2 +- source/core/output_buffers/ut_output_clob_table_buffer.tps | 2 +- source/core/output_buffers/ut_output_data_row.tps | 2 +- source/core/output_buffers/ut_output_data_rows.tps | 2 +- source/core/output_buffers/ut_output_table_buffer.tpb | 2 +- source/core/output_buffers/ut_output_table_buffer.tps | 2 +- source/core/types/ut_console_reporter_base.tpb | 2 +- source/core/types/ut_console_reporter_base.tps | 2 +- source/core/types/ut_coverage_options.tps | 2 +- source/core/types/ut_executable.tpb | 2 +- source/core/types/ut_executable.tps | 2 +- source/core/types/ut_executable_test.tps | 2 +- source/core/types/ut_executables.tps | 2 +- source/core/types/ut_expectation_result.tpb | 2 +- source/core/types/ut_expectation_result.tps | 2 +- source/core/types/ut_expectation_results.tps | 2 +- source/core/types/ut_file_mapping.tpb | 2 +- source/core/types/ut_file_mapping.tps | 2 +- source/core/types/ut_file_mappings.tps | 2 +- source/core/types/ut_integer_list.tps | 2 +- source/core/types/ut_key_value_pair.tps | 2 +- source/core/types/ut_key_value_pairs.tps | 2 +- source/core/types/ut_logical_suite.tpb | 2 +- source/core/types/ut_logical_suite.tps | 2 +- source/core/types/ut_object_name.tpb | 2 +- source/core/types/ut_object_name.tps | 2 +- source/core/types/ut_object_names.tps | 2 +- source/core/types/ut_output_reporter_base.tpb | 2 +- source/core/types/ut_output_reporter_base.tps | 2 +- source/core/types/ut_reporter_base.tpb | 2 +- source/core/types/ut_reporter_base.tps | 2 +- source/core/types/ut_reporter_info.tps | 2 +- source/core/types/ut_reporters.tps | 2 +- source/core/types/ut_reporters_info.tps | 2 +- source/core/types/ut_results_counter.tpb | 2 +- source/core/types/ut_results_counter.tps | 2 +- source/core/types/ut_run.tpb | 2 +- source/core/types/ut_run.tps | 2 +- source/core/types/ut_run_info.tpb | 2 +- source/core/types/ut_run_info.tps | 2 +- source/core/types/ut_suite.tpb | 2 +- source/core/types/ut_suite.tps | 2 +- source/core/types/ut_suite_context.tpb | 2 +- source/core/types/ut_suite_context.tps | 2 +- source/core/types/ut_suite_item.tpb | 2 +- source/core/types/ut_suite_item.tps | 2 +- source/core/types/ut_suite_items.tps | 2 +- source/core/types/ut_test.tpb | 2 +- source/core/types/ut_test.tps | 2 +- source/core/types/ut_varchar2_list.tps | 2 +- source/core/types/ut_varchar2_rows.tps | 2 +- source/core/ut_dbms_output_cache.sql | 2 +- source/core/ut_expectation_processor.pkb | 2 +- source/core/ut_expectation_processor.pks | 2 +- source/core/ut_file_mapper.pkb | 2 +- source/core/ut_file_mapper.pks | 2 +- source/core/ut_metadata.pkb | 2 +- source/core/ut_metadata.pks | 2 +- source/core/ut_savepoint_seq.sql | 2 +- source/core/ut_suite_builder.pkb | 2 +- source/core/ut_suite_builder.pks | 2 +- source/core/ut_suite_cache.sql | 2 +- source/core/ut_suite_cache_manager.pkb | 2 +- source/core/ut_suite_cache_manager.pks | 2 +- source/core/ut_suite_cache_package.sql | 2 +- source/core/ut_suite_cache_schema.sql | 2 +- source/core/ut_suite_cache_seq.sql | 2 +- source/core/ut_suite_manager.pkb | 2 +- source/core/ut_suite_manager.pks | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- source/create_synonyms_and_grants_for_public.sql | 2 +- source/create_user_grants.sql | 2 +- source/create_user_synonyms.sql | 2 +- source/create_utplsql_owner.sql | 2 +- source/define_ut3_owner_param.sql | 2 +- source/expectations/data_values/ut_compound_data_diff_tmp.sql | 2 +- source/expectations/data_values/ut_compound_data_helper.pkb | 2 +- source/expectations/data_values/ut_compound_data_helper.pks | 2 +- source/expectations/data_values/ut_compound_data_tmp.sql | 2 +- source/expectations/data_values/ut_compound_data_value.tpb | 2 +- source/expectations/data_values/ut_compound_data_value.tps | 2 +- source/expectations/data_values/ut_cursor_column.tps | 2 +- source/expectations/data_values/ut_cursor_column_tab.tps | 2 +- source/expectations/data_values/ut_cursor_details.tps | 2 +- source/expectations/data_values/ut_data_value.tpb | 2 +- source/expectations/data_values/ut_data_value.tps | 2 +- source/expectations/data_values/ut_data_value_anydata.tpb | 2 +- source/expectations/data_values/ut_data_value_anydata.tps | 2 +- source/expectations/data_values/ut_data_value_blob.tpb | 2 +- source/expectations/data_values/ut_data_value_blob.tps | 2 +- source/expectations/data_values/ut_data_value_boolean.tpb | 2 +- source/expectations/data_values/ut_data_value_boolean.tps | 2 +- source/expectations/data_values/ut_data_value_clob.tpb | 2 +- source/expectations/data_values/ut_data_value_clob.tps | 2 +- source/expectations/data_values/ut_data_value_date.tpb | 2 +- source/expectations/data_values/ut_data_value_date.tps | 2 +- source/expectations/data_values/ut_data_value_dsinterval.tpb | 2 +- source/expectations/data_values/ut_data_value_dsinterval.tps | 2 +- source/expectations/data_values/ut_data_value_json.tpb | 2 +- source/expectations/data_values/ut_data_value_json.tps | 2 +- source/expectations/data_values/ut_data_value_number.tpb | 2 +- source/expectations/data_values/ut_data_value_number.tps | 2 +- source/expectations/data_values/ut_data_value_refcursor.tpb | 2 +- source/expectations/data_values/ut_data_value_refcursor.tps | 2 +- source/expectations/data_values/ut_data_value_timestamp.tpb | 2 +- source/expectations/data_values/ut_data_value_timestamp.tps | 2 +- source/expectations/data_values/ut_data_value_timestamp_ltz.tpb | 2 +- source/expectations/data_values/ut_data_value_timestamp_ltz.tps | 2 +- source/expectations/data_values/ut_data_value_timestamp_tz.tpb | 2 +- source/expectations/data_values/ut_data_value_timestamp_tz.tps | 2 +- source/expectations/data_values/ut_data_value_varchar2.tpb | 2 +- source/expectations/data_values/ut_data_value_varchar2.tps | 2 +- source/expectations/data_values/ut_data_value_xmltype.tpb | 2 +- source/expectations/data_values/ut_data_value_xmltype.tps | 2 +- source/expectations/data_values/ut_data_value_yminterval.tpb | 2 +- source/expectations/data_values/ut_data_value_yminterval.tps | 2 +- source/expectations/data_values/ut_json_data_diff_tmp.sql | 2 +- source/expectations/data_values/ut_json_leaf.tps | 2 +- source/expectations/data_values/ut_json_leaf_tab.tps | 2 +- source/expectations/data_values/ut_json_tree_details.tps | 2 +- source/expectations/data_values/ut_key_anyval_pair.tps | 2 +- source/expectations/data_values/ut_key_anyval_pairs.tps | 2 +- source/expectations/data_values/ut_key_anyvalues.tpb | 2 +- source/expectations/data_values/ut_key_anyvalues.tps | 2 +- source/expectations/matchers/ut_be_between.tpb | 2 +- source/expectations/matchers/ut_be_between.tps | 2 +- source/expectations/matchers/ut_be_empty.tpb | 2 +- source/expectations/matchers/ut_be_empty.tps | 2 +- source/expectations/matchers/ut_be_false.tpb | 2 +- source/expectations/matchers/ut_be_false.tps | 2 +- source/expectations/matchers/ut_be_greater_or_equal.tpb | 2 +- source/expectations/matchers/ut_be_greater_or_equal.tps | 2 +- source/expectations/matchers/ut_be_greater_than.tpb | 2 +- source/expectations/matchers/ut_be_greater_than.tps | 2 +- source/expectations/matchers/ut_be_less_or_equal.tpb | 2 +- source/expectations/matchers/ut_be_less_or_equal.tps | 2 +- source/expectations/matchers/ut_be_less_than.tpb | 2 +- source/expectations/matchers/ut_be_less_than.tps | 2 +- source/expectations/matchers/ut_be_like.tpb | 2 +- source/expectations/matchers/ut_be_like.tps | 2 +- source/expectations/matchers/ut_be_not_null.tpb | 2 +- source/expectations/matchers/ut_be_not_null.tps | 2 +- source/expectations/matchers/ut_be_null.tpb | 2 +- source/expectations/matchers/ut_be_null.tps | 2 +- source/expectations/matchers/ut_be_true.tpb | 2 +- source/expectations/matchers/ut_be_true.tps | 2 +- source/expectations/matchers/ut_comparison_matcher.tpb | 2 +- source/expectations/matchers/ut_comparison_matcher.tps | 2 +- source/expectations/matchers/ut_contain.tpb | 2 +- source/expectations/matchers/ut_contain.tps | 2 +- source/expectations/matchers/ut_equal.tpb | 2 +- source/expectations/matchers/ut_equal.tps | 2 +- source/expectations/matchers/ut_have_count.tpb | 2 +- source/expectations/matchers/ut_have_count.tps | 2 +- source/expectations/matchers/ut_match.tpb | 2 +- source/expectations/matchers/ut_match.tps | 2 +- source/expectations/matchers/ut_matcher.tpb | 2 +- source/expectations/matchers/ut_matcher.tps | 2 +- source/expectations/matchers/ut_matcher_options.tpb | 2 +- source/expectations/matchers/ut_matcher_options.tps | 2 +- source/expectations/matchers/ut_matcher_options_items.tpb | 2 +- source/expectations/matchers/ut_matcher_options_items.tps | 2 +- source/expectations/ut_expectation.tpb | 2 +- source/expectations/ut_expectation.tps | 2 +- source/expectations/ut_expectation_compound.tpb | 2 +- source/expectations/ut_expectation_compound.tps | 2 +- source/expectations/ut_expectation_json.tpb | 2 +- source/expectations/ut_expectation_json.tps | 2 +- source/install.sql | 2 +- source/install_component.sql | 2 +- source/install_ddl_trigger.sql | 2 +- source/install_headless.sql | 2 +- source/install_headless_with_trigger.sql | 2 +- source/reporters/ut_ansiconsole_helper.pkb | 2 +- source/reporters/ut_ansiconsole_helper.pks | 2 +- source/reporters/ut_coverage_cobertura_reporter.tpb | 2 +- source/reporters/ut_coverage_cobertura_reporter.tps | 2 +- source/reporters/ut_coverage_html_reporter.tpb | 2 +- source/reporters/ut_coverage_html_reporter.tps | 2 +- source/reporters/ut_coverage_report_html_helper.pkb | 2 +- source/reporters/ut_coverage_report_html_helper.pks | 2 +- source/reporters/ut_coverage_sonar_reporter.tpb | 2 +- source/reporters/ut_coverage_sonar_reporter.tps | 2 +- source/reporters/ut_coveralls_reporter.tpb | 2 +- source/reporters/ut_coveralls_reporter.tps | 2 +- source/reporters/ut_debug_reporter.tpb | 2 +- source/reporters/ut_debug_reporter.tps | 2 +- source/reporters/ut_documentation_reporter.tpb | 2 +- source/reporters/ut_documentation_reporter.tps | 2 +- source/reporters/ut_junit_reporter.tpb | 2 +- source/reporters/ut_junit_reporter.tps | 2 +- source/reporters/ut_realtime_reporter.tpb | 2 +- source/reporters/ut_realtime_reporter.tps | 2 +- source/reporters/ut_sonar_test_reporter.tpb | 2 +- source/reporters/ut_sonar_test_reporter.tps | 2 +- source/reporters/ut_teamcity_reporter.tpb | 2 +- source/reporters/ut_teamcity_reporter.tps | 2 +- source/reporters/ut_teamcity_reporter_helper.pkb | 2 +- source/reporters/ut_teamcity_reporter_helper.pks | 2 +- source/reporters/ut_tfs_junit_reporter.tpb | 2 +- source/reporters/ut_tfs_junit_reporter.tps | 2 +- source/reporters/ut_xunit_reporter.tpb | 2 +- source/reporters/ut_xunit_reporter.tps | 2 +- source/set_install_params.sql | 2 +- source/uninstall.sql | 2 +- source/uninstall_all.sql | 2 +- 257 files changed, 257 insertions(+), 257 deletions(-) diff --git a/LICENSE b/LICENSE index c024abb72..640d46628 100644 --- a/LICENSE +++ b/LICENSE @@ -187,7 +187,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2016 utPLSQL Project + 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. diff --git a/source/api/ut.pkb b/source/api/ut.pkb index 27d33835e..3b94a2bf7 100644 --- a/source/api/ut.pkb +++ b/source/api/ut.pkb @@ -2,7 +2,7 @@ create or replace package body ut is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/api/ut.pks b/source/api/ut.pks index 5549a75c2..ff75179b0 100644 --- a/source/api/ut.pks +++ b/source/api/ut.pks @@ -2,7 +2,7 @@ create or replace package ut authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/api/ut_runner.pkb b/source/api/ut_runner.pkb index d57b86edd..2b8a10c92 100644 --- a/source/api/ut_runner.pkb +++ b/source/api/ut_runner.pkb @@ -2,7 +2,7 @@ create or replace package body ut_runner is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/api/ut_runner.pks b/source/api/ut_runner.pks index 0434790f5..a6ba28556 100644 --- a/source/api/ut_runner.pks +++ b/source/api/ut_runner.pks @@ -2,7 +2,7 @@ create or replace package ut_runner authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/api/ut_suite_item_info.tpb b/source/api/ut_suite_item_info.tpb index 06ae8341b..9b142acb0 100644 --- a/source/api/ut_suite_item_info.tpb +++ b/source/api/ut_suite_item_info.tpb @@ -1,7 +1,7 @@ create or replace type body ut_suite_item_info is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/api/ut_suite_item_info.tps b/source/api/ut_suite_item_info.tps index d7f7f97dc..d37e89b59 100644 --- a/source/api/ut_suite_item_info.tps +++ b/source/api/ut_suite_item_info.tps @@ -1,7 +1,7 @@ create or replace type ut_suite_item_info as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/api/ut_suite_items_info.tps b/source/api/ut_suite_items_info.tps index d84ed9092..7c9ac33c3 100644 --- a/source/api/ut_suite_items_info.tps +++ b/source/api/ut_suite_items_info.tps @@ -1,7 +1,7 @@ create or replace type ut_suite_items_info as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotated_object.tps b/source/core/annotations/ut_annotated_object.tps index 1bfefed69..06a0f4a36 100644 --- a/source/core/annotations/ut_annotated_object.tps +++ b/source/core/annotations/ut_annotated_object.tps @@ -1,7 +1,7 @@ create type ut_annotated_object as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotated_objects.tps b/source/core/annotations/ut_annotated_objects.tps index b7c01fe7a..c7b142a32 100644 --- a/source/core/annotations/ut_annotated_objects.tps +++ b/source/core/annotations/ut_annotated_objects.tps @@ -1,7 +1,7 @@ create type ut_annotated_objects as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotation.tps b/source/core/annotations/ut_annotation.tps index 35af758c7..982c0348c 100644 --- a/source/core/annotations/ut_annotation.tps +++ b/source/core/annotations/ut_annotation.tps @@ -1,7 +1,7 @@ create type ut_annotation as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotation_cache.sql b/source/core/annotations/ut_annotation_cache.sql index f9c9295cb..8baa6e75c 100644 --- a/source/core/annotations/ut_annotation_cache.sql +++ b/source/core/annotations/ut_annotation_cache.sql @@ -1,7 +1,7 @@ create table ut_annotation_cache ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/annotations/ut_annotation_cache_info.sql b/source/core/annotations/ut_annotation_cache_info.sql index 811f105a5..e8dc2bfdb 100644 --- a/source/core/annotations/ut_annotation_cache_info.sql +++ b/source/core/annotations/ut_annotation_cache_info.sql @@ -1,7 +1,7 @@ create table ut_annotation_cache_info ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/annotations/ut_annotation_cache_manager.pkb b/source/core/annotations/ut_annotation_cache_manager.pkb index bf6d5e112..21151de8b 100644 --- a/source/core/annotations/ut_annotation_cache_manager.pkb +++ b/source/core/annotations/ut_annotation_cache_manager.pkb @@ -1,7 +1,7 @@ create or replace package body ut_annotation_cache_manager as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotation_cache_manager.pks b/source/core/annotations/ut_annotation_cache_manager.pks index ab794ceb1..4366cd536 100644 --- a/source/core/annotations/ut_annotation_cache_manager.pks +++ b/source/core/annotations/ut_annotation_cache_manager.pks @@ -1,7 +1,7 @@ create or replace package ut_annotation_cache_manager authid definer as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotation_cache_schema.sql b/source/core/annotations/ut_annotation_cache_schema.sql index 77b45fe3e..abab7385e 100644 --- a/source/core/annotations/ut_annotation_cache_schema.sql +++ b/source/core/annotations/ut_annotation_cache_schema.sql @@ -1,7 +1,7 @@ create table ut_annotation_cache_schema ( /* utPLSQL - Version 3 - Copyright 2016 - 2017 utPLSQL Project + 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 diff --git a/source/core/annotations/ut_annotation_cache_seq.sql b/source/core/annotations/ut_annotation_cache_seq.sql index 1cc97086e..0a898e98e 100644 --- a/source/core/annotations/ut_annotation_cache_seq.sql +++ b/source/core/annotations/ut_annotation_cache_seq.sql @@ -1,7 +1,7 @@ create sequence ut_annotation_cache_seq /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/annotations/ut_annotation_manager.pkb b/source/core/annotations/ut_annotation_manager.pkb index 013e271c1..5b505d63e 100644 --- a/source/core/annotations/ut_annotation_manager.pkb +++ b/source/core/annotations/ut_annotation_manager.pkb @@ -1,7 +1,7 @@ create or replace package body ut_annotation_manager as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotation_manager.pks b/source/core/annotations/ut_annotation_manager.pks index 237d36724..c2527fcd2 100644 --- a/source/core/annotations/ut_annotation_manager.pks +++ b/source/core/annotations/ut_annotation_manager.pks @@ -1,7 +1,7 @@ create or replace package ut_annotation_manager authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotation_obj_cache_info.tps b/source/core/annotations/ut_annotation_obj_cache_info.tps index 2be2ac184..fd0ec51e7 100644 --- a/source/core/annotations/ut_annotation_obj_cache_info.tps +++ b/source/core/annotations/ut_annotation_obj_cache_info.tps @@ -1,7 +1,7 @@ create type ut_annotation_obj_cache_info as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotation_objs_cache_info.tps b/source/core/annotations/ut_annotation_objs_cache_info.tps index 9773a045e..bab33a9d3 100644 --- a/source/core/annotations/ut_annotation_objs_cache_info.tps +++ b/source/core/annotations/ut_annotation_objs_cache_info.tps @@ -1,7 +1,7 @@ create type ut_annotation_objs_cache_info as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotation_parser.pkb b/source/core/annotations/ut_annotation_parser.pkb index 66d07d5d3..bbe58a667 100644 --- a/source/core/annotations/ut_annotation_parser.pkb +++ b/source/core/annotations/ut_annotation_parser.pkb @@ -1,7 +1,7 @@ create or replace package body ut_annotation_parser as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotation_parser.pks b/source/core/annotations/ut_annotation_parser.pks index 87ff70a24..b0a61e576 100644 --- a/source/core/annotations/ut_annotation_parser.pks +++ b/source/core/annotations/ut_annotation_parser.pks @@ -1,7 +1,7 @@ create or replace package ut_annotation_parser authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_annotations.tps b/source/core/annotations/ut_annotations.tps index 4238f9512..85be05e72 100644 --- a/source/core/annotations/ut_annotations.tps +++ b/source/core/annotations/ut_annotations.tps @@ -1,7 +1,7 @@ create type ut_annotations /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_trigger_check.pkb b/source/core/annotations/ut_trigger_check.pkb index e2811b3c3..e07acd3b2 100644 --- a/source/core/annotations/ut_trigger_check.pkb +++ b/source/core/annotations/ut_trigger_check.pkb @@ -1,7 +1,7 @@ create or replace package body ut_trigger_check is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/annotations/ut_trigger_check.pks b/source/core/annotations/ut_trigger_check.pks index 237af3c68..c4c27c596 100644 --- a/source/core/annotations/ut_trigger_check.pks +++ b/source/core/annotations/ut_trigger_check.pks @@ -1,7 +1,7 @@ create or replace package ut_trigger_check authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage.pkb b/source/core/coverage/ut_coverage.pkb index 58fdbb5cc..2fc5c4aec 100644 --- a/source/core/coverage/ut_coverage.pkb +++ b/source/core/coverage/ut_coverage.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage.pks b/source/core/coverage/ut_coverage.pks index b291f4b26..9254e6d37 100644 --- a/source/core/coverage/ut_coverage.pks +++ b/source/core/coverage/ut_coverage.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_block.pkb b/source/core/coverage/ut_coverage_block.pkb index 8e7688c91..c6d0f409d 100644 --- a/source/core/coverage/ut_coverage_block.pkb +++ b/source/core/coverage/ut_coverage_block.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_block is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_block.pks b/source/core/coverage/ut_coverage_block.pks index fdce622a5..26c79317e 100644 --- a/source/core/coverage/ut_coverage_block.pks +++ b/source/core/coverage/ut_coverage_block.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_block authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_helper.pkb b/source/core/coverage/ut_coverage_helper.pkb index 5f9744265..1c83606d8 100644 --- a/source/core/coverage/ut_coverage_helper.pkb +++ b/source/core/coverage/ut_coverage_helper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_helper is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_helper.pks b/source/core/coverage/ut_coverage_helper.pks index 014e7b471..85a54a7ca 100644 --- a/source/core/coverage/ut_coverage_helper.pks +++ b/source/core/coverage/ut_coverage_helper.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_helper authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_helper_block.pkb b/source/core/coverage/ut_coverage_helper_block.pkb index c5c30d12c..e8342a105 100644 --- a/source/core/coverage/ut_coverage_helper_block.pkb +++ b/source/core/coverage/ut_coverage_helper_block.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_helper_block is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_helper_block.pks b/source/core/coverage/ut_coverage_helper_block.pks index 0b71b7067..0afa3ab15 100644 --- a/source/core/coverage/ut_coverage_helper_block.pks +++ b/source/core/coverage/ut_coverage_helper_block.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_helper_block authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_helper_profiler.pkb b/source/core/coverage/ut_coverage_helper_profiler.pkb index 340a28ca3..6b685ede0 100644 --- a/source/core/coverage/ut_coverage_helper_profiler.pkb +++ b/source/core/coverage/ut_coverage_helper_profiler.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_helper_profiler is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_helper_profiler.pks b/source/core/coverage/ut_coverage_helper_profiler.pks index db91326eb..9345f4b88 100644 --- a/source/core/coverage/ut_coverage_helper_profiler.pks +++ b/source/core/coverage/ut_coverage_helper_profiler.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_helper_profiler authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_profiler.pkb b/source/core/coverage/ut_coverage_profiler.pkb index e4c9ab0af..160e2dd41 100644 --- a/source/core/coverage/ut_coverage_profiler.pkb +++ b/source/core/coverage/ut_coverage_profiler.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_profiler is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_profiler.pks b/source/core/coverage/ut_coverage_profiler.pks index 4e4b8d9c0..8e671f899 100644 --- a/source/core/coverage/ut_coverage_profiler.pks +++ b/source/core/coverage/ut_coverage_profiler.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_profiler authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_reporter_base.tpb b/source/core/coverage/ut_coverage_reporter_base.tpb index 9e339347f..5067f9221 100644 --- a/source/core/coverage/ut_coverage_reporter_base.tpb +++ b/source/core/coverage/ut_coverage_reporter_base.tpb @@ -1,7 +1,7 @@ create or replace type body ut_coverage_reporter_base is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_reporter_base.tps b/source/core/coverage/ut_coverage_reporter_base.tps index 76206dd95..2b9d1c625 100644 --- a/source/core/coverage/ut_coverage_reporter_base.tps +++ b/source/core/coverage/ut_coverage_reporter_base.tps @@ -1,7 +1,7 @@ create or replace type ut_coverage_reporter_base under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/coverage/ut_coverage_sources_tmp.sql b/source/core/coverage/ut_coverage_sources_tmp.sql index 29b53d147..f53283dcd 100644 --- a/source/core/coverage/ut_coverage_sources_tmp.sql +++ b/source/core/coverage/ut_coverage_sources_tmp.sql @@ -1,7 +1,7 @@ create global temporary table ut_coverage_sources_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/events/ut_event_item.tps b/source/core/events/ut_event_item.tps index d1f52cba6..efec940f5 100644 --- a/source/core/events/ut_event_item.tps +++ b/source/core/events/ut_event_item.tps @@ -1,7 +1,7 @@ create or replace type ut_event_item authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/events/ut_event_listener.tps b/source/core/events/ut_event_listener.tps index fd6ae0486..71ee16a0f 100644 --- a/source/core/events/ut_event_listener.tps +++ b/source/core/events/ut_event_listener.tps @@ -1,7 +1,7 @@ create or replace type ut_event_listener authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/events/ut_event_manager.pkb b/source/core/events/ut_event_manager.pkb index 0dfc6c925..039eb43a0 100644 --- a/source/core/events/ut_event_manager.pkb +++ b/source/core/events/ut_event_manager.pkb @@ -1,7 +1,7 @@ create or replace package body ut_event_manager as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/events/ut_event_manager.pks b/source/core/events/ut_event_manager.pks index 948a9550c..f67bd0f4d 100644 --- a/source/core/events/ut_event_manager.pks +++ b/source/core/events/ut_event_manager.pks @@ -1,7 +1,7 @@ create or replace package ut_event_manager authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/output_buffers/ut_output_buffer_base.tpb b/source/core/output_buffers/ut_output_buffer_base.tpb index 12eb08791..018250e4b 100644 --- a/source/core/output_buffers/ut_output_buffer_base.tpb +++ b/source/core/output_buffers/ut_output_buffer_base.tpb @@ -1,7 +1,7 @@ create or replace type body ut_output_buffer_base is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/output_buffers/ut_output_buffer_base.tps b/source/core/output_buffers/ut_output_buffer_base.tps index cffdc63bc..745692f38 100644 --- a/source/core/output_buffers/ut_output_buffer_base.tps +++ b/source/core/output_buffers/ut_output_buffer_base.tps @@ -1,7 +1,7 @@ create or replace type ut_output_buffer_base force authid definer as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/output_buffers/ut_output_buffer_info_tmp.sql b/source/core/output_buffers/ut_output_buffer_info_tmp.sql index c6e8995fb..ec09619d2 100644 --- a/source/core/output_buffers/ut_output_buffer_info_tmp.sql +++ b/source/core/output_buffers/ut_output_buffer_info_tmp.sql @@ -1,7 +1,7 @@ create table ut_output_buffer_info_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/output_buffers/ut_output_buffer_tmp.sql b/source/core/output_buffers/ut_output_buffer_tmp.sql index 7ae024555..49fefa24d 100644 --- a/source/core/output_buffers/ut_output_buffer_tmp.sql +++ b/source/core/output_buffers/ut_output_buffer_tmp.sql @@ -1,7 +1,7 @@ create table ut_output_buffer_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/output_buffers/ut_output_clob_buffer_tmp.sql b/source/core/output_buffers/ut_output_clob_buffer_tmp.sql index 0f56a837e..48cfe6fde 100644 --- a/source/core/output_buffers/ut_output_clob_buffer_tmp.sql +++ b/source/core/output_buffers/ut_output_clob_buffer_tmp.sql @@ -6,7 +6,7 @@ begin v_table_sql := 'create table ut_output_clob_buffer_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/output_buffers/ut_output_clob_table_buffer.tpb b/source/core/output_buffers/ut_output_clob_table_buffer.tpb index a8d979946..8c2825151 100644 --- a/source/core/output_buffers/ut_output_clob_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_clob_table_buffer.tpb @@ -1,7 +1,7 @@ create or replace type body ut_output_clob_table_buffer is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/output_buffers/ut_output_clob_table_buffer.tps b/source/core/output_buffers/ut_output_clob_table_buffer.tps index ac9a502cd..2eb3640b0 100644 --- a/source/core/output_buffers/ut_output_clob_table_buffer.tps +++ b/source/core/output_buffers/ut_output_clob_table_buffer.tps @@ -1,7 +1,7 @@ create or replace type ut_output_clob_table_buffer under ut_output_buffer_base ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/output_buffers/ut_output_data_row.tps b/source/core/output_buffers/ut_output_data_row.tps index ddcb65710..b0f5efe91 100644 --- a/source/core/output_buffers/ut_output_data_row.tps +++ b/source/core/output_buffers/ut_output_data_row.tps @@ -1,7 +1,7 @@ create or replace type ut_output_data_row as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/output_buffers/ut_output_data_rows.tps b/source/core/output_buffers/ut_output_data_rows.tps index 9575231ba..1918f0c81 100644 --- a/source/core/output_buffers/ut_output_data_rows.tps +++ b/source/core/output_buffers/ut_output_data_rows.tps @@ -1,7 +1,7 @@ create or replace type ut_output_data_rows as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/output_buffers/ut_output_table_buffer.tpb b/source/core/output_buffers/ut_output_table_buffer.tpb index 44e91cc38..e3f869b22 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tpb +++ b/source/core/output_buffers/ut_output_table_buffer.tpb @@ -1,7 +1,7 @@ create or replace type body ut_output_table_buffer is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/output_buffers/ut_output_table_buffer.tps b/source/core/output_buffers/ut_output_table_buffer.tps index 77a057b78..3e395304a 100644 --- a/source/core/output_buffers/ut_output_table_buffer.tps +++ b/source/core/output_buffers/ut_output_table_buffer.tps @@ -1,7 +1,7 @@ create or replace type ut_output_table_buffer under ut_output_buffer_base ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_console_reporter_base.tpb b/source/core/types/ut_console_reporter_base.tpb index 0245edde3..df256e832 100644 --- a/source/core/types/ut_console_reporter_base.tpb +++ b/source/core/types/ut_console_reporter_base.tpb @@ -1,7 +1,7 @@ create or replace type body ut_console_reporter_base is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_console_reporter_base.tps b/source/core/types/ut_console_reporter_base.tps index 3736e4d33..6c0a08502 100644 --- a/source/core/types/ut_console_reporter_base.tps +++ b/source/core/types/ut_console_reporter_base.tps @@ -1,7 +1,7 @@ create or replace type ut_console_reporter_base under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_coverage_options.tps b/source/core/types/ut_coverage_options.tps index 737ea1abb..bcdbc0b32 100644 --- a/source/core/types/ut_coverage_options.tps +++ b/source/core/types/ut_coverage_options.tps @@ -1,7 +1,7 @@ create or replace type ut_coverage_options force as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_executable.tpb b/source/core/types/ut_executable.tpb index 2fc1e3a7e..060f416aa 100644 --- a/source/core/types/ut_executable.tpb +++ b/source/core/types/ut_executable.tpb @@ -1,7 +1,7 @@ create or replace type body ut_executable is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_executable.tps b/source/core/types/ut_executable.tps index 9154881f2..786d926ad 100644 --- a/source/core/types/ut_executable.tps +++ b/source/core/types/ut_executable.tps @@ -1,7 +1,7 @@ create or replace type ut_executable under ut_event_item( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_executable_test.tps b/source/core/types/ut_executable_test.tps index b11676c0c..2772720de 100644 --- a/source/core/types/ut_executable_test.tps +++ b/source/core/types/ut_executable_test.tps @@ -1,7 +1,7 @@ create or replace type ut_executable_test authid current_user under ut_executable ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_executables.tps b/source/core/types/ut_executables.tps index a06e6c067..f5732d5a1 100644 --- a/source/core/types/ut_executables.tps +++ b/source/core/types/ut_executables.tps @@ -1,7 +1,7 @@ create or replace type ut_executables as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_expectation_result.tpb b/source/core/types/ut_expectation_result.tpb index 6b1bbd4ef..097c900f4 100644 --- a/source/core/types/ut_expectation_result.tpb +++ b/source/core/types/ut_expectation_result.tpb @@ -1,7 +1,7 @@ create or replace type body ut_expectation_result is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_expectation_result.tps b/source/core/types/ut_expectation_result.tps index f5d7fd23e..815d90820 100644 --- a/source/core/types/ut_expectation_result.tps +++ b/source/core/types/ut_expectation_result.tps @@ -1,7 +1,7 @@ create or replace type ut_expectation_result under ut_event_item( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_expectation_results.tps b/source/core/types/ut_expectation_results.tps index 942f9b398..963c726f8 100644 --- a/source/core/types/ut_expectation_results.tps +++ b/source/core/types/ut_expectation_results.tps @@ -1,7 +1,7 @@ create or replace type ut_expectation_results as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_file_mapping.tpb b/source/core/types/ut_file_mapping.tpb index c5a82c09d..247aa5ac8 100644 --- a/source/core/types/ut_file_mapping.tpb +++ b/source/core/types/ut_file_mapping.tpb @@ -1,7 +1,7 @@ create or replace type body ut_file_mapping as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_file_mapping.tps b/source/core/types/ut_file_mapping.tps index e046808d4..c032e0b77 100644 --- a/source/core/types/ut_file_mapping.tps +++ b/source/core/types/ut_file_mapping.tps @@ -1,7 +1,7 @@ create or replace type ut_file_mapping as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_file_mappings.tps b/source/core/types/ut_file_mappings.tps index 6ff2604b3..a48c3e872 100644 --- a/source/core/types/ut_file_mappings.tps +++ b/source/core/types/ut_file_mappings.tps @@ -1,7 +1,7 @@ create or replace type ut_file_mappings as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_integer_list.tps b/source/core/types/ut_integer_list.tps index c1fc4de91..25f1679b2 100644 --- a/source/core/types/ut_integer_list.tps +++ b/source/core/types/ut_integer_list.tps @@ -1,7 +1,7 @@ create or replace type ut_integer_list as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_key_value_pair.tps b/source/core/types/ut_key_value_pair.tps index ae1b9aba7..873a354fd 100644 --- a/source/core/types/ut_key_value_pair.tps +++ b/source/core/types/ut_key_value_pair.tps @@ -1,7 +1,7 @@ create or replace type ut_key_value_pair force as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_key_value_pairs.tps b/source/core/types/ut_key_value_pairs.tps index c9bab9ec2..28fa87cf0 100644 --- a/source/core/types/ut_key_value_pairs.tps +++ b/source/core/types/ut_key_value_pairs.tps @@ -1,7 +1,7 @@ create or replace type ut_key_value_pairs as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_logical_suite.tpb b/source/core/types/ut_logical_suite.tpb index 4dca71b3e..74c7ff81c 100644 --- a/source/core/types/ut_logical_suite.tpb +++ b/source/core/types/ut_logical_suite.tpb @@ -1,7 +1,7 @@ create or replace type body ut_logical_suite as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_logical_suite.tps b/source/core/types/ut_logical_suite.tps index 270558faa..71cfdb23d 100644 --- a/source/core/types/ut_logical_suite.tps +++ b/source/core/types/ut_logical_suite.tps @@ -1,7 +1,7 @@ create or replace type ut_logical_suite under ut_suite_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_object_name.tpb b/source/core/types/ut_object_name.tpb index 299b6e269..cf1ab2a78 100644 --- a/source/core/types/ut_object_name.tpb +++ b/source/core/types/ut_object_name.tpb @@ -1,7 +1,7 @@ create or replace type body ut_object_name as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_object_name.tps b/source/core/types/ut_object_name.tps index 12afa69dd..28e41958f 100644 --- a/source/core/types/ut_object_name.tps +++ b/source/core/types/ut_object_name.tps @@ -1,7 +1,7 @@ create or replace type ut_object_name as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_object_names.tps b/source/core/types/ut_object_names.tps index f46580172..2f7e5ea16 100644 --- a/source/core/types/ut_object_names.tps +++ b/source/core/types/ut_object_names.tps @@ -1,7 +1,7 @@ create or replace type ut_object_names as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_output_reporter_base.tpb b/source/core/types/ut_output_reporter_base.tpb index 1f682070b..d20f454a8 100644 --- a/source/core/types/ut_output_reporter_base.tpb +++ b/source/core/types/ut_output_reporter_base.tpb @@ -1,7 +1,7 @@ create or replace type body ut_output_reporter_base is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_output_reporter_base.tps b/source/core/types/ut_output_reporter_base.tps index ba550fb0f..95ee9c1f8 100644 --- a/source/core/types/ut_output_reporter_base.tps +++ b/source/core/types/ut_output_reporter_base.tps @@ -1,7 +1,7 @@ create or replace type ut_output_reporter_base under ut_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_reporter_base.tpb b/source/core/types/ut_reporter_base.tpb index 741d024e0..94d518af4 100644 --- a/source/core/types/ut_reporter_base.tpb +++ b/source/core/types/ut_reporter_base.tpb @@ -1,7 +1,7 @@ create or replace type body ut_reporter_base is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_reporter_base.tps b/source/core/types/ut_reporter_base.tps index 4f8216294..36af70776 100644 --- a/source/core/types/ut_reporter_base.tps +++ b/source/core/types/ut_reporter_base.tps @@ -1,7 +1,7 @@ create or replace type ut_reporter_base under ut_event_listener ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_reporter_info.tps b/source/core/types/ut_reporter_info.tps index 7426498d5..a4028974f 100644 --- a/source/core/types/ut_reporter_info.tps +++ b/source/core/types/ut_reporter_info.tps @@ -1,7 +1,7 @@ create or replace type ut_reporter_info as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_reporters.tps b/source/core/types/ut_reporters.tps index 7df85c2f3..b16e74653 100644 --- a/source/core/types/ut_reporters.tps +++ b/source/core/types/ut_reporters.tps @@ -1,7 +1,7 @@ create or replace type ut_reporters as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_reporters_info.tps b/source/core/types/ut_reporters_info.tps index fa9484641..6e9a866ef 100644 --- a/source/core/types/ut_reporters_info.tps +++ b/source/core/types/ut_reporters_info.tps @@ -1,7 +1,7 @@ create or replace type ut_reporters_info as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_results_counter.tpb b/source/core/types/ut_results_counter.tpb index 2378bf640..0007acd9b 100644 --- a/source/core/types/ut_results_counter.tpb +++ b/source/core/types/ut_results_counter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_results_counter as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_results_counter.tps b/source/core/types/ut_results_counter.tps index c3ed97d71..1b26b673a 100644 --- a/source/core/types/ut_results_counter.tps +++ b/source/core/types/ut_results_counter.tps @@ -1,7 +1,7 @@ create or replace type ut_results_counter as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_run.tpb b/source/core/types/ut_run.tpb index c8f2778ff..bff16dc69 100644 --- a/source/core/types/ut_run.tpb +++ b/source/core/types/ut_run.tpb @@ -1,7 +1,7 @@ create or replace type body ut_run as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_run.tps b/source/core/types/ut_run.tps index b5a1d18ac..2a4e11656 100644 --- a/source/core/types/ut_run.tps +++ b/source/core/types/ut_run.tps @@ -1,7 +1,7 @@ create or replace type ut_run under ut_suite_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_run_info.tpb b/source/core/types/ut_run_info.tpb index f5a117f95..8e06d6137 100644 --- a/source/core/types/ut_run_info.tpb +++ b/source/core/types/ut_run_info.tpb @@ -1,7 +1,7 @@ create or replace type body ut_run_info as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_run_info.tps b/source/core/types/ut_run_info.tps index 6781e8a99..f59c22c05 100644 --- a/source/core/types/ut_run_info.tps +++ b/source/core/types/ut_run_info.tps @@ -1,7 +1,7 @@ create or replace type ut_run_info under ut_event_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_suite.tpb b/source/core/types/ut_suite.tpb index 1211d5d5c..ccf004a4b 100644 --- a/source/core/types/ut_suite.tpb +++ b/source/core/types/ut_suite.tpb @@ -1,7 +1,7 @@ create or replace type body ut_suite as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_suite.tps b/source/core/types/ut_suite.tps index dd44a817e..ffe2d2d42 100644 --- a/source/core/types/ut_suite.tps +++ b/source/core/types/ut_suite.tps @@ -1,7 +1,7 @@ create or replace type ut_suite under ut_logical_suite ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_suite_context.tpb b/source/core/types/ut_suite_context.tpb index c8255f374..3669d3d7e 100644 --- a/source/core/types/ut_suite_context.tpb +++ b/source/core/types/ut_suite_context.tpb @@ -1,7 +1,7 @@ create or replace type body ut_suite_context as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_suite_context.tps b/source/core/types/ut_suite_context.tps index ce4510c39..a328e7657 100644 --- a/source/core/types/ut_suite_context.tps +++ b/source/core/types/ut_suite_context.tps @@ -1,7 +1,7 @@ create or replace type ut_suite_context under ut_suite ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_suite_item.tpb b/source/core/types/ut_suite_item.tpb index 2ec1b0513..6478d5c82 100644 --- a/source/core/types/ut_suite_item.tpb +++ b/source/core/types/ut_suite_item.tpb @@ -1,7 +1,7 @@ create or replace type body ut_suite_item as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_suite_item.tps b/source/core/types/ut_suite_item.tps index a5eb10986..53c59a2ea 100644 --- a/source/core/types/ut_suite_item.tps +++ b/source/core/types/ut_suite_item.tps @@ -1,7 +1,7 @@ create or replace type ut_suite_item force under ut_event_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_suite_items.tps b/source/core/types/ut_suite_items.tps index ff5709ca8..e80bcc7b4 100644 --- a/source/core/types/ut_suite_items.tps +++ b/source/core/types/ut_suite_items.tps @@ -1,7 +1,7 @@ create or replace type ut_suite_items as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_test.tpb b/source/core/types/ut_test.tpb index bb71e1a5b..7b2c495de 100644 --- a/source/core/types/ut_test.tpb +++ b/source/core/types/ut_test.tpb @@ -1,7 +1,7 @@ create or replace type body ut_test as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_test.tps b/source/core/types/ut_test.tps index 6751ec522..fcf565671 100644 --- a/source/core/types/ut_test.tps +++ b/source/core/types/ut_test.tps @@ -1,7 +1,7 @@ create or replace type ut_test force under ut_suite_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_varchar2_list.tps b/source/core/types/ut_varchar2_list.tps index f324a2842..dd15f0d8f 100644 --- a/source/core/types/ut_varchar2_list.tps +++ b/source/core/types/ut_varchar2_list.tps @@ -1,7 +1,7 @@ create or replace type ut_varchar2_list as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/types/ut_varchar2_rows.tps b/source/core/types/ut_varchar2_rows.tps index ba8962378..d56eeee46 100644 --- a/source/core/types/ut_varchar2_rows.tps +++ b/source/core/types/ut_varchar2_rows.tps @@ -1,7 +1,7 @@ create or replace type ut_varchar2_rows as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_dbms_output_cache.sql b/source/core/ut_dbms_output_cache.sql index 2102ab4ee..1fe4251c7 100644 --- a/source/core/ut_dbms_output_cache.sql +++ b/source/core/ut_dbms_output_cache.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 -Copyright 2016 - 2018 utPLSQL Project +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 diff --git a/source/core/ut_expectation_processor.pkb b/source/core/ut_expectation_processor.pkb index e961ca908..96ab022e4 100644 --- a/source/core/ut_expectation_processor.pkb +++ b/source/core/ut_expectation_processor.pkb @@ -1,7 +1,7 @@ create or replace package body ut_expectation_processor as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_expectation_processor.pks b/source/core/ut_expectation_processor.pks index ab3b70f76..cfcae8b42 100644 --- a/source/core/ut_expectation_processor.pks +++ b/source/core/ut_expectation_processor.pks @@ -1,7 +1,7 @@ create or replace package ut_expectation_processor authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_file_mapper.pkb b/source/core/ut_file_mapper.pkb index 35233b57b..adecb7dc8 100644 --- a/source/core/ut_file_mapper.pkb +++ b/source/core/ut_file_mapper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_file_mapper is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_file_mapper.pks b/source/core/ut_file_mapper.pks index 5402ef6e8..4ed670ee5 100644 --- a/source/core/ut_file_mapper.pks +++ b/source/core/ut_file_mapper.pks @@ -1,7 +1,7 @@ create or replace package ut_file_mapper authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_metadata.pkb b/source/core/ut_metadata.pkb index 0e8a8b79b..a33dfc1eb 100644 --- a/source/core/ut_metadata.pkb +++ b/source/core/ut_metadata.pkb @@ -1,7 +1,7 @@ create or replace package body ut_metadata as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_metadata.pks b/source/core/ut_metadata.pks index fdd984813..bf62c4e52 100644 --- a/source/core/ut_metadata.pks +++ b/source/core/ut_metadata.pks @@ -1,7 +1,7 @@ create or replace package ut_metadata authid current_user as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_savepoint_seq.sql b/source/core/ut_savepoint_seq.sql index 6ccfc182a..e1d80f452 100644 --- a/source/core/ut_savepoint_seq.sql +++ b/source/core/ut_savepoint_seq.sql @@ -1,7 +1,7 @@ create sequence ut_savepoint_seq /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/ut_suite_builder.pkb b/source/core/ut_suite_builder.pkb index 295f2d699..d3de777db 100644 --- a/source/core/ut_suite_builder.pkb +++ b/source/core/ut_suite_builder.pkb @@ -1,7 +1,7 @@ create or replace package body ut_suite_builder is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_suite_builder.pks b/source/core/ut_suite_builder.pks index 5e2624a30..e982fdbc1 100644 --- a/source/core/ut_suite_builder.pks +++ b/source/core/ut_suite_builder.pks @@ -1,7 +1,7 @@ create or replace package ut_suite_builder authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_suite_cache.sql b/source/core/ut_suite_cache.sql index 8687858a3..e4bf52439 100644 --- a/source/core/ut_suite_cache.sql +++ b/source/core/ut_suite_cache.sql @@ -6,7 +6,7 @@ create or replace type ut_tests as table of ut_test create table ut_suite_cache ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/ut_suite_cache_manager.pkb b/source/core/ut_suite_cache_manager.pkb index b805919fc..b8b548a4b 100644 --- a/source/core/ut_suite_cache_manager.pkb +++ b/source/core/ut_suite_cache_manager.pkb @@ -1,7 +1,7 @@ create or replace package body ut_suite_cache_manager is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_suite_cache_manager.pks b/source/core/ut_suite_cache_manager.pks index 02c47988e..03816ee70 100644 --- a/source/core/ut_suite_cache_manager.pks +++ b/source/core/ut_suite_cache_manager.pks @@ -1,7 +1,7 @@ create or replace package ut_suite_cache_manager authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_suite_cache_package.sql b/source/core/ut_suite_cache_package.sql index 46f49e915..06f786949 100644 --- a/source/core/ut_suite_cache_package.sql +++ b/source/core/ut_suite_cache_package.sql @@ -1,7 +1,7 @@ create table ut_suite_cache_package ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/ut_suite_cache_schema.sql b/source/core/ut_suite_cache_schema.sql index ba257dafd..46c7b0ef3 100644 --- a/source/core/ut_suite_cache_schema.sql +++ b/source/core/ut_suite_cache_schema.sql @@ -1,7 +1,7 @@ create table ut_suite_cache_schema ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/ut_suite_cache_seq.sql b/source/core/ut_suite_cache_seq.sql index 0c9c835b8..36de28809 100644 --- a/source/core/ut_suite_cache_seq.sql +++ b/source/core/ut_suite_cache_seq.sql @@ -1,7 +1,7 @@ create sequence ut_suite_cache_seq /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/core/ut_suite_manager.pkb b/source/core/ut_suite_manager.pkb index 21e070865..1ffd5ea49 100644 --- a/source/core/ut_suite_manager.pkb +++ b/source/core/ut_suite_manager.pkb @@ -1,7 +1,7 @@ create or replace package body ut_suite_manager is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_suite_manager.pks b/source/core/ut_suite_manager.pks index bf8819693..fe492b049 100644 --- a/source/core/ut_suite_manager.pks +++ b/source/core/ut_suite_manager.pks @@ -1,7 +1,7 @@ create or replace package ut_suite_manager authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 1c571b0d6..72cfc7388 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -1,7 +1,7 @@ create or replace package body ut_utils is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index a9af2d059..421bd85eb 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -1,7 +1,7 @@ create or replace package ut_utils authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/create_synonyms_and_grants_for_public.sql b/source/create_synonyms_and_grants_for_public.sql index 2cd553860..30b79cffb 100644 --- a/source/create_synonyms_and_grants_for_public.sql +++ b/source/create_synonyms_and_grants_for_public.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/create_user_grants.sql b/source/create_user_grants.sql index fe1d3da29..911c1074f 100644 --- a/source/create_user_grants.sql +++ b/source/create_user_grants.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/create_user_synonyms.sql b/source/create_user_synonyms.sql index 8fd687181..b564dc6c4 100644 --- a/source/create_user_synonyms.sql +++ b/source/create_user_synonyms.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/create_utplsql_owner.sql b/source/create_utplsql_owner.sql index 2df63f27f..9d163d802 100644 --- a/source/create_utplsql_owner.sql +++ b/source/create_utplsql_owner.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/define_ut3_owner_param.sql b/source/define_ut3_owner_param.sql index a889ead05..1b183b581 100644 --- a/source/define_ut3_owner_param.sql +++ b/source/define_ut3_owner_param.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_compound_data_diff_tmp.sql b/source/expectations/data_values/ut_compound_data_diff_tmp.sql index 242d6c2fc..19f2a6bb2 100644 --- a/source/expectations/data_values/ut_compound_data_diff_tmp.sql +++ b/source/expectations/data_values/ut_compound_data_diff_tmp.sql @@ -1,7 +1,7 @@ create global temporary table ut_compound_data_diff_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/expectations/data_values/ut_compound_data_helper.pkb b/source/expectations/data_values/ut_compound_data_helper.pkb index 2a2ce9d9e..755c5154d 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pkb +++ b/source/expectations/data_values/ut_compound_data_helper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_compound_data_helper is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_compound_data_helper.pks b/source/expectations/data_values/ut_compound_data_helper.pks index c6b6507fc..56745be76 100644 --- a/source/expectations/data_values/ut_compound_data_helper.pks +++ b/source/expectations/data_values/ut_compound_data_helper.pks @@ -1,7 +1,7 @@ create or replace package ut_compound_data_helper authid definer is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_compound_data_tmp.sql b/source/expectations/data_values/ut_compound_data_tmp.sql index 0fb5f9544..10a88269e 100644 --- a/source/expectations/data_values/ut_compound_data_tmp.sql +++ b/source/expectations/data_values/ut_compound_data_tmp.sql @@ -1,7 +1,7 @@ create global temporary table ut_compound_data_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/expectations/data_values/ut_compound_data_value.tpb b/source/expectations/data_values/ut_compound_data_value.tpb index 4aecdb81f..3dbf9431a 100644 --- a/source/expectations/data_values/ut_compound_data_value.tpb +++ b/source/expectations/data_values/ut_compound_data_value.tpb @@ -1,7 +1,7 @@ create or replace type body ut_compound_data_value as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_compound_data_value.tps b/source/expectations/data_values/ut_compound_data_value.tps index 8e42765f5..a9b78f944 100644 --- a/source/expectations/data_values/ut_compound_data_value.tps +++ b/source/expectations/data_values/ut_compound_data_value.tps @@ -1,7 +1,7 @@ create or replace type ut_compound_data_value force under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_cursor_column.tps b/source/expectations/data_values/ut_cursor_column.tps index 93114c431..c865ea64b 100644 --- a/source/expectations/data_values/ut_cursor_column.tps +++ b/source/expectations/data_values/ut_cursor_column.tps @@ -1,7 +1,7 @@ create or replace type ut_cursor_column authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_cursor_column_tab.tps b/source/expectations/data_values/ut_cursor_column_tab.tps index 1b7a1698f..b1b33f7fe 100644 --- a/source/expectations/data_values/ut_cursor_column_tab.tps +++ b/source/expectations/data_values/ut_cursor_column_tab.tps @@ -1,7 +1,7 @@ create or replace type ut_cursor_column_tab as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_cursor_details.tps b/source/expectations/data_values/ut_cursor_details.tps index 43e70b123..7092e834f 100644 --- a/source/expectations/data_values/ut_cursor_details.tps +++ b/source/expectations/data_values/ut_cursor_details.tps @@ -1,7 +1,7 @@ create or replace type ut_cursor_details authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value.tpb b/source/expectations/data_values/ut_data_value.tpb index 8c8e677fb..d8feb1a62 100644 --- a/source/expectations/data_values/ut_data_value.tpb +++ b/source/expectations/data_values/ut_data_value.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value.tps b/source/expectations/data_values/ut_data_value.tps index 425fbeb54..ca7e18308 100644 --- a/source/expectations/data_values/ut_data_value.tps +++ b/source/expectations/data_values/ut_data_value.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value force authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_anydata.tpb b/source/expectations/data_values/ut_data_value_anydata.tpb index fe9a6a1bc..0b5447758 100644 --- a/source/expectations/data_values/ut_data_value_anydata.tpb +++ b/source/expectations/data_values/ut_data_value_anydata.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_anydata as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_anydata.tps b/source/expectations/data_values/ut_data_value_anydata.tps index c0ee6137b..5ed0406ca 100644 --- a/source/expectations/data_values/ut_data_value_anydata.tps +++ b/source/expectations/data_values/ut_data_value_anydata.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_anydata under ut_data_value_refcursor( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_blob.tpb b/source/expectations/data_values/ut_data_value_blob.tpb index c597af023..11af6d2f7 100644 --- a/source/expectations/data_values/ut_data_value_blob.tpb +++ b/source/expectations/data_values/ut_data_value_blob.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_blob as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_blob.tps b/source/expectations/data_values/ut_data_value_blob.tps index ed6aa2afe..f557ffbce 100644 --- a/source/expectations/data_values/ut_data_value_blob.tps +++ b/source/expectations/data_values/ut_data_value_blob.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_blob under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_boolean.tpb b/source/expectations/data_values/ut_data_value_boolean.tpb index bc8c1e2f9..0645d3269 100644 --- a/source/expectations/data_values/ut_data_value_boolean.tpb +++ b/source/expectations/data_values/ut_data_value_boolean.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_boolean as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_boolean.tps b/source/expectations/data_values/ut_data_value_boolean.tps index 62b413e10..a254e05c0 100644 --- a/source/expectations/data_values/ut_data_value_boolean.tps +++ b/source/expectations/data_values/ut_data_value_boolean.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_boolean under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_clob.tpb b/source/expectations/data_values/ut_data_value_clob.tpb index 7b7c7ffd8..dacb390b6 100644 --- a/source/expectations/data_values/ut_data_value_clob.tpb +++ b/source/expectations/data_values/ut_data_value_clob.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_clob as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_clob.tps b/source/expectations/data_values/ut_data_value_clob.tps index 4212efb3c..1ff5d5623 100644 --- a/source/expectations/data_values/ut_data_value_clob.tps +++ b/source/expectations/data_values/ut_data_value_clob.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_clob under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_date.tpb b/source/expectations/data_values/ut_data_value_date.tpb index 727f624d4..dd87156bc 100644 --- a/source/expectations/data_values/ut_data_value_date.tpb +++ b/source/expectations/data_values/ut_data_value_date.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_date as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_date.tps b/source/expectations/data_values/ut_data_value_date.tps index e1c358789..4435a3512 100644 --- a/source/expectations/data_values/ut_data_value_date.tps +++ b/source/expectations/data_values/ut_data_value_date.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_date under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_dsinterval.tpb b/source/expectations/data_values/ut_data_value_dsinterval.tpb index 6b49a5d1c..ff9d5fe1e 100644 --- a/source/expectations/data_values/ut_data_value_dsinterval.tpb +++ b/source/expectations/data_values/ut_data_value_dsinterval.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_dsinterval as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_dsinterval.tps b/source/expectations/data_values/ut_data_value_dsinterval.tps index 2d3ad48f0..114619bf2 100644 --- a/source/expectations/data_values/ut_data_value_dsinterval.tps +++ b/source/expectations/data_values/ut_data_value_dsinterval.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_dsinterval under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_json.tpb b/source/expectations/data_values/ut_data_value_json.tpb index ee761b141..e4b556ef9 100644 --- a/source/expectations/data_values/ut_data_value_json.tpb +++ b/source/expectations/data_values/ut_data_value_json.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_json as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_json.tps b/source/expectations/data_values/ut_data_value_json.tps index 50f721bf6..bfaccb2e2 100644 --- a/source/expectations/data_values/ut_data_value_json.tps +++ b/source/expectations/data_values/ut_data_value_json.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_json under ut_compound_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_number.tpb b/source/expectations/data_values/ut_data_value_number.tpb index cbd524f42..b8a28a124 100644 --- a/source/expectations/data_values/ut_data_value_number.tpb +++ b/source/expectations/data_values/ut_data_value_number.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_number as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_number.tps b/source/expectations/data_values/ut_data_value_number.tps index 674dd89fe..872ab405e 100644 --- a/source/expectations/data_values/ut_data_value_number.tps +++ b/source/expectations/data_values/ut_data_value_number.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_number under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_refcursor.tpb b/source/expectations/data_values/ut_data_value_refcursor.tpb index d73a3e011..eda5b2cd9 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tpb +++ b/source/expectations/data_values/ut_data_value_refcursor.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_refcursor as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_refcursor.tps b/source/expectations/data_values/ut_data_value_refcursor.tps index 7556ec3de..4de253b8f 100644 --- a/source/expectations/data_values/ut_data_value_refcursor.tps +++ b/source/expectations/data_values/ut_data_value_refcursor.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_refcursor under ut_compound_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_timestamp.tpb b/source/expectations/data_values/ut_data_value_timestamp.tpb index 7b9d15e41..adb18e360 100644 --- a/source/expectations/data_values/ut_data_value_timestamp.tpb +++ b/source/expectations/data_values/ut_data_value_timestamp.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_timestamp as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_timestamp.tps b/source/expectations/data_values/ut_data_value_timestamp.tps index e32f855a6..ebd00762c 100644 --- a/source/expectations/data_values/ut_data_value_timestamp.tps +++ b/source/expectations/data_values/ut_data_value_timestamp.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_timestamp under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_timestamp_ltz.tpb b/source/expectations/data_values/ut_data_value_timestamp_ltz.tpb index 8abbfce12..0f41e16b1 100644 --- a/source/expectations/data_values/ut_data_value_timestamp_ltz.tpb +++ b/source/expectations/data_values/ut_data_value_timestamp_ltz.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_timestamp_ltz as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_timestamp_ltz.tps b/source/expectations/data_values/ut_data_value_timestamp_ltz.tps index 869197c98..3608ebd37 100644 --- a/source/expectations/data_values/ut_data_value_timestamp_ltz.tps +++ b/source/expectations/data_values/ut_data_value_timestamp_ltz.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_timestamp_ltz under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_timestamp_tz.tpb b/source/expectations/data_values/ut_data_value_timestamp_tz.tpb index a61d60e33..710a313a7 100644 --- a/source/expectations/data_values/ut_data_value_timestamp_tz.tpb +++ b/source/expectations/data_values/ut_data_value_timestamp_tz.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_timestamp_tz as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_timestamp_tz.tps b/source/expectations/data_values/ut_data_value_timestamp_tz.tps index 55aa3a803..ca0bfc5cb 100644 --- a/source/expectations/data_values/ut_data_value_timestamp_tz.tps +++ b/source/expectations/data_values/ut_data_value_timestamp_tz.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_timestamp_tz under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_varchar2.tpb b/source/expectations/data_values/ut_data_value_varchar2.tpb index 4f80ee161..da4276d51 100644 --- a/source/expectations/data_values/ut_data_value_varchar2.tpb +++ b/source/expectations/data_values/ut_data_value_varchar2.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_varchar2 as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_varchar2.tps b/source/expectations/data_values/ut_data_value_varchar2.tps index ce5954a09..27bb720ce 100644 --- a/source/expectations/data_values/ut_data_value_varchar2.tps +++ b/source/expectations/data_values/ut_data_value_varchar2.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_varchar2 under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_xmltype.tpb b/source/expectations/data_values/ut_data_value_xmltype.tpb index ecefb664d..3b10aadce 100644 --- a/source/expectations/data_values/ut_data_value_xmltype.tpb +++ b/source/expectations/data_values/ut_data_value_xmltype.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_xmltype as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_xmltype.tps b/source/expectations/data_values/ut_data_value_xmltype.tps index 42c54ae05..476097de3 100644 --- a/source/expectations/data_values/ut_data_value_xmltype.tps +++ b/source/expectations/data_values/ut_data_value_xmltype.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_xmltype under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_yminterval.tpb b/source/expectations/data_values/ut_data_value_yminterval.tpb index 38f3cf857..6d6a05b4a 100644 --- a/source/expectations/data_values/ut_data_value_yminterval.tpb +++ b/source/expectations/data_values/ut_data_value_yminterval.tpb @@ -1,7 +1,7 @@ create or replace type body ut_data_value_yminterval as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_data_value_yminterval.tps b/source/expectations/data_values/ut_data_value_yminterval.tps index efc9e0e48..d20dfcad7 100644 --- a/source/expectations/data_values/ut_data_value_yminterval.tps +++ b/source/expectations/data_values/ut_data_value_yminterval.tps @@ -1,7 +1,7 @@ create or replace type ut_data_value_yminterval under ut_data_value( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_json_data_diff_tmp.sql b/source/expectations/data_values/ut_json_data_diff_tmp.sql index 08de6ccf8..3d77dca8b 100644 --- a/source/expectations/data_values/ut_json_data_diff_tmp.sql +++ b/source/expectations/data_values/ut_json_data_diff_tmp.sql @@ -1,7 +1,7 @@ create global temporary table ut_json_data_diff_tmp( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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 diff --git a/source/expectations/data_values/ut_json_leaf.tps b/source/expectations/data_values/ut_json_leaf.tps index b283367a4..c38c3b238 100644 --- a/source/expectations/data_values/ut_json_leaf.tps +++ b/source/expectations/data_values/ut_json_leaf.tps @@ -1,7 +1,7 @@ create or replace type ut_json_leaf authid current_user as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_json_leaf_tab.tps b/source/expectations/data_values/ut_json_leaf_tab.tps index 50a247ad6..0c7a40b9f 100644 --- a/source/expectations/data_values/ut_json_leaf_tab.tps +++ b/source/expectations/data_values/ut_json_leaf_tab.tps @@ -1,7 +1,7 @@ create or replace type ut_json_leaf_tab as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_json_tree_details.tps b/source/expectations/data_values/ut_json_tree_details.tps index 8e04e8b83..0684ecafe 100644 --- a/source/expectations/data_values/ut_json_tree_details.tps +++ b/source/expectations/data_values/ut_json_tree_details.tps @@ -1,7 +1,7 @@ create or replace type ut_json_tree_details force as object ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_key_anyval_pair.tps b/source/expectations/data_values/ut_key_anyval_pair.tps index e0701ef28..4903282e9 100644 --- a/source/expectations/data_values/ut_key_anyval_pair.tps +++ b/source/expectations/data_values/ut_key_anyval_pair.tps @@ -1,7 +1,7 @@ create or replace type ut_key_anyval_pair force as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_key_anyval_pairs.tps b/source/expectations/data_values/ut_key_anyval_pairs.tps index 40748c5a5..94bd5df54 100644 --- a/source/expectations/data_values/ut_key_anyval_pairs.tps +++ b/source/expectations/data_values/ut_key_anyval_pairs.tps @@ -1,7 +1,7 @@ create or replace type ut_key_anyval_pairs as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_key_anyvalues.tpb b/source/expectations/data_values/ut_key_anyvalues.tpb index 07413f77b..93bf1eb53 100644 --- a/source/expectations/data_values/ut_key_anyvalues.tpb +++ b/source/expectations/data_values/ut_key_anyvalues.tpb @@ -1,7 +1,7 @@ create or replace type body ut_key_anyvalues as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/data_values/ut_key_anyvalues.tps b/source/expectations/data_values/ut_key_anyvalues.tps index c871d1466..6dd32a76d 100644 --- a/source/expectations/data_values/ut_key_anyvalues.tps +++ b/source/expectations/data_values/ut_key_anyvalues.tps @@ -1,7 +1,7 @@ create or replace type ut_key_anyvalues under ut_event_item ( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_between.tpb b/source/expectations/matchers/ut_be_between.tpb index f4bf24aab..7368ad5a7 100644 --- a/source/expectations/matchers/ut_be_between.tpb +++ b/source/expectations/matchers/ut_be_between.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_between is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_between.tps b/source/expectations/matchers/ut_be_between.tps index 79c4ec2fe..7e254719e 100644 --- a/source/expectations/matchers/ut_be_between.tps +++ b/source/expectations/matchers/ut_be_between.tps @@ -1,7 +1,7 @@ create or replace type ut_be_between under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_empty.tpb b/source/expectations/matchers/ut_be_empty.tpb index 82ad95d5a..08523fb02 100644 --- a/source/expectations/matchers/ut_be_empty.tpb +++ b/source/expectations/matchers/ut_be_empty.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_empty as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_empty.tps b/source/expectations/matchers/ut_be_empty.tps index 0acb80e55..76af402fe 100644 --- a/source/expectations/matchers/ut_be_empty.tps +++ b/source/expectations/matchers/ut_be_empty.tps @@ -1,7 +1,7 @@ create or replace type ut_be_empty under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_false.tpb b/source/expectations/matchers/ut_be_false.tpb index 6e2f3ba1f..671f43cbe 100644 --- a/source/expectations/matchers/ut_be_false.tpb +++ b/source/expectations/matchers/ut_be_false.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_false as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_false.tps b/source/expectations/matchers/ut_be_false.tps index 06bb290d4..3d4e8dda9 100644 --- a/source/expectations/matchers/ut_be_false.tps +++ b/source/expectations/matchers/ut_be_false.tps @@ -1,7 +1,7 @@ create or replace type ut_be_false under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_greater_or_equal.tpb b/source/expectations/matchers/ut_be_greater_or_equal.tpb index 978d821e1..6877eb32c 100644 --- a/source/expectations/matchers/ut_be_greater_or_equal.tpb +++ b/source/expectations/matchers/ut_be_greater_or_equal.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_greater_or_equal AS /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_greater_or_equal.tps b/source/expectations/matchers/ut_be_greater_or_equal.tps index b97589bb0..facd33b3d 100644 --- a/source/expectations/matchers/ut_be_greater_or_equal.tps +++ b/source/expectations/matchers/ut_be_greater_or_equal.tps @@ -1,7 +1,7 @@ create or replace type ut_be_greater_or_equal under ut_comparison_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_greater_than.tpb b/source/expectations/matchers/ut_be_greater_than.tpb index b7b52af9a..da46347af 100644 --- a/source/expectations/matchers/ut_be_greater_than.tpb +++ b/source/expectations/matchers/ut_be_greater_than.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_greater_than AS /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_greater_than.tps b/source/expectations/matchers/ut_be_greater_than.tps index 9963a6277..fa19a9bd4 100644 --- a/source/expectations/matchers/ut_be_greater_than.tps +++ b/source/expectations/matchers/ut_be_greater_than.tps @@ -1,7 +1,7 @@ create or replace type ut_be_greater_than under ut_comparison_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_less_or_equal.tpb b/source/expectations/matchers/ut_be_less_or_equal.tpb index 6f6b7febd..98c4238eb 100644 --- a/source/expectations/matchers/ut_be_less_or_equal.tpb +++ b/source/expectations/matchers/ut_be_less_or_equal.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_less_or_equal AS /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_less_or_equal.tps b/source/expectations/matchers/ut_be_less_or_equal.tps index a9fe9492b..225c99b72 100644 --- a/source/expectations/matchers/ut_be_less_or_equal.tps +++ b/source/expectations/matchers/ut_be_less_or_equal.tps @@ -1,7 +1,7 @@ create or replace type ut_be_less_or_equal under ut_comparison_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_less_than.tpb b/source/expectations/matchers/ut_be_less_than.tpb index 7d3e06d62..e1c5c84b1 100644 --- a/source/expectations/matchers/ut_be_less_than.tpb +++ b/source/expectations/matchers/ut_be_less_than.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_less_than as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_less_than.tps b/source/expectations/matchers/ut_be_less_than.tps index f6ae1f0e4..8482f0327 100644 --- a/source/expectations/matchers/ut_be_less_than.tps +++ b/source/expectations/matchers/ut_be_less_than.tps @@ -1,7 +1,7 @@ create or replace type ut_be_less_than under ut_comparison_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_like.tpb b/source/expectations/matchers/ut_be_like.tpb index 315f43d6c..dbcd1c798 100644 --- a/source/expectations/matchers/ut_be_like.tpb +++ b/source/expectations/matchers/ut_be_like.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_like as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_like.tps b/source/expectations/matchers/ut_be_like.tps index 1e8430e32..0c1609a98 100644 --- a/source/expectations/matchers/ut_be_like.tps +++ b/source/expectations/matchers/ut_be_like.tps @@ -1,7 +1,7 @@ create or replace type ut_be_like under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_not_null.tpb b/source/expectations/matchers/ut_be_not_null.tpb index 595a94b75..94ee0ce0a 100644 --- a/source/expectations/matchers/ut_be_not_null.tpb +++ b/source/expectations/matchers/ut_be_not_null.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_not_null as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_not_null.tps b/source/expectations/matchers/ut_be_not_null.tps index 42e899701..34cc2bfd0 100644 --- a/source/expectations/matchers/ut_be_not_null.tps +++ b/source/expectations/matchers/ut_be_not_null.tps @@ -1,7 +1,7 @@ create or replace type ut_be_not_null under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_null.tpb b/source/expectations/matchers/ut_be_null.tpb index 82a4391d6..3194f092f 100644 --- a/source/expectations/matchers/ut_be_null.tpb +++ b/source/expectations/matchers/ut_be_null.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_null as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_null.tps b/source/expectations/matchers/ut_be_null.tps index ef30feea1..486e11f28 100644 --- a/source/expectations/matchers/ut_be_null.tps +++ b/source/expectations/matchers/ut_be_null.tps @@ -1,7 +1,7 @@ create or replace type ut_be_null under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_true.tpb b/source/expectations/matchers/ut_be_true.tpb index 3c83002e0..565ab590b 100644 --- a/source/expectations/matchers/ut_be_true.tpb +++ b/source/expectations/matchers/ut_be_true.tpb @@ -1,7 +1,7 @@ create or replace type body ut_be_true as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_be_true.tps b/source/expectations/matchers/ut_be_true.tps index f73c7700b..b994913f5 100644 --- a/source/expectations/matchers/ut_be_true.tps +++ b/source/expectations/matchers/ut_be_true.tps @@ -1,7 +1,7 @@ create or replace type ut_be_true under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_comparison_matcher.tpb b/source/expectations/matchers/ut_comparison_matcher.tpb index 6eec4c11a..50f8d6050 100644 --- a/source/expectations/matchers/ut_comparison_matcher.tpb +++ b/source/expectations/matchers/ut_comparison_matcher.tpb @@ -1,7 +1,7 @@ create or replace type body ut_comparison_matcher as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_comparison_matcher.tps b/source/expectations/matchers/ut_comparison_matcher.tps index d66ad8b56..76520a296 100644 --- a/source/expectations/matchers/ut_comparison_matcher.tps +++ b/source/expectations/matchers/ut_comparison_matcher.tps @@ -1,7 +1,7 @@ create or replace type ut_comparison_matcher under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_contain.tpb b/source/expectations/matchers/ut_contain.tpb index bb6e78d50..cf6653f63 100644 --- a/source/expectations/matchers/ut_contain.tpb +++ b/source/expectations/matchers/ut_contain.tpb @@ -1,7 +1,7 @@ create or replace type body ut_contain as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_contain.tps b/source/expectations/matchers/ut_contain.tps index bb4e1b40a..518352573 100644 --- a/source/expectations/matchers/ut_contain.tps +++ b/source/expectations/matchers/ut_contain.tps @@ -1,7 +1,7 @@ create or replace type ut_contain under ut_equal( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_equal.tpb b/source/expectations/matchers/ut_equal.tpb index 9df566af7..2e774d396 100644 --- a/source/expectations/matchers/ut_equal.tpb +++ b/source/expectations/matchers/ut_equal.tpb @@ -1,7 +1,7 @@ create or replace type body ut_equal as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_equal.tps b/source/expectations/matchers/ut_equal.tps index 6158a6fd3..1f42324d7 100644 --- a/source/expectations/matchers/ut_equal.tps +++ b/source/expectations/matchers/ut_equal.tps @@ -1,7 +1,7 @@ create or replace type ut_equal force under ut_comparison_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_have_count.tpb b/source/expectations/matchers/ut_have_count.tpb index 1cca8a228..b0f4e06d4 100644 --- a/source/expectations/matchers/ut_have_count.tpb +++ b/source/expectations/matchers/ut_have_count.tpb @@ -1,7 +1,7 @@ create or replace type body ut_have_count as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_have_count.tps b/source/expectations/matchers/ut_have_count.tps index dc4511d72..fb0fc76fc 100644 --- a/source/expectations/matchers/ut_have_count.tps +++ b/source/expectations/matchers/ut_have_count.tps @@ -1,7 +1,7 @@ create or replace type ut_have_count under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_match.tpb b/source/expectations/matchers/ut_match.tpb index f85af4aac..57fabbaec 100644 --- a/source/expectations/matchers/ut_match.tpb +++ b/source/expectations/matchers/ut_match.tpb @@ -1,7 +1,7 @@ create or replace type body ut_match as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_match.tps b/source/expectations/matchers/ut_match.tps index ca9fcd34c..8d6b0f73a 100644 --- a/source/expectations/matchers/ut_match.tps +++ b/source/expectations/matchers/ut_match.tps @@ -1,7 +1,7 @@ create or replace type ut_match under ut_matcher( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_matcher.tpb b/source/expectations/matchers/ut_matcher.tpb index 4f3b324b4..228f2caad 100644 --- a/source/expectations/matchers/ut_matcher.tpb +++ b/source/expectations/matchers/ut_matcher.tpb @@ -1,7 +1,7 @@ create or replace type body ut_matcher as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_matcher.tps b/source/expectations/matchers/ut_matcher.tps index f4c082af0..34e1742df 100644 --- a/source/expectations/matchers/ut_matcher.tps +++ b/source/expectations/matchers/ut_matcher.tps @@ -1,7 +1,7 @@ create or replace type ut_matcher authid current_user as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_matcher_options.tpb b/source/expectations/matchers/ut_matcher_options.tpb index 7741747d5..6fec3dee6 100644 --- a/source/expectations/matchers/ut_matcher_options.tpb +++ b/source/expectations/matchers/ut_matcher_options.tpb @@ -1,7 +1,7 @@ create or replace type body ut_matcher_options as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_matcher_options.tps b/source/expectations/matchers/ut_matcher_options.tps index cae062bf1..dbdf985f0 100644 --- a/source/expectations/matchers/ut_matcher_options.tps +++ b/source/expectations/matchers/ut_matcher_options.tps @@ -1,7 +1,7 @@ create or replace type ut_matcher_options authid current_user as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_matcher_options_items.tpb b/source/expectations/matchers/ut_matcher_options_items.tpb index 575537417..2c3f51d34 100644 --- a/source/expectations/matchers/ut_matcher_options_items.tpb +++ b/source/expectations/matchers/ut_matcher_options_items.tpb @@ -1,7 +1,7 @@ create or replace type body ut_matcher_options_items is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/matchers/ut_matcher_options_items.tps b/source/expectations/matchers/ut_matcher_options_items.tps index 81ee17897..cc74650f3 100644 --- a/source/expectations/matchers/ut_matcher_options_items.tps +++ b/source/expectations/matchers/ut_matcher_options_items.tps @@ -1,7 +1,7 @@ create or replace type ut_matcher_options_items authid current_user as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/ut_expectation.tpb b/source/expectations/ut_expectation.tpb index a94dadbc7..b50efef6a 100644 --- a/source/expectations/ut_expectation.tpb +++ b/source/expectations/ut_expectation.tpb @@ -1,7 +1,7 @@ create or replace type body ut_expectation as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/ut_expectation.tps b/source/expectations/ut_expectation.tps index 79d81f106..5b3370c43 100644 --- a/source/expectations/ut_expectation.tps +++ b/source/expectations/ut_expectation.tps @@ -1,7 +1,7 @@ create or replace type ut_expectation authid current_user as object( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/ut_expectation_compound.tpb b/source/expectations/ut_expectation_compound.tpb index 603513e78..aaab7cb34 100644 --- a/source/expectations/ut_expectation_compound.tpb +++ b/source/expectations/ut_expectation_compound.tpb @@ -1,7 +1,7 @@ create or replace type body ut_expectation_compound as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/ut_expectation_compound.tps b/source/expectations/ut_expectation_compound.tps index a0f935c5c..bd17eb8b1 100644 --- a/source/expectations/ut_expectation_compound.tps +++ b/source/expectations/ut_expectation_compound.tps @@ -1,7 +1,7 @@ create or replace type ut_expectation_compound force under ut_expectation( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/ut_expectation_json.tpb b/source/expectations/ut_expectation_json.tpb index d015aa5f4..954daf4e7 100644 --- a/source/expectations/ut_expectation_json.tpb +++ b/source/expectations/ut_expectation_json.tpb @@ -1,7 +1,7 @@ create or replace type body ut_expectation_json as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/expectations/ut_expectation_json.tps b/source/expectations/ut_expectation_json.tps index d032d7851..9cc9aecb8 100644 --- a/source/expectations/ut_expectation_json.tps +++ b/source/expectations/ut_expectation_json.tps @@ -1,7 +1,7 @@ create or replace type ut_expectation_json under ut_expectation( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/install.sql b/source/install.sql index 842172a5f..c8eab658c 100644 --- a/source/install.sql +++ b/source/install.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/install_component.sql b/source/install_component.sql index 16c4cd8a0..857c1771c 100644 --- a/source/install_component.sql +++ b/source/install_component.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/install_ddl_trigger.sql b/source/install_ddl_trigger.sql index 3725ff332..1395cc50c 100644 --- a/source/install_ddl_trigger.sql +++ b/source/install_ddl_trigger.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/install_headless.sql b/source/install_headless.sql index 5162b4c03..e8cf00705 100644 --- a/source/install_headless.sql +++ b/source/install_headless.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/install_headless_with_trigger.sql b/source/install_headless_with_trigger.sql index 7140ee822..0e13d7a59 100644 --- a/source/install_headless_with_trigger.sql +++ b/source/install_headless_with_trigger.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_ansiconsole_helper.pkb b/source/reporters/ut_ansiconsole_helper.pkb index 07d9ee9a7..b015e50be 100644 --- a/source/reporters/ut_ansiconsole_helper.pkb +++ b/source/reporters/ut_ansiconsole_helper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_ansiconsole_helper as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_ansiconsole_helper.pks b/source/reporters/ut_ansiconsole_helper.pks index f34ff12bd..7c83ca73b 100644 --- a/source/reporters/ut_ansiconsole_helper.pks +++ b/source/reporters/ut_ansiconsole_helper.pks @@ -1,7 +1,7 @@ create or replace package ut_ansiconsole_helper as /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_coverage_cobertura_reporter.tpb b/source/reporters/ut_coverage_cobertura_reporter.tpb index 56fd4b524..eed8e8e73 100644 --- a/source/reporters/ut_coverage_cobertura_reporter.tpb +++ b/source/reporters/ut_coverage_cobertura_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_coverage_cobertura_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_coverage_cobertura_reporter.tps b/source/reporters/ut_coverage_cobertura_reporter.tps index 6bfd60892..ec5cef2cb 100644 --- a/source/reporters/ut_coverage_cobertura_reporter.tps +++ b/source/reporters/ut_coverage_cobertura_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_coverage_cobertura_reporter under ut_coverage_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_coverage_html_reporter.tpb b/source/reporters/ut_coverage_html_reporter.tpb index 77d4b46ff..9e51b5cc2 100644 --- a/source/reporters/ut_coverage_html_reporter.tpb +++ b/source/reporters/ut_coverage_html_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_coverage_html_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_coverage_html_reporter.tps b/source/reporters/ut_coverage_html_reporter.tps index 11984ac58..f6bdcc249 100644 --- a/source/reporters/ut_coverage_html_reporter.tps +++ b/source/reporters/ut_coverage_html_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_coverage_html_reporter under ut_coverage_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_coverage_report_html_helper.pkb b/source/reporters/ut_coverage_report_html_helper.pkb index 3ab0b1fb6..00a53c4c6 100644 --- a/source/reporters/ut_coverage_report_html_helper.pkb +++ b/source/reporters/ut_coverage_report_html_helper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_coverage_report_html_helper is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_coverage_report_html_helper.pks b/source/reporters/ut_coverage_report_html_helper.pks index bc4d025f3..48dd76acf 100644 --- a/source/reporters/ut_coverage_report_html_helper.pks +++ b/source/reporters/ut_coverage_report_html_helper.pks @@ -1,7 +1,7 @@ create or replace package ut_coverage_report_html_helper authid current_user is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_coverage_sonar_reporter.tpb b/source/reporters/ut_coverage_sonar_reporter.tpb index fcc213665..bfe0d890b 100644 --- a/source/reporters/ut_coverage_sonar_reporter.tpb +++ b/source/reporters/ut_coverage_sonar_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_coverage_sonar_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_coverage_sonar_reporter.tps b/source/reporters/ut_coverage_sonar_reporter.tps index af52f1675..aa21cafe3 100644 --- a/source/reporters/ut_coverage_sonar_reporter.tps +++ b/source/reporters/ut_coverage_sonar_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_coverage_sonar_reporter under ut_coverage_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_coveralls_reporter.tpb b/source/reporters/ut_coveralls_reporter.tpb index 46c0947d0..1ca317c69 100644 --- a/source/reporters/ut_coveralls_reporter.tpb +++ b/source/reporters/ut_coveralls_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_coveralls_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_coveralls_reporter.tps b/source/reporters/ut_coveralls_reporter.tps index b5c1e1f28..53e86338e 100644 --- a/source/reporters/ut_coveralls_reporter.tps +++ b/source/reporters/ut_coveralls_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_coveralls_reporter under ut_coverage_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_debug_reporter.tpb b/source/reporters/ut_debug_reporter.tpb index f22e8748b..365f77755 100644 --- a/source/reporters/ut_debug_reporter.tpb +++ b/source/reporters/ut_debug_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_debug_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_debug_reporter.tps b/source/reporters/ut_debug_reporter.tps index 91e90e28c..5fbab61fb 100644 --- a/source/reporters/ut_debug_reporter.tps +++ b/source/reporters/ut_debug_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_debug_reporter under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_documentation_reporter.tpb b/source/reporters/ut_documentation_reporter.tpb index 7cf9a02cc..7210e1cb6 100644 --- a/source/reporters/ut_documentation_reporter.tpb +++ b/source/reporters/ut_documentation_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_documentation_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_documentation_reporter.tps b/source/reporters/ut_documentation_reporter.tps index 275408a35..08097e7d4 100644 --- a/source/reporters/ut_documentation_reporter.tps +++ b/source/reporters/ut_documentation_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_documentation_reporter under ut_console_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_junit_reporter.tpb b/source/reporters/ut_junit_reporter.tpb index c08790080..aa6786f6f 100644 --- a/source/reporters/ut_junit_reporter.tpb +++ b/source/reporters/ut_junit_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_junit_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_junit_reporter.tps b/source/reporters/ut_junit_reporter.tps index 051358c59..ca6cf505b 100644 --- a/source/reporters/ut_junit_reporter.tps +++ b/source/reporters/ut_junit_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_junit_reporter force under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_realtime_reporter.tpb b/source/reporters/ut_realtime_reporter.tpb index 493dbe513..7a3176ee6 100644 --- a/source/reporters/ut_realtime_reporter.tpb +++ b/source/reporters/ut_realtime_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_realtime_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_realtime_reporter.tps b/source/reporters/ut_realtime_reporter.tps index 096ebe8ee..99efed387 100644 --- a/source/reporters/ut_realtime_reporter.tps +++ b/source/reporters/ut_realtime_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_realtime_reporter force under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_sonar_test_reporter.tpb b/source/reporters/ut_sonar_test_reporter.tpb index 874a07957..6d76b5d41 100644 --- a/source/reporters/ut_sonar_test_reporter.tpb +++ b/source/reporters/ut_sonar_test_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_sonar_test_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_sonar_test_reporter.tps b/source/reporters/ut_sonar_test_reporter.tps index 353edbf0d..8bdb067df 100644 --- a/source/reporters/ut_sonar_test_reporter.tps +++ b/source/reporters/ut_sonar_test_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_sonar_test_reporter under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_teamcity_reporter.tpb b/source/reporters/ut_teamcity_reporter.tpb index d01e85153..ee0a53098 100644 --- a/source/reporters/ut_teamcity_reporter.tpb +++ b/source/reporters/ut_teamcity_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_teamcity_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_teamcity_reporter.tps b/source/reporters/ut_teamcity_reporter.tps index 7f61e2b6e..2738ec00e 100644 --- a/source/reporters/ut_teamcity_reporter.tps +++ b/source/reporters/ut_teamcity_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_teamcity_reporter under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_teamcity_reporter_helper.pkb b/source/reporters/ut_teamcity_reporter_helper.pkb index f5167fbb8..2d165d7a3 100644 --- a/source/reporters/ut_teamcity_reporter_helper.pkb +++ b/source/reporters/ut_teamcity_reporter_helper.pkb @@ -1,7 +1,7 @@ create or replace package body ut_teamcity_reporter_helper is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_teamcity_reporter_helper.pks b/source/reporters/ut_teamcity_reporter_helper.pks index 6bab87367..7258999e1 100644 --- a/source/reporters/ut_teamcity_reporter_helper.pks +++ b/source/reporters/ut_teamcity_reporter_helper.pks @@ -1,7 +1,7 @@ create or replace package ut_teamcity_reporter_helper is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_tfs_junit_reporter.tpb b/source/reporters/ut_tfs_junit_reporter.tpb index 5fba96886..5262ac687 100644 --- a/source/reporters/ut_tfs_junit_reporter.tpb +++ b/source/reporters/ut_tfs_junit_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_tfs_junit_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_tfs_junit_reporter.tps b/source/reporters/ut_tfs_junit_reporter.tps index 9e7a90e0a..ecf422bd3 100644 --- a/source/reporters/ut_tfs_junit_reporter.tps +++ b/source/reporters/ut_tfs_junit_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_tfs_junit_reporter under ut_output_reporter_base( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_xunit_reporter.tpb b/source/reporters/ut_xunit_reporter.tpb index e2deb22ce..b06c20810 100644 --- a/source/reporters/ut_xunit_reporter.tpb +++ b/source/reporters/ut_xunit_reporter.tpb @@ -1,7 +1,7 @@ create or replace type body ut_xunit_reporter is /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/reporters/ut_xunit_reporter.tps b/source/reporters/ut_xunit_reporter.tps index 81fa19e5b..b09205171 100644 --- a/source/reporters/ut_xunit_reporter.tps +++ b/source/reporters/ut_xunit_reporter.tps @@ -1,7 +1,7 @@ create or replace type ut_xunit_reporter under ut_junit_reporter( /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/set_install_params.sql b/source/set_install_params.sql index 1c7da89e9..4dc33c367 100644 --- a/source/set_install_params.sql +++ b/source/set_install_params.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/uninstall.sql b/source/uninstall.sql index 7b927e91d..760bf89b7 100644 --- a/source/uninstall.sql +++ b/source/uninstall.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. diff --git a/source/uninstall_all.sql b/source/uninstall_all.sql index 8d2bf0222..32180d762 100644 --- a/source/uninstall_all.sql +++ b/source/uninstall_all.sql @@ -1,6 +1,6 @@ /* utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project + 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. From e66e134267f48741202d16b8d71f7d5ee058c6d9 Mon Sep 17 00:00:00 2001 From: Travis CI Date: Mon, 17 Jun 2019 23:44:56 +0000 Subject: [PATCH 181/181] Updated project version after build [skip ci] --- VERSION | 2 +- docs/about/authors.md | 2 +- docs/about/license.md | 2 +- docs/about/project-details.md | 2 +- docs/about/support.md | 2 +- docs/index.md | 2 +- docs/userguide/advanced_data_comparison.md | 2 +- docs/userguide/annotations.md | 2 +- docs/userguide/best-practices.md | 2 +- docs/userguide/coverage.md | 2 +- docs/userguide/exception-reporting.md | 2 +- docs/userguide/expectations.md | 2 +- docs/userguide/getting-started.md | 2 +- docs/userguide/install.md | 2 +- docs/userguide/querying_suites.md | 2 +- docs/userguide/reporters.md | 2 +- docs/userguide/running-unit-tests.md | 2 +- docs/userguide/upgrade.md | 2 +- sonar-project.properties | 2 +- source/core/ut_utils.pkb | 2 +- source/core/ut_utils.pks | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/VERSION b/VERSION index 5ae33779b..e5e2ba276 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.1.7-develop +v3.1.7 diff --git a/docs/about/authors.md b/docs/about/authors.md index 894d67d81..92efc92e5 100644 --- a/docs/about/authors.md +++ b/docs/about/authors.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) ### utPLSQL v3 Major Contributors diff --git a/docs/about/license.md b/docs/about/license.md index ea8d75748..a76ddcd6b 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Version Information diff --git a/docs/about/project-details.md b/docs/about/project-details.md index 95d5f4eea..74f2c9804 100644 --- a/docs/about/project-details.md +++ b/docs/about/project-details.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # utPLSQL Project Details diff --git a/docs/about/support.md b/docs/about/support.md index a13e60c1a..180752b3b 100644 --- a/docs/about/support.md +++ b/docs/about/support.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # How to get support diff --git a/docs/index.md b/docs/index.md index 6011aa181..9ba5d6892 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Introduction to utPLSQL diff --git a/docs/userguide/advanced_data_comparison.md b/docs/userguide/advanced_data_comparison.md index 3757c4459..5a6480087 100644 --- a/docs/userguide/advanced_data_comparison.md +++ b/docs/userguide/advanced_data_comparison.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Advanced data comparison diff --git a/docs/userguide/annotations.md b/docs/userguide/annotations.md index 0aabddae8..bf8137c70 100644 --- a/docs/userguide/annotations.md +++ b/docs/userguide/annotations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Annotations diff --git a/docs/userguide/best-practices.md b/docs/userguide/best-practices.md index 176baaa41..1aa202e58 100644 --- a/docs/userguide/best-practices.md +++ b/docs/userguide/best-practices.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Best Practices diff --git a/docs/userguide/coverage.md b/docs/userguide/coverage.md index ed684cfca..c24bfae19 100644 --- a/docs/userguide/coverage.md +++ b/docs/userguide/coverage.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Coverage utPLSQL comes with a built-in coverage reporting engine. The code coverage reporting is based on the DBMS_PROFILER package provided with Oracle database. diff --git a/docs/userguide/exception-reporting.md b/docs/userguide/exception-reporting.md index a673ea733..d772aed53 100644 --- a/docs/userguide/exception-reporting.md +++ b/docs/userguide/exception-reporting.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Exception handling and reporting diff --git a/docs/userguide/expectations.md b/docs/userguide/expectations.md index 58142bd75..ccb88f21c 100644 --- a/docs/userguide/expectations.md +++ b/docs/userguide/expectations.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Expectation concepts Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing the actual data against the expected data. diff --git a/docs/userguide/getting-started.md b/docs/userguide/getting-started.md index 8e06e1493..42e4cea4b 100644 --- a/docs/userguide/getting-started.md +++ b/docs/userguide/getting-started.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Getting started with TDD and utPLSQL diff --git a/docs/userguide/install.md b/docs/userguide/install.md index 3d4598980..bf4558ca9 100644 --- a/docs/userguide/install.md +++ b/docs/userguide/install.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Downloading latest version of utPLSQL diff --git a/docs/userguide/querying_suites.md b/docs/userguide/querying_suites.md index b073305bd..868f69556 100644 --- a/docs/userguide/querying_suites.md +++ b/docs/userguide/querying_suites.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Qyerying for test suites diff --git a/docs/userguide/reporters.md b/docs/userguide/reporters.md index 3a2fc3ca1..e583bcbda 100644 --- a/docs/userguide/reporters.md +++ b/docs/userguide/reporters.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) utPLSQL provides the following reporting formats. diff --git a/docs/userguide/running-unit-tests.md b/docs/userguide/running-unit-tests.md index b697907c2..79f7569b9 100644 --- a/docs/userguide/running-unit-tests.md +++ b/docs/userguide/running-unit-tests.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Running tests diff --git a/docs/userguide/upgrade.md b/docs/userguide/upgrade.md index 0d9a00398..2c93c439f 100644 --- a/docs/userguide/upgrade.md +++ b/docs/userguide/upgrade.md @@ -1,4 +1,4 @@ -![version](https://img.shields.io/badge/version-v3.1.7.3083--develop-blue.svg) +![version](https://img.shields.io/badge/version-v3.1.7.3085-blue.svg) # Upgrading from version 2 diff --git a/sonar-project.properties b/sonar-project.properties index c3acb5c43..2b1270d6e 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -2,7 +2,7 @@ sonar.projectKey=utPLSQL # this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1. sonar.projectName=utPLSQL -sonar.projectVersion=v3.1.7-develop +sonar.projectVersion=v3.1.7 # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. # Since SonarQube 4.2, this property is optional if sonar.modules is set. diff --git a/source/core/ut_utils.pkb b/source/core/ut_utils.pkb index 72cfc7388..d56df250c 100644 --- a/source/core/ut_utils.pkb +++ b/source/core/ut_utils.pkb @@ -776,7 +776,7 @@ create or replace package body ut_utils is /** * Change string into unicode to match xmlgen format _00_ * 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.7.3083-develop + * secion v3.1.7.3085 */ function char_to_xmlgen_unicode(a_character varchar2) return varchar2 is begin diff --git a/source/core/ut_utils.pks b/source/core/ut_utils.pks index 421bd85eb..43dfdb1bb 100644 --- a/source/core/ut_utils.pks +++ b/source/core/ut_utils.pks @@ -21,7 +21,7 @@ create or replace package ut_utils authid definer is * */ - gc_version constant varchar2(50) := 'v3.1.7.3083-develop'; + gc_version constant varchar2(50) := 'v3.1.7.3085'; subtype t_executable_type is varchar2(30); gc_before_all constant t_executable_type := 'beforeall';