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

Skip to content

Commit 76ee219

Browse files
New class *ut_executable_test* created to support the new feature --%throws
1 parent 94c3588 commit 76ee219

14 files changed

Lines changed: 338 additions & 71 deletions

source/core/types/ut_executable.tpb

Lines changed: 4 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ create or replace type body ut_executable is
2525
self.owner_name := a_context.object_owner;
2626
self.object_name := a_context.object_name;
2727
self.procedure_name := a_procedure_name;
28-
--self.expected_error_codes := treat(a_context as ut_test).expected_error_codes;
2928
return;
3029
end;
3130

@@ -60,27 +59,23 @@ create or replace type body ut_executable is
6059
return ut_metadata.form_name(owner_name, object_name, procedure_name);
6160
end;
6261

63-
member procedure do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base,
64-
a_expected_error_codes in varchar2 := null) is
62+
member procedure do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base) is
6563
l_completed_without_errors boolean;
6664
begin
67-
l_completed_without_errors := self.do_execute(a_item, a_listener, a_expected_error_codes);
65+
l_completed_without_errors := self.do_execute(a_item, a_listener);
6866
end do_execute;
6967

70-
member function do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base,
71-
a_expected_error_codes in varchar2 := null) return boolean is
68+
member function do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base) return boolean is
7269
l_statement varchar2(4000);
7370
l_status number;
7471
l_cursor_number number;
7572
l_owner varchar2(200) := self.owner_name;
7673
l_object_name varchar2(200) := self.object_name;
7774
l_procedure_name varchar2(200) := self.procedure_name;
78-
l_expected_except_message varchar2(4000);
7975

8076
l_completed_without_errors boolean := true;
8177
l_start_transaction_id varchar2(250);
82-
l_end_transaction_id varchar2(250);
83-
78+
l_end_transaction_id varchar2(250);
8479
procedure save_dbms_output is
8580
l_status number;
8681
l_line varchar2(32767);
@@ -98,25 +93,6 @@ create or replace type body ut_executable is
9893
dbms_lob.writeappend(self.serveroutput,1,chr(10));
9994
end loop;
10095
end save_dbms_output;
101-
102-
function build_failed_expec_errnum(a_error_stack in varchar2, a_expected_error_codes in varchar) return varchar is
103-
l_actual_error_no integer;
104-
l_fail_message varchar2(4000);
105-
begin
106-
if a_error_stack is null then
107-
l_fail_message := 'Expected exceptions '||a_expected_error_codes||' but nothing was raised.';
108-
else
109-
l_actual_error_no := regexp_substr(a_error_stack, '^ORA(-[0-9]+)',subexpression=>1);
110-
111-
if a_expected_error_codes = l_actual_error_no then
112-
l_fail_message := null;
113-
else
114-
l_fail_message := 'Expected exceptions '''||a_expected_error_codes||''' got '''||l_actual_error_no||'''.';
115-
end if;
116-
end if;
117-
118-
return l_fail_message;
119-
end;
12096
begin
12197
if self.is_defined() then
12298
l_start_transaction_id := dbms_transaction.local_transaction_id(true);
@@ -163,20 +139,6 @@ create or replace type body ut_executable is
163139

164140
save_dbms_output;
165141

166-
167-
if a_expected_error_codes is not null then
168-
l_expected_except_message := build_failed_expec_errnum(self.error_stack, a_expected_error_codes);
169-
170-
if l_expected_except_message is not null then
171-
ut_expectation_processor.add_expectation_result(
172-
ut_expectation_result(ut_utils.tr_failure, null, l_owner||'.'||l_object_name||'.'||l_procedure_name||' '||l_expected_except_message, false)
173-
);
174-
end if;
175-
176-
self.error_stack := null;
177-
self.error_backtrace := null;
178-
end if;
179-
180142
l_completed_without_errors := (self.error_stack||self.error_backtrace) is null;
181143

182144
--listener - after call to executable

source/core/types/ut_executable.tps

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,13 @@ create or replace type ut_executable authid current_user as object(
2929
member function is_valid(self in out nocopy ut_executable) return boolean,
3030
member function is_defined return boolean,
3131
member function form_name return varchar2,
32-
member procedure do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base,
33-
a_expected_error_codes in varchar2 := null),
32+
member procedure do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base),
3433
/**
3534
* executes the defines executable
3635
* returns true if executed without exceptions
3736
* returns false if exceptions were raised
3837
*/
39-
member function do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base,
40-
a_expected_error_codes in varchar2 := null) return boolean,
38+
member function do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base) return boolean,
4139
member function get_error_stack_trace return varchar2
42-
) final
40+
) not final
4341
/
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
create or replace type body ut_executable_test as
2+
constructor function ut_executable_test(
3+
self in out nocopy ut_executable_test, a_context ut_suite_item,
4+
a_procedure_name varchar2, a_associated_event_name varchar2
5+
) return self as result is
6+
begin
7+
self.associated_event_name := a_associated_event_name;
8+
self.owner_name := a_context.object_owner;
9+
self.object_name := a_context.object_name;
10+
self.procedure_name := a_procedure_name;
11+
return;
12+
end;
13+
14+
member procedure do_execute(self in out nocopy ut_executable_test, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base,
15+
a_expected_error_codes in ut_varchar2_list := null) is
16+
l_completed_without_errors boolean;
17+
begin
18+
l_completed_without_errors := self.do_execute(a_item, a_listener, a_expected_error_codes);
19+
end do_execute;
20+
21+
member function do_execute(self in out nocopy ut_executable_test, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base,
22+
a_expected_error_codes in ut_varchar2_list := null) return boolean is
23+
l_ut_executable ut_executable;
24+
l_expected_except_message varchar2(4000);
25+
l_owner varchar2(200) := self.owner_name;
26+
l_object_name varchar2(200) := self.object_name;
27+
l_procedure_name varchar2(200) := self.procedure_name;
28+
l_completed_without_errors boolean;
29+
30+
function failed_expec_errnum_message(a_error_stack in varchar2, a_expected_error_codes in ut_varchar2_list) return varchar is
31+
l_actual_error_no integer;
32+
l_expected_error_codes varchar2(4000);
33+
l_list_expect_error_codes ut_varchar2_list;
34+
l_fail_message varchar2(4000);
35+
begin
36+
--Convert the ut_varchar2_list to string to can construct the message
37+
l_expected_error_codes := ut_utils.table_to_clob(a_expected_error_codes, ',');
38+
39+
if a_error_stack is null then
40+
l_fail_message := 'Expected one of exceptions ('||l_expected_error_codes||') but nothing was raised.';
41+
else
42+
l_actual_error_no := regexp_substr(a_error_stack, '^ORA(-[0-9]+)', subexpression=>1);
43+
44+
if l_actual_error_no member of a_expected_error_codes then
45+
l_fail_message := null;
46+
else
47+
l_fail_message := 'Actual: '||l_actual_error_no||' was expected to be one of ('||l_expected_error_codes||')';
48+
end if;
49+
end if;
50+
51+
return l_fail_message;
52+
end;
53+
begin
54+
--Create a ut_executable object and call do_execute after that get the data to know the test's execution result
55+
l_ut_executable := treat(self as ut_executable);
56+
l_ut_executable.do_execute(a_item, a_listener);
57+
self.error_stack := l_ut_executable.error_stack;
58+
self.error_backtrace := l_ut_executable.error_backtrace;
59+
self.serveroutput := l_ut_executable.serveroutput;
60+
61+
if a_expected_error_codes is not null and a_expected_error_codes is not empty then
62+
l_expected_except_message := failed_expec_errnum_message(self.error_stack, a_expected_error_codes);
63+
64+
if l_expected_except_message is not null then
65+
ut_expectation_processor.add_expectation_result(
66+
ut_expectation_result(ut_utils.tr_failure, null, l_owner||'.'||l_object_name||'.'||l_procedure_name||' '||l_expected_except_message, false)
67+
);
68+
end if;
69+
70+
self.error_stack := null;
71+
self.error_backtrace := null;
72+
end if;
73+
74+
l_completed_without_errors := (self.error_stack||self.error_backtrace) is null;
75+
76+
return l_completed_without_errors;
77+
end;
78+
end;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
create or replace type ut_executable_test authid current_user under ut_executable (
2+
/*
3+
utPLSQL - Version 3
4+
Copyright 2016 - 2017 utPLSQL Project
5+
6+
Licensed under the Apache License, Version 2.0 (the "License"):
7+
you may not use this file except in compliance with the License.
8+
You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
Unless required by applicable law or agreed to in writing, software
13+
distributed under the License is distributed on an "AS IS" BASIS,
14+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
See the License for the specific language governing permissions and
16+
limitations under the License.
17+
*/
18+
constructor function ut_executable_test( self in out nocopy ut_executable_test, a_context ut_suite_item, a_procedure_name varchar2, a_associated_event_name varchar2) return self as result,
19+
member procedure do_execute(self in out nocopy ut_executable_test, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base,
20+
a_expected_error_codes in ut_varchar2_list := null),
21+
member function do_execute(self in out nocopy ut_executable_test, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base,
22+
a_expected_error_codes in ut_varchar2_list := null) return boolean
23+
) final;

source/core/types/ut_test.tpb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ create or replace type body ut_test as
2121
a_path varchar2 := null, a_rollback_type integer := null, a_disabled_flag boolean := false,
2222
a_before_each_proc_name varchar2 := null, a_before_test_proc_name varchar2 := null,
2323
a_after_test_proc_name varchar2 := null, a_after_each_proc_name varchar2 := null,
24-
a_expected_error_codes varchar2 := null
24+
a_expected_error_codes ut_varchar2_list := null
2525
) return self as result is
2626
begin
2727
self.self_type := $$plsql_unit;
2828
self.init(a_object_owner, a_object_name, a_name, a_description, a_path, a_rollback_type, a_disabled_flag);
2929
self.before_each := ut_executable(self, a_before_each_proc_name, ut_utils.gc_before_each);
3030
self.before_test := ut_executable(self, a_before_test_proc_name, ut_utils.gc_before_test);
31-
self.item := ut_executable(self, a_name, ut_utils.gc_test_execute);
31+
self.item := ut_executable_test(self, a_name, ut_utils.gc_test_execute);
3232
self.after_test := ut_executable(self, a_after_test_proc_name, ut_utils.gc_after_test);
3333
self.after_each := ut_executable(self, a_after_each_proc_name, ut_utils.gc_after_each);
3434
self.all_expectations := ut_expectation_results();
@@ -141,12 +141,12 @@ create or replace type body ut_test as
141141
overriding member function get_error_stack_traces(self ut_test) return ut_varchar2_list is
142142
l_stack_traces ut_varchar2_list := ut_varchar2_list();
143143
begin
144-
ut_utils.append_to_list(l_stack_traces, self.parent_error_stack_trace);
145-
ut_utils.append_to_list(l_stack_traces, self.before_each.get_error_stack_trace());
146-
ut_utils.append_to_list(l_stack_traces, self.before_test.get_error_stack_trace());
147-
ut_utils.append_to_list(l_stack_traces, self.item.get_error_stack_trace());
148-
ut_utils.append_to_list(l_stack_traces, self.after_test.get_error_stack_trace());
149-
ut_utils.append_to_list(l_stack_traces, self.after_each.get_error_stack_trace());
144+
ut_utils.append_to_varchar2_list(l_stack_traces, self.parent_error_stack_trace);
145+
ut_utils.append_to_varchar2_list(l_stack_traces, self.before_each.get_error_stack_trace());
146+
ut_utils.append_to_varchar2_list(l_stack_traces, self.before_test.get_error_stack_trace());
147+
ut_utils.append_to_varchar2_list(l_stack_traces, self.item.get_error_stack_trace());
148+
ut_utils.append_to_varchar2_list(l_stack_traces, self.after_test.get_error_stack_trace());
149+
ut_utils.append_to_varchar2_list(l_stack_traces, self.after_each.get_error_stack_trace());
150150
return l_stack_traces;
151151
end;
152152
overriding member function get_serveroutputs return clob is

source/core/types/ut_test.tps

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ create or replace type ut_test under ut_suite_item (
2828
/**
2929
* The Test procedure to be executed
3030
*/
31-
item ut_executable,
31+
item ut_executable_test,
3232
/**
3333
* The procedure to be invoked after invoking the test
3434
* Procedure exists within the same package as the test itself
@@ -56,15 +56,15 @@ create or replace type ut_test under ut_suite_item (
5656
*/
5757
parent_error_stack_trace varchar2(4000),
5858
/**
59-
*Holds the expected error codes separated by comma when the user use the annotation throws
59+
*Holds the expected error codes list when the user use the annotation throws
6060
*/
61-
expected_error_codes varchar2(4000),
61+
expected_error_codes ut_varchar2_list,
6262
constructor function ut_test(
6363
self in out nocopy ut_test, a_object_owner varchar2 := null, a_object_name varchar2, a_name varchar2, a_description varchar2 := null,
6464
a_path varchar2 := null, a_rollback_type integer := null, a_disabled_flag boolean := false,
6565
a_before_each_proc_name varchar2 := null, a_before_test_proc_name varchar2 := null,
6666
a_after_test_proc_name varchar2 := null, a_after_each_proc_name varchar2 := null,
67-
a_expected_error_codes varchar2 := null
67+
a_expected_error_codes ut_varchar2_list := null
6868
) return self as result,
6969
member function is_valid(self in out nocopy ut_test) return boolean,
7070
member procedure set_beforeeach(self in out nocopy ut_test, a_before_each_proc_name varchar2),

source/core/ut_suite_builder.pkb

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,26 @@ create or replace package body ut_suite_builder is
4242
l_beforetest_procedure varchar2(250 char);
4343
l_aftertest_procedure varchar2(250 char);
4444

45-
l_expected_error_codes varchar2(4000);
45+
l_expected_error_codes ut_varchar2_list;
4646

4747
l_rollback_type integer;
4848
l_displayname varchar2(4000);
4949
function is_last_annotation_for_proc(a_annotations ut_annotations, a_index binary_integer) return boolean is
5050
begin
5151
return a_index = a_annotations.count or a_annotations(a_index).subobject_name != nvl(a_annotations(a_index+1).subobject_name, ' ');
5252
end;
53+
54+
function exception_numbers_list(a_exception_numbers in varchar2) return ut_varchar2_list is
55+
l_exception_number_list ut_varchar2_list;
56+
l_regexp_for_excep_nums varchar2(30) := '^-?[[:digit:]]{1,5}$';
57+
begin
58+
/*the a_expected_error_codes is converted to a ut_varchar2_list after that is trimmed and filtered to left only valid exception numbers*/
59+
l_exception_number_list := ut_utils.string_to_table(a_exception_numbers, ',', 'Y');
60+
l_exception_number_list := ut_utils.trim_list_elements(l_exception_number_list, '[:space:]');
61+
l_exception_number_list := ut_utils.filter_list(l_exception_number_list, l_regexp_for_excep_nums);
62+
63+
return l_exception_number_list;
64+
end;
5365
begin
5466
l_suite_rollback := ut_utils.gc_rollback_auto;
5567
for i in 1 .. a_object.annotations.count loop
@@ -91,7 +103,7 @@ create or replace package body ut_suite_builder is
91103
elsif a_object.annotations(i).name = 'aftertest' then
92104
l_aftertest_procedure := a_object.annotations(i).text;
93105
elsif a_object.annotations(i).name = 'throws' then
94-
l_expected_error_codes := a_object.annotations(i).text;
106+
l_expected_error_codes := exception_numbers_list(a_object.annotations(i).text);
95107
elsif a_object.annotations(i).name in ('displayname','test') then
96108
l_displayname := a_object.annotations(i).text;
97109
if a_object.annotations(i).name = 'test' then

source/core/ut_utils.pkb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,5 +492,37 @@ procedure append_to_clob(a_src_clob in out nocopy clob, a_clob_table t_clob_tab,
492492
return to_char(a_value, gc_number_format, 'NLS_NUMERIC_CHARACTERS=''. ''');
493493
end;
494494

495+
function trim_list_elements(a_list IN ut_varchar2_list, a_characters_to_trim in varchar2) return ut_varchar2_list is
496+
l_trimmed_list ut_varchar2_list := ut_varchar2_list();
497+
l_index integer;
498+
begin
499+
l_index := a_list.first;
500+
501+
while (l_index is not null) loop
502+
l_trimmed_list.extend;
503+
l_trimmed_list(l_trimmed_list.count) := regexp_replace(a_list(l_index), '(^['||a_characters_to_trim||']*)|(['||a_characters_to_trim||']*$)');
504+
l_index := a_list.next(l_index);
505+
end loop;
506+
507+
return l_trimmed_list;
508+
end;
509+
510+
function filter_list(a_list IN ut_varchar2_list, a_regexp_filter in varchar2) return ut_varchar2_list is
511+
l_filtered_list ut_varchar2_list := ut_varchar2_list();
512+
l_index integer;
513+
begin
514+
l_index := a_list.first;
515+
516+
while (l_index is not null) loop
517+
if regexp_like(a_list(l_index), a_regexp_filter) then
518+
l_filtered_list.extend;
519+
l_filtered_list(l_filtered_list.count) := a_list(l_index);
520+
end if;
521+
l_index := a_list.next(l_index);
522+
end loop;
523+
524+
return l_filtered_list;
525+
end;
526+
495527
end ut_utils;
496528
/

source/core/ut_utils.pks

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,5 +293,11 @@ create or replace package ut_utils authid definer is
293293
*/
294294
function to_xml_number_format(a_value number) return varchar2;
295295

296+
/*It takes a collection of type ut_varchar2_list and it trims the characters passed as arguments for every element*/
297+
function trim_list_elements(a_list IN ut_varchar2_list, a_characters_to_trim in varchar2) return ut_varchar2_list;
298+
299+
/*It takes a collection of type ut_varchar2_list and it only returns the elements which meets the regular expression*/
300+
function filter_list(a_list IN ut_varchar2_list, a_regexp_filter in varchar2) return ut_varchar2_list;
301+
296302
end ut_utils;
297303
/

source/install.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ alter session set current_schema = &&ut3_owner;
5858
@@install_component.sql 'core/types/ut_suite_item.tps'
5959
@@install_component.sql 'core/types/ut_suite_items.tps'
6060
@@install_component.sql 'core/types/ut_executable.tps'
61+
@@install_component.sql 'core/types/ut_executable_test.tps'
6162
@@install_component.sql 'core/types/ut_test.tps'
6263
@@install_component.sql 'core/types/ut_logical_suite.tps'
6364
@@install_component.sql 'core/types/ut_suite.tps'
@@ -132,6 +133,7 @@ prompt Installing PLSQL profiler objects into &&ut3_owner schema
132133
@@install_component.sql 'core/types/ut_reporter_base.tpb'
133134
@@install_component.sql 'core/types/ut_file_mapping.tpb'
134135
@@install_component.sql 'core/types/ut_executable.tpb'
136+
@@install_component.sql 'core/types/ut_executable_test.tpb'
135137
@@install_component.sql 'core/types/ut_console_reporter_base.tps'
136138
@@install_component.sql 'core/types/ut_console_reporter_base.tpb'
137139

0 commit comments

Comments
 (0)