Skip to content

Commit fb9ef0b

Browse files
committed
Added suite name escaping
1 parent e451e4b commit fb9ef0b

File tree

4 files changed

+84
-9
lines changed

4 files changed

+84
-9
lines changed

source/reporters/ut_tap_reporter.tpb

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@ create or replace type body ut_tap_reporter is
1313
self.print_clob(regexp_replace(a_comment, '^', '# ', 1, 0, 'm'));
1414
end print_comment;
1515

16+
member function escape_special_chars(self in out nocopy ut_tap_reporter, a_string_to_escape clob) return clob as
17+
begin
18+
return regexp_replace(a_string_to_escape, '([\\#])', '\\\1');
19+
end escape_special_chars;
20+
1621
overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite) as
1722
begin
18-
self.print_text('# Subtest: ' || coalesce(a_suite.description, a_suite.name));
23+
self.print_text('# Subtest: ' || self.escape_special_chars(coalesce(a_suite.description, a_suite.name)));
1924
lvl := lvl + 2;
2025
self.print_text('1..' || a_suite.items.count);
2126
end before_calling_suite;
@@ -94,9 +99,9 @@ create or replace type body ut_tap_reporter is
9499
lvl := lvl - 2;
95100
if lvl = 0 then
96101
if a_suite.result = ut_utils.gc_success or a_suite.result = ut_utils.gc_disabled then
97-
self.print_text('ok - ' || l_suite_name);
102+
self.print_text('ok - ' || self.escape_special_chars(l_suite_name));
98103
elsif a_suite.result > ut_utils.gc_success then
99-
self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || l_suite_name);
104+
self.print_text(ut_ansiconsole_helper.red('not ok') || ' - ' || self.escape_special_chars(l_suite_name));
100105
end if;
101106

102107
self.print_text(' ');

source/reporters/ut_tap_reporter.tps

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ create or replace type ut_tap_reporter under ut_documentation_reporter(
22

33
constructor function ut_tap_reporter(self in out nocopy ut_tap_reporter) return self as result,
44
member procedure print_comment(self in out nocopy ut_tap_reporter, a_comment clob),
5+
member function escape_special_chars(self in out nocopy ut_tap_reporter, a_string_to_escape clob) return clob,
56
overriding member procedure before_calling_suite(self in out nocopy ut_tap_reporter, a_suite ut_logical_suite),
67

78
overriding member procedure after_calling_test(self in out nocopy ut_tap_reporter, a_test ut_test),

test/ut3_user/reporters/test_tap_reporter.pkb

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,52 @@ create or replace package body test_tap_reporter as
22

33
gc_boilerplate_suitepath_expression constant varchar2(300) := 'TAP version 14\s*1..1\s*# Subtest: org\s{5}1..1\s{5}# Subtest: utplsql\s{9}1..1\s{9}# Subtest: tests\s{13}1..1\s{13}# Subtest: helpers\s{17}1..1\s{17}# Subtest: A suite for testing different outcomes from reporters';
44

5+
6+
procedure compile_tests as
7+
pragma autonomous_transaction;
8+
begin
9+
10+
execute immediate q'[
11+
create or replace package test_tap_escaping as
12+
--%suite(Some \ and # to be escaped)
13+
14+
--%test(Even more \\ and multiple ###)
15+
procedure more_escaping;
16+
17+
--%test(Disabled test)
18+
--%disabled(With \ and # in skip reason)
19+
procedure not_skipping_escapes;
20+
end test_tap_escaping;
21+
]';
22+
23+
execute immediate q'[
24+
create or replace package body test_tap_escaping as
25+
26+
procedure more_escaping as
27+
begin
28+
ut.expect(1).to_equal(1);
29+
end more_escaping;
30+
31+
32+
procedure not_skipping_escapes as
33+
begin
34+
ut.expect(10).to_equal(1);
35+
end not_skipping_escapes;
36+
37+
end test_tap_escaping;
38+
]';
39+
40+
end compile_tests;
41+
42+
543
procedure simple_succeeding_test as
644
l_output_data ut3_develop.ut_varchar2_list;
745
l_expected varchar2(32767);
846
begin
947
l_expected := gc_boilerplate_suitepath_expression || '\s{21}1..1\s{21}# <!beforeall!>\s{21}# Subtest: A description of some context\s{25}1..1\s{25}ok - passing_test\s{25}# <!beforeeach!>\s{25}# <!beforetest!>\s{25}# <!passing test!>\s{25}# <!aftertest!>\s{25}# <!aftereach!>\s{21}# <!afterall!>\sok - org\s*';
1048

1149
select *
12-
bulk collect into l_output_data
50+
bulk collect into l_output_data
1351
from table(ut3_develop.ut.run('test_reporters.passing_test',ut3_develop.ut_tap_reporter()));
1452

1553
ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected);
@@ -22,7 +60,7 @@ create or replace package body test_tap_reporter as
2260
l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# <!beforeall!>\s{21}not ok - a test with failing assertion\s{23}---\s{23}message: '"Fails as values are different"'\s{23}severity: fail\s{23}...\s{21}# <!beforeeach!>\s{21}# <!failing test!>\s{21}# <!aftereach!>\s{21}# <!afterall!>\snot ok - org\s*]';
2361

2462
select *
25-
bulk collect into l_output_data
63+
bulk collect into l_output_data
2664
from table(ut3_develop.ut.run('test_reporters.failing_test',ut3_develop.ut_tap_reporter()));
2765

2866
ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected);
@@ -36,7 +74,7 @@ create or replace package body test_tap_reporter as
3674
l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# <!beforeall!>\s{21}not ok - a test raising unhandled exception\s{23}---\s{23}message: |\s{25ORA-06502: .*\s{25}ORA-06512: at line [[:digit:]]+\s{23}severity: error\s{23}...\s{21}# <!beforeeach!>\s{21}# <!erroring test!>\s{21}# <!aftereach!>\s{21}# <!afterall!>\snot ok - org\s*]';
3775

3876
select *
39-
bulk collect into l_output_data
77+
bulk collect into l_output_data
4078
from table(ut3_develop.ut.run('test_reporters.erroring_test',ut3_develop.ut_tap_reporter()));
4179

4280
ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected);
@@ -50,7 +88,7 @@ create or replace package body test_tap_reporter as
5088
l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# <!beforeall!>\s{21}ok - a disabled test # SKIP: Disabled for testing purpose\s{21}# <!afterall!>\sok - org\s*]';
5189

5290
select *
53-
bulk collect into l_output_data
91+
bulk collect into l_output_data
5492
from table(ut3_develop.ut.run('test_reporters.disabled_test',ut3_develop.ut_tap_reporter()));
5593

5694
ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected);
@@ -64,7 +102,7 @@ create or replace package body test_tap_reporter as
64102
l_expected := gc_boilerplate_suitepath_expression || q'[\s{21}1..1\s{21}# <!beforeall!>\s{21}ok - a disabled test with no reason # SKIP\s{21}# <!afterall!>\sok - org\s*]';
65103

66104
select *
67-
bulk collect into l_output_data
105+
bulk collect into l_output_data
68106
from table(ut3_develop.ut.run('test_reporters.disabled_test_no_reason',ut3_develop.ut_tap_reporter()));
69107

70108
ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected);
@@ -78,10 +116,31 @@ create or replace package body test_tap_reporter as
78116
l_expected := q'[TAP version 14\s*1..1\s*# Subtest: org.*# Subtest: A suite.*\s{21}1..5\s{21}# <!beforeall!>\s{21}# Subtest: A desc.*\s{25}1..1\s{25}ok - passing_test\s{25}# <!beforeeach!>\s{25}# <!beforet.*\s{25}# <!aftereach!>\s{21}not ok - a test w.*\s{23}---\s{23}message:.*\s{21}# <!beforeeach!>.*\s{21}# <!aftereach!>not ok - a test rai.*\s{23}---\s{23}message: |.*ok - a disabled test # SKIP: Disabled for testing purpose.*ok - a dis.* # SKIP\s{21}# <!afterall!>\snot ok - org\s*]';
79117

80118
select *
81-
bulk collect into l_output_data
119+
bulk collect into l_output_data
82120
from table(ut3_develop.ut.run('test_reporters',ut3_develop.ut_tap_reporter()));
83121

84122
ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_match(l_expected, 'n');
85123
end multiple_tests_different_outcome;
124+
125+
126+
procedure escape_suite_name as
127+
l_output_data ut3_develop.ut_varchar2_list;
128+
l_expected varchar2(32767);
129+
begin
130+
l_expected := q'[%# Subtest: Some \\ and \# to be escaped%ok - Some \\ and \# to be escaped%]';
131+
132+
select *
133+
bulk collect into l_output_data
134+
from table(ut3_develop.ut.run('test_tap_escaping.more_escaping',ut3_develop.ut_tap_reporter()));
135+
136+
ut.expect(ut3_tester_helper.main_helper.table_to_clob(l_output_data)).to_be_like(l_expected);
137+
end escape_suite_name;
138+
139+
140+
procedure drop_help_tests as
141+
pragma autonomous_transaction;
142+
begin
143+
execute immediate 'drop package test_tap_escaping';
144+
end drop_help_tests;
86145
end test_tap_reporter;
87146
/

test/ut3_user/reporters/test_tap_reporter.pks

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ create or replace package test_tap_reporter as
33
--%suite(ut_tap_reporter)
44
--%suitepath(utplsql.test_user.reporters)
55

6+
--%beforeall
7+
procedure compile_tests;
8+
69
--%test(Simple succeeding test)
710
procedure simple_succeeding_test;
811

@@ -21,5 +24,12 @@ create or replace package test_tap_reporter as
2124
--%test(Multiple tests with different outcome)
2225
procedure multiple_tests_different_outcome;
2326

27+
--%test(Escape special characters in suite name)
28+
procedure escape_suite_name;
29+
30+
31+
--%afterall
32+
procedure drop_help_tests;
33+
2434
end test_tap_reporter;
2535
/

0 commit comments

Comments
 (0)