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

Skip to content

Commit 12c28ab

Browse files
committed
implemented ut_real_suite object type to distinguish between logical and real suites
1 parent 15f86e3 commit 12c28ab

7 files changed

Lines changed: 159 additions & 92 deletions

File tree

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
create or replace type body ut_real_suite as
2+
3+
constructor function ut_real_suite(
4+
self in out nocopy ut_real_suite, a_object_owner varchar2 := null, a_object_name varchar2, a_name varchar2, a_description varchar2 := null,
5+
a_path varchar2 := null, a_rollback_type integer := null, a_ignore_flag boolean := false, a_before_all_proc_name varchar2 := null,
6+
a_after_all_proc_name varchar2 := null, a_before_each_proc_name varchar2 := null, a_after_each_proc_name varchar2 := null
7+
) return self as result is
8+
begin
9+
self.self_type := $$plsql_unit;
10+
self.init(a_object_owner, a_object_name, a_name, a_description, a_path, a_rollback_type, a_ignore_flag);
11+
self.before_all := ut_executable(self, a_before_all_proc_name, ut_utils.gc_before_all);
12+
self.before_each := ut_executable(self, a_before_each_proc_name, ut_utils.gc_before_each);
13+
self.items := ut_suite_items();
14+
self.after_each := ut_executable(self, a_after_each_proc_name, ut_utils.gc_after_each);
15+
self.after_all := ut_executable(self, a_after_all_proc_name, ut_utils.gc_after_all);
16+
return;
17+
end;
18+
19+
overriding member function is_valid return boolean is
20+
l_is_valid boolean;
21+
begin
22+
l_is_valid :=
23+
( not self.before_all.is_defined() or self.before_all.is_valid() ) and
24+
( not self.before_each.is_defined() or self.before_each.is_valid() ) and
25+
( not self.after_each.is_defined() or self.after_each.is_valid() ) and
26+
( not self.after_all.is_defined() or self.after_all.is_valid() );
27+
return l_is_valid;
28+
end;
29+
30+
overriding member function do_execute(self in out nocopy ut_real_suite, a_listener in out nocopy ut_event_listener_base) return boolean is
31+
l_suite_savepoint varchar2(30);
32+
l_item_savepoint varchar2(30);
33+
l_completed_without_errors boolean;
34+
begin
35+
ut_utils.debug_log('ut_real_suite.execute');
36+
37+
if self.get_ignore_flag() then
38+
self.result := ut_utils.tr_ignore;
39+
ut_utils.debug_log('ut_real_suite.execute - ignored');
40+
else
41+
a_listener.fire_before_event(ut_utils.gc_suite,self);
42+
43+
self.start_time := current_timestamp;
44+
45+
l_suite_savepoint := self.create_savepoint_if_needed();
46+
47+
--includes listener calls for before and after actions
48+
l_completed_without_errors := self.before_all.do_execute(self, a_listener);
49+
50+
if l_completed_without_errors then
51+
for i in 1 .. self.items.count loop
52+
l_completed_without_errors := true;
53+
54+
--savepoint
55+
l_item_savepoint := self.items(i).create_savepoint_if_needed();
56+
--before each
57+
if l_completed_without_errors then
58+
--includes listener calls for before and after actions
59+
l_completed_without_errors := self.before_each.do_execute(self, a_listener);
60+
end if;
61+
62+
-- execute the item (test or suite)
63+
if l_completed_without_errors then
64+
l_completed_without_errors := self.items(i).do_execute(a_listener);
65+
end if;
66+
67+
--after each
68+
if l_completed_without_errors then
69+
--includes listener calls for before and after actions
70+
l_completed_without_errors := self.after_each.do_execute(self, a_listener);
71+
end if;
72+
--rollback to savepoint
73+
self.items(i).rollback_to_savepoint(l_item_savepoint);
74+
75+
-- exit when not l_completed_without_errors;
76+
end loop;
77+
end if;
78+
79+
if l_completed_without_errors then
80+
l_completed_without_errors := self.after_all.do_execute(self, a_listener);
81+
end if;
82+
83+
self.calc_execution_result();
84+
85+
self.rollback_to_savepoint(l_suite_savepoint);
86+
87+
self.end_time := current_timestamp;
88+
89+
a_listener.fire_after_event(ut_utils.gc_suite,self);
90+
end if;
91+
92+
return l_completed_without_errors;
93+
end;
94+
95+
end;
96+
/
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
create or replace type ut_real_suite under ut_suite (
2+
/**
3+
* The procedure to be invoked before all of the items of the suite (executed once)
4+
* Procedure exists within the package of the suite
5+
*/
6+
before_all ut_executable,
7+
/**
8+
* The procedure to be invoked before each of the child items of the suite (executed each time for each item)
9+
* Procedure exists within the package of the suite
10+
*/
11+
before_each ut_executable,
12+
/**
13+
* The procedure to be invoked after each of the child items of the suite (executed each time for each item)
14+
* Procedure exists within the package of the suite
15+
*/
16+
after_each ut_executable,
17+
/**
18+
* The procedure to be invoked after all of the items of the suite (executed once)
19+
* Procedure exists within the package of the suite
20+
*/
21+
after_all ut_executable,
22+
constructor function ut_real_suite(
23+
self in out nocopy ut_real_suite, a_object_owner varchar2 := null, a_object_name varchar2, a_name varchar2, a_description varchar2 := null,
24+
a_path varchar2 := null, a_rollback_type integer := null, a_ignore_flag boolean := false, a_before_all_proc_name varchar2 := null,
25+
a_after_all_proc_name varchar2 := null, a_before_each_proc_name varchar2 := null, a_after_each_proc_name varchar2 := null
26+
) return self as result,
27+
overriding member function is_valid return boolean,
28+
/**
29+
* Finds the item in the suite by it's name and returns the item index
30+
*/
31+
overriding member function do_execute(self in out nocopy ut_real_suite, a_listener in out nocopy ut_event_listener_base) return boolean
32+
)
33+
/

source/core/types/ut_suite.tpb

Lines changed: 7 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,18 @@
11
create or replace type body ut_suite as
22

33
constructor function ut_suite(
4-
self in out nocopy ut_suite, a_object_owner varchar2 := null, a_object_name varchar2, a_name varchar2, a_description varchar2 := null,
5-
a_path varchar2 := null, a_rollback_type integer := null, a_ignore_flag boolean := false, a_before_all_proc_name varchar2 := null,
6-
a_after_all_proc_name varchar2 := null, a_before_each_proc_name varchar2 := null, a_after_each_proc_name varchar2 := null
4+
self in out nocopy ut_suite,a_object_owner varchar2, a_object_name varchar2, a_name varchar2, a_description varchar2 := null, a_path varchar2
75
) return self as result is
86
begin
97
self.self_type := $$plsql_unit;
10-
self.init(a_object_owner, a_object_name, a_name, a_description, a_path, a_rollback_type, a_ignore_flag);
11-
self.before_all := ut_executable(self, a_before_all_proc_name, ut_utils.gc_before_all);
12-
self.before_each := ut_executable(self, a_before_each_proc_name, ut_utils.gc_before_each);
8+
self.init(a_object_owner, a_object_name, a_name, a_description, a_path, ut_utils.gc_rollback_auto, false);
139
self.items := ut_suite_items();
14-
self.after_each := ut_executable(self, a_after_each_proc_name, ut_utils.gc_after_each);
15-
self.after_all := ut_executable(self, a_after_all_proc_name, ut_utils.gc_after_all);
1610
return;
1711
end;
1812

1913
member function is_valid return boolean is
20-
l_is_valid boolean;
2114
begin
22-
l_is_valid :=
23-
( not self.before_all.is_defined() or self.before_all.is_valid() ) and
24-
( not self.before_each.is_defined() or self.before_each.is_valid() ) and
25-
( not self.after_each.is_defined() or self.after_each.is_valid() ) and
26-
( not self.after_all.is_defined() or self.after_all.is_valid() );
27-
return l_is_valid;
15+
return true;
2816
end;
2917

3018
member function item_index(a_name varchar2) return pls_integer is
@@ -69,48 +57,14 @@ create or replace type body ut_suite as
6957

7058
self.start_time := current_timestamp;
7159

72-
l_suite_savepoint := self.create_savepoint_if_needed();
73-
74-
--includes listener calls for before and after actions
75-
l_completed_without_errors := self.before_all.do_execute(self, a_listener);
76-
77-
if l_completed_without_errors then
78-
for i in 1 .. self.items.count loop
79-
l_completed_without_errors := true;
80-
81-
--savepoint
82-
l_item_savepoint := self.items(i).create_savepoint_if_needed();
83-
--before each
84-
if l_completed_without_errors then
85-
--includes listener calls for before and after actions
86-
l_completed_without_errors := self.before_each.do_execute(self, a_listener);
87-
end if;
88-
89-
-- execute the item (test or suite)
90-
if l_completed_without_errors then
91-
l_completed_without_errors := self.items(i).do_execute(a_listener);
92-
end if;
93-
94-
--after each
95-
if l_completed_without_errors then
96-
--includes listener calls for before and after actions
97-
l_completed_without_errors := self.after_each.do_execute(self, a_listener);
98-
end if;
99-
--rollback to savepoint
100-
self.items(i).rollback_to_savepoint(l_item_savepoint);
101-
102-
-- exit when not l_completed_without_errors;
103-
end loop;
104-
end if;
60+
for i in 1 .. self.items.count loop
61+
-- execute the item (test or suite)
62+
self.items(i).do_execute(a_listener);
10563

106-
if l_completed_without_errors then
107-
l_completed_without_errors := self.after_all.do_execute(self, a_listener);
108-
end if;
64+
end loop;
10965

11066
self.calc_execution_result();
11167

112-
self.rollback_to_savepoint(l_suite_savepoint);
113-
11468
self.end_time := current_timestamp;
11569

11670
a_listener.fire_after_event(ut_utils.gc_suite,self);

source/core/types/ut_suite.tps

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,12 @@
1-
create or replace type ut_suite under ut_suite_item (
2-
/**
3-
* The procedure to be invoked before all of the items of the suite (executed once)
4-
* Procedure exists within the package of the suite
5-
*/
6-
before_all ut_executable,
7-
/**
8-
* The procedure to be invoked before each of the child items of the suite (executed each time for each item)
9-
* Procedure exists within the package of the suite
10-
*/
11-
before_each ut_executable,
1+
create or replace type ut_suite force under ut_suite_item (
2+
123
/**
134
* The list of items (suites/sub-suites/contexts/tests) to be invoked as part of this suite
145
*/
156
items ut_suite_items,
16-
/**
17-
* The procedure to be invoked after each of the child items of the suite (executed each time for each item)
18-
* Procedure exists within the package of the suite
19-
*/
20-
after_each ut_executable,
21-
/**
22-
* The procedure to be invoked after all of the items of the suite (executed once)
23-
* Procedure exists within the package of the suite
24-
*/
25-
after_all ut_executable,
7+
268
constructor function ut_suite(
27-
self in out nocopy ut_suite, a_object_owner varchar2 := null, a_object_name varchar2, a_name varchar2, a_description varchar2 := null,
28-
a_path varchar2 := null, a_rollback_type integer := null, a_ignore_flag boolean := false, a_before_all_proc_name varchar2 := null,
29-
a_after_all_proc_name varchar2 := null, a_before_each_proc_name varchar2 := null, a_after_each_proc_name varchar2 := null
9+
self in out nocopy ut_suite,a_object_owner varchar2, a_object_name varchar2, a_name varchar2, a_description varchar2 := null, a_path varchar2
3010
) return self as result,
3111
member function is_valid return boolean,
3212
/**
@@ -37,5 +17,5 @@ create or replace type ut_suite under ut_suite_item (
3717
overriding member function do_execute(self in out nocopy ut_suite, a_listener in out nocopy ut_event_listener_base) return boolean,
3818
overriding member procedure do_execute(self in out nocopy ut_suite, a_listener in out nocopy ut_event_listener_base),
3919
overriding member procedure calc_execution_result(self in out nocopy ut_suite)
40-
)
20+
) not final
4121
/

source/core/ut_suite_manager.pkb

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,14 @@ create or replace package body ut_suite_manager is
9393
end if;
9494

9595
end loop;
96-
l_suite := ut_suite(
97-
a_object_owner => l_owner_name,
98-
a_object_name => l_object_name,
99-
a_name => l_object_name, --this could be different for sub-suite (context)
100-
a_description => l_suite_name,
101-
a_path => l_suite_path, --a patch for this suite (excluding the package name of current suite)
102-
a_rollback_type => l_suite_rollback,
103-
a_ignore_flag => l_annotation_data.package_annotations.exists('disable'),
96+
l_suite := ut_real_suite(
97+
a_object_owner => l_owner_name,
98+
a_object_name => l_object_name,
99+
a_name => l_object_name, --this could be different for sub-suite (context)
100+
a_description => l_suite_name,
101+
a_path => l_suite_path, --a patch for this suite (excluding the package name of current suite)
102+
a_rollback_type => l_suite_rollback,
103+
a_ignore_flag => l_annotation_data.package_annotations.exists('disable'),
104104
a_before_all_proc_name => l_suite_setup_proc,
105105
a_after_all_proc_name => l_suite_teardown_proc,
106106
a_before_each_proc_name => l_default_setup_proc,
@@ -204,7 +204,7 @@ create or replace package body ut_suite_manager is
204204

205205
if l_ind is null then
206206
--this only happens when a path of a real suite contains a parent-suite that is not a real package.
207-
l_cur_item := ut_suite(a_object_name => l_temp_root, a_name => l_temp_root, a_path => l_path);
207+
l_cur_item := ut_suite(a_object_owner => a_owner_name, a_object_name => l_temp_root, a_name => l_temp_root, a_path => l_path);
208208
else
209209
l_cur_item := treat(a_root_suite.items(l_ind) as ut_suite);
210210
end if;
@@ -218,7 +218,7 @@ create or replace package body ut_suite_manager is
218218
end if;
219219

220220
else
221-
a_root_suite := ut_suite(a_object_name => l_temp_root, a_name => l_temp_root, a_path => l_path);
221+
a_root_suite := ut_suite(a_object_owner => a_owner_name, a_object_name => l_temp_root, a_name => l_temp_root, a_path => l_path);
222222
put(a_root_suite, trim_path(a_path, l_temp_root || '.'), a_suite, l_path);
223223
end if;
224224
else
@@ -356,8 +356,8 @@ create or replace package body ut_suite_manager is
356356
end clean_paths;
357357

358358
procedure skip_by_path(a_suite in out nocopy ut_suite_item, a_path varchar2) is
359-
l_root constant varchar2(32767) := regexp_substr(a_path, '\w+');
360-
l_rest_path constant varchar2(32767) := regexp_substr(a_path, '\.(.+)', subexpression => 1);
359+
c_root constant varchar2(32767) := regexp_substr(a_path, '\w+');
360+
c_rest_path constant varchar2(32767) := regexp_substr(a_path, '\.(.+)', subexpression => 1);
361361
l_suite ut_suite;
362362
l_item ut_suite_item;
363363
l_items ut_suite_items := ut_suite_items();
@@ -375,9 +375,9 @@ create or replace package body ut_suite_manager is
375375

376376
l_item_name := l_item.name;
377377
--l_item_name := regexp_substr(l_item_name,'\w+$'); -- temporary fix. seems like suite have suitepath in object_name
378-
if regexp_like(l_item_name, l_root, modifier => 'i') then
378+
if regexp_like(l_item_name, c_root, modifier => 'i') then
379379

380-
skip_by_path(l_item, l_rest_path);
380+
skip_by_path(l_item, c_rest_path);
381381
l_items.extend;
382382
l_items(l_items.count) := l_item;
383383

source/install.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ whenever oserror exit failure rollback
3535
@@core/types/ut_executable.tps
3636
@@core/types/ut_test.tps
3737
@@core/types/ut_suite.tps
38+
@@core/types/ut_real_suite.tps
3839
@@core/types/ut_run.tps
3940
@@core/types/ut_reporter_base.tps
4041
@@core/types/ut_reporters.tps
@@ -56,6 +57,7 @@ whenever oserror exit failure rollback
5657
@@core/types/ut_suite_item.tpb
5758
@@core/types/ut_test.tpb
5859
@@core/types/ut_suite.tpb
60+
@@core/types/ut_real_suite.tpb
5961
@@core/types/ut_run.tpb
6062
@@core/types/ut_event_listener.tpb
6163
@@core/types/ut_assert_result.tpb

source/uninstall.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ drop type ut_reporter_base force;
138138

139139
drop type ut_run;
140140

141+
drop type ut_real_suite;
142+
141143
drop type ut_suite;
142144

143145
drop type ut_test;

0 commit comments

Comments
 (0)