Skip to content

Commit 217c150

Browse files
committed
Added the documentation-like reporter.
Minor refactorings done. Fixed suite manager to call `after_run` with a list of executed suites.
1 parent 160c3a8 commit 217c150

File tree

11 files changed

+176
-12
lines changed

11 files changed

+176
-12
lines changed

examples/RunExpectations.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ set echo off
1313
@@ut_custom_reporter.tpb
1414

1515
begin
16-
ut_suite_manager.run_cur_schema_suites_static(ut_custom_reporter(a_tab_size => 2), a_force_parse_again => true);
16+
ut_suite_manager.run_cur_schema_suites_static(ut_documentation_reporter(), a_force_parse_again => true);
1717
end;
1818
/
1919

source/core/types/ut_test.tpb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ create or replace type body ut_test is
5151

5252
self.start_time := current_timestamp;
5353

54-
if nvl(self.ignore_flag,0) != 1 then
54+
if self.get_ignore_flag() = false then
5555
begin
5656

5757
if self.is_valid() then

source/core/types/ut_test_object.tpb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ create or replace type body ut_test_object is
22

33
member procedure set_ignore_flag(self in out nocopy ut_test_object, a_ignore_flag boolean) is
44
begin
5-
65
self.ignore_flag := case a_ignore_flag when true then 1 else 0 end;
76
end;
7+
8+
member function get_ignore_flag return boolean is
9+
begin
10+
return case self.ignore_flag when 1 then true else false end;
11+
end;
12+
813
member procedure set_rollback_type(self in out nocopy ut_test_object, a_rollback_type integer) is
914
begin
1015
ut_utils.validate_rollback_type(a_rollback_type => a_rollback_type);
@@ -13,12 +18,8 @@ create or replace type body ut_test_object is
1318
end;
1419

1520
member function execution_time return number is
16-
l_sec number;
1721
begin
18-
l_sec := extract(day from(end_time - start_time)) * 24 * 60 * 60 +
19-
extract(hour from(end_time - start_time)) * 60 * 60 + extract(minute from(end_time - start_time)) * 60 +
20-
extract(second from(end_time - start_time));
21-
return l_sec;
22+
return ut_utils.time_diff(start_time, end_time);
2223
end;
2324

2425
final member procedure do_execute(self in out nocopy ut_test_object) is

source/core/types/ut_test_object.tps

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ create or replace type ut_test_object force under ut_composite_object
1010
final member procedure do_execute(self in out nocopy ut_test_object),
1111

1212
member procedure set_ignore_flag(self in out nocopy ut_test_object, a_ignore_flag boolean),
13+
member function get_ignore_flag return boolean,
1314
member procedure set_rollback_type(self in out nocopy ut_test_object, a_rollback_type integer),
1415

1516
member function execution_time return number

source/core/ut_suite_manager.pkb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,9 @@ create or replace package body ut_suite_manager is
282282
end config_schema;
283283

284284
procedure run_schema_suites(a_owner_name varchar2, a_reporter in out nocopy ut_reporter, a_force_parse_again boolean default false) is
285-
l_ind varchar2(4000 char);
286-
l_suite ut_test_suite;
285+
l_ind varchar2(4000 char);
286+
l_suite ut_test_suite;
287+
l_suite_list ut_objects_list := ut_objects_list();
287288
begin
288289
--TODO - we do not have a way to pass list of suites here
289290
a_reporter.before_run(ut_objects_list());
@@ -297,15 +298,15 @@ create or replace package body ut_suite_manager is
297298
while l_ind is not null loop
298299
l_suite := g_schema_suites(a_owner_name) (l_ind);
299300
l_suite.do_execute(a_reporter => a_reporter);
300-
g_schema_suites(a_owner_name)(l_ind) := l_suite;
301+
l_suite_list.extend; l_suite_list(l_suite_list.last) := l_suite;
301302
l_ind := g_schema_suites(a_owner_name).next(l_ind);
302303
end loop;
303304
else
304305
-- we have to figure out what to do here
305306
null;
306307
end if;
307308
--TODO - we do not have a way to pass list of suites here
308-
a_reporter.after_run(ut_objects_list());
309+
a_reporter.after_run(l_suite_list);
309310
end run_schema_suites;
310311

311312
procedure run_schema_suites_static(a_owner_name varchar2, a_reporter in ut_reporter, a_force_parse_again boolean default false) is

source/core/ut_utils.pkb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,5 +126,14 @@ create or replace package body ut_utils is
126126
return case a_value when 1 then true when 0 then false end;
127127
end;
128128

129+
function time_diff(a_start_time timestamp with time zone, a_end_time timestamp with time zone) return number is
130+
begin
131+
return
132+
extract(day from(a_end_time - a_start_time)) * 24 * 60 * 60 +
133+
extract(hour from(a_end_time - a_start_time)) * 60 * 60 +
134+
extract(minute from(a_end_time - a_start_time)) * 60 +
135+
extract(second from(a_end_time - a_start_time));
136+
end;
137+
129138
end ut_utils;
130139
/

source/core/ut_utils.pks

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,5 +88,7 @@ create or replace package ut_utils authid definer is
8888
*/
8989
procedure validate_rollback_type(a_rollback_type number);
9090

91+
function time_diff(a_start_time timestamp with time zone, a_end_time timestamp with time zone) return number;
92+
9193
end ut_utils;
9294
/

source/install.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ whenever oserror exit failure rollback
135135
@@reporters/ut_teamcity_reporter_helper.pks
136136
@@reporters/ut_teamcity_reporter_helper.pkb
137137
@@reporters/ut_teamcity_reporter.tpb
138+
@@reporters/ut_documentation_reporter.tps
139+
@@reporters/ut_documentation_reporter.tpb
138140

139141
@@legacy/ut_assert.pks
140142
@@legacy/ut_assert.pkb
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
create or replace type body ut_documentation_reporter is
2+
3+
constructor function ut_documentation_reporter(self in out nocopy ut_documentation_reporter, a_output ut_output default ut_output_dbms_output()) return self as result is
4+
begin
5+
self.name := $$plsql_unit;
6+
self.output := a_output;
7+
self.lvl := 0;
8+
self.failed_tests := ut_objects_list();
9+
self.test_count := 0;
10+
self.igonred_test_count := 0;
11+
return;
12+
end;
13+
14+
member function tab(self in ut_documentation_reporter) return varchar2 is
15+
tab_str varchar2(255);
16+
begin
17+
tab_str := rpad(' ', lvl * 2);
18+
return tab_str;
19+
end tab;
20+
21+
overriding member procedure print(self in out nocopy ut_documentation_reporter, a_text varchar2) is
22+
begin
23+
(self as ut_reporter).print(tab || a_text);
24+
end print;
25+
26+
overriding member procedure before_suite(self in out nocopy ut_documentation_reporter, a_suite ut_object) as
27+
l_suite ut_test_suite := treat(a_suite as ut_test_suite);
28+
begin
29+
self.print( coalesce( a_suite.name, l_suite.object_name ) );
30+
lvl := lvl + 1;
31+
end;
32+
33+
overriding member procedure before_test(self in out nocopy ut_documentation_reporter, a_test ut_object) as
34+
begin
35+
test_count := test_count + 1;
36+
if treat(a_test as ut_test).get_ignore_flag() then
37+
igonred_test_count := igonred_test_count + 1;
38+
end if;
39+
end;
40+
overriding member procedure after_test(self in out nocopy ut_documentation_reporter, a_test ut_object) as
41+
l_test ut_test := treat(a_test as ut_test);
42+
l_message varchar2(4000);
43+
begin
44+
l_message := coalesce( l_test.name, l_test.test.form_name );
45+
--if test failed, then add it to the failures list, print failure with number
46+
if l_test.result != ut_utils.tr_success then
47+
failed_tests.extend;
48+
failed_tests(failed_tests.last) := l_test;
49+
l_message := l_message || ' (FAILED - '||failed_tests.last||')';
50+
end if;
51+
self.print( l_message );
52+
end;
53+
54+
overriding member procedure after_suite(self in out nocopy ut_documentation_reporter, a_suite ut_object) as
55+
l_suite ut_test_suite := treat(a_suite as ut_test_suite);
56+
begin
57+
lvl := lvl - 1;
58+
self.print( ' ' );
59+
end;
60+
61+
overriding member procedure after_run(self in out nocopy ut_documentation_reporter, a_suites in ut_objects_list) as
62+
l_start_time timestamp with time zone := to_date('9999','yyyy');
63+
l_end_time timestamp with time zone := to_date('0001','yyyy');
64+
procedure print_failures_summary is
65+
l_assert ut_assert_result;
66+
l_test ut_test;
67+
begin
68+
if failed_tests.count > 0 then
69+
70+
self.print( 'Failures:' );
71+
72+
for i in 1 .. failed_tests.count loop
73+
l_test := treat(failed_tests(i) as ut_test);
74+
self.print(lpad(i, 4,' ')||') '||coalesce( l_test.name, l_test.test.form_name ));
75+
lvl := lvl + 3;
76+
self.print('Failures/Errors:');
77+
lvl := lvl + 1;
78+
for j in 1 .. l_test.items.count loop
79+
l_assert := treat(l_test.items(j) as ut_assert_result);
80+
if l_assert.result != ut_utils.tr_success then
81+
if l_assert.message is not null then
82+
self.print('message: '||l_assert.message);
83+
end if;
84+
if l_assert.result != ut_utils.tr_success then
85+
self.print('expected: ' || l_assert.actual_value_string||'('||l_assert.actual_type||')');
86+
self.print(
87+
l_assert.name || l_assert.additional_info
88+
|| case
89+
when l_assert.expected_value_string is not null or l_assert.expected_type is not null
90+
then ': '||l_assert.expected_value_string||'('||l_assert.expected_type||')'
91+
end
92+
);
93+
end if;
94+
if l_assert.error_message is not null then
95+
self.print('error: '||l_assert.error_message);
96+
end if;
97+
end if;
98+
end loop;
99+
lvl := lvl - 4;
100+
end loop;
101+
end if;
102+
end;
103+
begin
104+
print_failures_summary();
105+
for i in 1 .. a_suites.count loop
106+
l_start_time := least(l_start_time, treat(a_suites(i) as ut_test_object).start_time);
107+
l_end_time := greatest(l_end_time, treat(a_suites(i) as ut_test_object).end_time);
108+
end loop;
109+
self.print( 'Finished in '||ut_utils.to_string(ut_utils.time_diff(l_start_time, l_end_time))||' seconds' );
110+
self.print(
111+
test_count || ' tests' ||
112+
case
113+
when failed_tests.count > 1 then ', '||failed_tests.count||' failures'
114+
when failed_tests.count > 0 then ', '||failed_tests.count||' failure'
115+
end ||
116+
case
117+
when igonred_test_count > 0 then ', '||igonred_test_count||' ignored'
118+
end
119+
);
120+
--todo: report total suite result here with pretty message
121+
-- self.print('suite "' || l_suite.name || '" ended. Took: '||to_char(l_duration));
122+
-- self.print(ut_documentation_reporter.c_dashed_line);
123+
end;
124+
125+
end;
126+
/
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
create or replace type ut_documentation_reporter force under ut_reporter
2+
(
3+
lvl integer,
4+
failed_tests ut_objects_list,
5+
test_count integer,
6+
igonred_test_count integer,
7+
constructor function ut_documentation_reporter(self in out nocopy ut_documentation_reporter, a_output ut_output default ut_output_dbms_output()) return self as result,
8+
member function tab(self in ut_documentation_reporter) return varchar2,
9+
10+
overriding member procedure print(self in out nocopy ut_documentation_reporter, a_text varchar2),
11+
overriding member procedure before_suite(self in out nocopy ut_documentation_reporter, a_suite ut_object),
12+
overriding member procedure before_test(self in out nocopy ut_documentation_reporter, a_test ut_object),
13+
overriding member procedure after_test(self in out nocopy ut_documentation_reporter, a_test ut_object),
14+
overriding member procedure after_suite(self in out nocopy ut_documentation_reporter, a_suite ut_object),
15+
overriding member procedure after_run(self in out nocopy ut_documentation_reporter, a_suites in ut_objects_list)
16+
17+
)
18+
not final
19+
/

0 commit comments

Comments
 (0)