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

Skip to content

Commit 5cecd63

Browse files
committed
Separated error messages on asserts from regular messages, assert name and additional info.
Fixed a bug where not_to turned a errored assertion into a success. Updated code comments.
1 parent 40d5616 commit 5cecd63

9 files changed

Lines changed: 92 additions & 19 deletions

File tree

examples/demo_expectations.pck

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ create or replace package demo_expectations is
22

33
-- %suite(Demoing asserts)
44

5+
-- %test(demo of expectations with nulls)
6+
procedure demo_nulls_on_expectations;
7+
58
-- %test(demo of failure for to_equal expectation on value mismatch)
69
procedure demo_to_equal_failure;
710

@@ -53,6 +56,49 @@ end;
5356

5457
create or replace package body demo_expectations is
5558

59+
procedure demo_nulls_on_expectations is
60+
begin
61+
--fails on incompatible data types
62+
ut.expect( to_clob('a text'), 'this should fail' ).to_equal( 'a text' );
63+
ut.expect( to_clob('a text'), 'this should fail' ).to_( equal( 'a text' ) );
64+
ut.expect( cast(systimestamp as timestamp), 'this should fail' ).to_( equal( systimestamp ) );
65+
ut.expect( to_clob('a text'), 'this should fail' ).not_to( equal( 'a text' ) );
66+
ut.expect( cast(systimestamp as timestamp), 'this should fail' ).not_to( equal( systimestamp ) );
67+
68+
--fails on incompatible data types even if values are null
69+
ut.expect( to_char(null), 'this should fail' ).to_( equal( to_char(null) ) );
70+
ut.expect( to_char(null), 'this should fail' ).not_to( equal( to_char(null) ) );
71+
72+
--fails on nulls not beeig equal
73+
ut_assert_processor.nulls_are_equal(false);
74+
ut.expect( to_char(null), 'fails when global null_are_equal=false' ).to_( equal(to_char(null) ) );
75+
ut_assert_processor.nulls_are_equal( true );
76+
ut.expect( to_char(null), 'fails when local null_are_equal=false' ).to_( equal(to_char(null), a_nulls_are_equal => false ) );
77+
78+
--succeeds when nulls are considered equal
79+
ut_assert_processor.nulls_are_equal(false);
80+
ut.expect( to_char(null) , 'succeeds when local null_are_equal=true' ).to_( equal( to_char(null), a_nulls_are_equal => true ) );
81+
ut_assert_processor.nulls_are_equal( true );
82+
ut.expect( to_char(null), 'succeeds when global null_are_equal=true' ).to_( equal( to_char(null) ) );
83+
84+
--fails as null is not comparable with not null
85+
ut.expect( to_char(null), 'fails on null = not null' ).to_( equal( 'a text' ) );
86+
ut.expect( 'a text', 'fails on not null = null' ).to_( equal( to_char(null) ) );
87+
ut.expect( to_char(null), 'fails on null <> not null' ).not_to( equal( 'a text' ) );
88+
ut.expect( 'a text', 'fails on not null <> null' ).not_to( equal( to_char(null) ) );
89+
ut.expect( to_char(null), 'fails on null <> not null, with a_nulls_are_equal => true' ).not_to( equal( 'a text', a_nulls_are_equal => true ) );
90+
ut.expect( 'a text', 'fails on not null <> null, with a_nulls_are_equal => false' ).not_to( equal( to_char(null), a_nulls_are_equal => false ) );
91+
92+
ut.expect( to_char(null), 'fails on null like ''text''' ).to_( be_like( 'a text' ) );
93+
ut.expect( to_char(null), 'fails on null not like ''text''' ).not_to( be_like( 'a text' ) );
94+
95+
ut.expect( cast(null as boolean), 'fails on null = true' ).to_( be_true );
96+
ut.expect( cast(null as boolean), 'fails on null <> true' ).not_to( be_true );
97+
ut.expect( cast(null as boolean), 'fails on null = false' ).to_( be_false );
98+
ut.expect( cast(null as boolean), 'fails on null <> false' ).not_to( be_false );
99+
100+
end;
101+
56102
procedure demo_to_equal_failure is
57103
l_expected_anydata anydata := anydata.convertObject( department$('IT') );
58104
l_expected_blob blob := to_blob('AF12FF');

source/assertions/ut_assertion.tpb

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
create or replace type body ut_assertion as
22

33
final member procedure add_assert_result( self in ut_assertion, a_assert_result boolean, a_assert_name varchar2,
4-
a_assert_info varchar2, a_expected_value_string in varchar2 := null, a_expected_data_type varchar2 := null) is
4+
a_assert_info varchar2, a_error_message varchar2, a_expected_value_string in varchar2 := null, a_expected_data_type varchar2 := null
5+
) is
6+
l_assert_info varchar2(4000);
57
begin
8+
l_assert_info := case when a_assert_info is not null then ' '||a_assert_info end;
69
ut_utils.debug_log('ut_assertion.add_assert_result :' || ut_utils.to_test_result(a_assert_result) || ':' || message);
710
ut_assert_processor.add_assert_result(
811
ut_assert_result(
9-
a_assert_name, a_assert_info, ut_utils.to_test_result(a_assert_result),
12+
a_assert_name, l_assert_info, a_error_message, ut_utils.to_test_result(coalesce(a_assert_result,false)),
1013
a_expected_data_type, self.actual_data.type, a_expected_value_string, self.actual_data.to_string(), self.message
1114
)
1215
);
@@ -88,9 +91,10 @@ create or replace type body ut_assertion as
8891
l_assert_result := l_expectation.run_expectation( self.actual_data );
8992
l_assert_name := 'to '||l_expectation.name;
9093
if l_expectation.expected is not null then
91-
add_assert_result( l_assert_result, l_assert_name, l_expectation.additional_info, l_expectation.expected.to_string(), l_expectation.expected.type);
94+
add_assert_result( l_assert_result, l_assert_name, l_expectation.additional_info, l_expectation.error_message
95+
, l_expectation.expected.to_string(), l_expectation.expected.type );
9296
else
93-
add_assert_result( l_assert_result, l_assert_name, l_expectation.additional_info );
97+
add_assert_result( l_assert_result, l_assert_name, l_expectation.additional_info, l_expectation.error_message );
9498
end if;
9599
end;
96100

@@ -104,9 +108,10 @@ create or replace type body ut_assertion as
104108
l_assert_result := not l_expectation.run_expectation( self.actual_data );
105109
l_assert_name := 'not to '||l_expectation.name;
106110
if l_expectation.expected is not null then
107-
add_assert_result( l_assert_result, l_assert_name, l_expectation.additional_info, l_expectation.expected.to_string(), l_expectation.expected.type);
111+
add_assert_result( l_assert_result, l_assert_name, l_expectation.additional_info, l_expectation.error_message
112+
, l_expectation.expected.to_string(), l_expectation.expected.type );
108113
else
109-
add_assert_result( l_assert_result, l_assert_name, l_expectation.additional_info );
114+
add_assert_result( l_assert_result, l_assert_name, l_expectation.additional_info, l_expectation.error_message );
110115
end if;
111116
end;
112117

source/assertions/ut_assertion.tps

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ create or replace type ut_assertion as object
33
actual_data ut_data_value,
44
message varchar2(4000 char),
55
final member procedure add_assert_result( self in ut_assertion, a_assert_result boolean, a_assert_name varchar2,
6-
a_assert_info varchar2, a_expected_value_string in varchar2 := null, a_expected_data_type varchar2 := null),
6+
a_assert_info varchar2, a_error_message varchar2, a_expected_value_string in varchar2 := null, a_expected_data_type varchar2 := null),
77
member procedure to_equal(self in ut_assertion, a_expected anydata, a_nulls_are_equal boolean := null),
88
member procedure to_equal(self in ut_assertion, a_expected blob, a_nulls_are_equal boolean := null),
99
member procedure to_equal(self in ut_assertion, a_expected boolean, a_nulls_are_equal boolean := null),

source/expectation_data_values/ut_data_value_refcursor.tps

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ create or replace type ut_data_value_refcursor under ut_data_value(
99
/*
1010
var: value
1111

12-
Holds a cursor number obtained by calling dbms_sql.to_cursor_number(sys_refcursor)
12+
Holds a dbms_xmlgen context for a cursor obtained by calling dbms_xmlgen.newContext(sys_refcursor)
1313
*/
1414
value number,
1515

source/expectations/ut_expectation.tpb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@ create or replace type body ut_expectation as
33
member function run_expectation(self in out nocopy ut_expectation, a_actual ut_data_value) return boolean is
44
begin
55
ut_utils.debug_log('Failure - ut_expectation.run_expectation'||'(a_actual '||a_actual.type||')');
6-
self.additional_info := self.additional_info ||'. The matcher '''||self.name||''' cannot be used with data type ('||a_actual.type||')';
7-
return false;
6+
self.error_message := 'The matcher '''||self.name||''' cannot be used';
7+
if self.expected is not null then
8+
self.error_message := self.error_message ||' for comparison of data type ('||self.expected.type||')';
9+
end if;
10+
self.error_message := self.error_message ||' with data type ('||a_actual.type||').';
11+
return null;
812
end;
913

1014
end;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
11
create or replace type ut_expectation as object(
22
name varchar2(250),
33
additional_info varchar2(4000),
4+
error_message varchar2(4000),
45
expected ut_data_value,
6+
7+
/*
8+
function: run_expectation
9+
10+
A superclass function that executes the matcher.
11+
This is actually a fallback function, that should be called by subtype when there is a data type mismatch.
12+
The subtype should override this function and return:
13+
- true for success of a matcher,
14+
- false for faulure of a matcher,
15+
- null when result cannot be determined (type mismatch or exception)
16+
*/
517
member function run_expectation(self in out nocopy ut_expectation, a_actual ut_data_value) return boolean
618
) not final not instantiable
719
/

source/types/ut_assert_result.tpb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
create or replace type body ut_assert_result is
22

3-
constructor function ut_assert_result(a_result integer, a_message varchar2, a_name varchar2 default null)
3+
constructor function ut_assert_result(a_result integer, a_error_message varchar2, a_name varchar2 default null)
44
return self as result is
55
begin
6-
self.name := a_name;
7-
self.object_type := 0;
8-
self.result := a_result;
9-
self.message := a_message;
6+
self.name := a_name;
7+
self.object_type := 0;
8+
self.result := a_result;
9+
self.error_message := a_error_message;
1010
return;
1111
end ut_assert_result;
1212

13-
constructor function ut_assert_result(a_name varchar2, a_additional_info varchar2, a_result integer, a_expected_type varchar2, a_actual_type varchar2,
13+
constructor function ut_assert_result(a_name varchar2, a_additional_info varchar2, a_error_message varchar2, a_result integer, a_expected_type varchar2, a_actual_type varchar2,
1414
a_expected_value_string varchar2, a_actual_value_string varchar2, a_message varchar2 default null)
1515
return self as result is
1616
begin
@@ -19,6 +19,7 @@ create or replace type body ut_assert_result is
1919
self.object_type := 0;
2020
self.result := a_result;
2121
self.message := a_message;
22+
self.error_message := a_error_message;
2223
self.expected_type := a_expected_type;
2324
self.actual_type := a_actual_type;
2425
self.expected_value_string := a_expected_value_string;

source/types/ut_assert_result.tps

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ create or replace type ut_assert_result force under ut_object
66
expected_value_string varchar2(4000 char),
77
actual_value_string varchar2(4000 char),
88
message varchar2(4000 char),
9-
constructor function ut_assert_result(a_result integer, a_message varchar2, a_name varchar2 default null)
9+
error_message varchar2(4000 char),
10+
constructor function ut_assert_result(a_result integer, a_error_message varchar2, a_name varchar2 default null)
1011
return self as result,
11-
constructor function ut_assert_result(a_name varchar2, a_additional_info varchar2, a_result integer, a_expected_type varchar2, a_actual_type varchar2,
12+
constructor function ut_assert_result(a_name varchar2, a_additional_info varchar2, a_error_message varchar2,
13+
a_result integer, a_expected_type varchar2, a_actual_type varchar2,
1214
a_expected_value_string varchar2, a_actual_value_string varchar2, a_message varchar2 default null)
1315
return self as result
1416
)

source/types/ut_dbms_output_suite_reporter.tpb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,17 @@ create or replace type body ut_dbms_output_suite_reporter is
4343
if l_assert.result != ut_utils.tr_success then
4444
print('expected: ' || l_assert.actual_value_string||'('||l_assert.actual_type||')');
4545
print(
46-
l_assert.name || ' ' ||l_assert.additional_info
46+
l_assert.name || l_assert.additional_info
4747
|| case
4848
when l_assert.expected_value_string is not null or l_assert.expected_type is not null
4949
then ': '||l_assert.expected_value_string||'('||l_assert.expected_type||')'
5050
end
5151
);
5252
print(l_assert.result_to_char());
5353
end if;
54+
if l_assert.error_message is not null then
55+
print('error message: '||l_assert.error_message);
56+
end if;
5457
end if;
5558
end;
5659

0 commit comments

Comments
 (0)