diff --git a/examples/RunAllExamples.sql b/examples/RunAllExamples.sql index f60af0a7e..5e53d7d04 100644 --- a/examples/RunAllExamples.sql +++ b/examples/RunAllExamples.sql @@ -21,5 +21,9 @@ prompt RunExampleTestAnnotationsHugePackage @@RunExampleTestAnnotationsHugePackage.sql prompt RunExpectations @@RunExpectations.sql -prompt RunWithDocumentationReporter + @@RunWithDocumentationReporter.sql + +@@award_bonus/run_award_bonus_test.sql +@@between_string/run_betwnstr_test.sql +@@remove_rooms_by_name/run_remove_rooms_by_name_test.sql diff --git a/examples/award_bonus/award_bonus.sql b/examples/award_bonus/award_bonus.sql new file mode 100644 index 000000000..787d5cfa4 --- /dev/null +++ b/examples/award_bonus/award_bonus.sql @@ -0,0 +1,20 @@ +--https://docs.oracle.com/database/sql-developer-4.2/RPTUG/sql-developer-unit-testing.htm#RPTUG45065 + + +create or replace procedure award_bonus (emp_id number, sales_amt number) as + commission real; + comm_missing exception; +begin + select commission_pct into commission + from employees_test + where employee_id = emp_id; + + if commission is null then + raise comm_missing; + else + update employees_test + set salary = nvl(salary,0) + sales_amt*commission + where employee_id = emp_id; + end if; +end; +/ diff --git a/examples/award_bonus/employees_test.sql b/examples/award_bonus/employees_test.sql new file mode 100644 index 000000000..de46d31b0 --- /dev/null +++ b/examples/award_bonus/employees_test.sql @@ -0,0 +1,7 @@ +create table employees_test (employee_id number primary key, commission_pct number, salary number); +insert into employees_test values (1001, 0.2, 8400); +insert into employees_test values (1002, 0.25, 6000); +insert into employees_test values (1003, 0.3, 5000); +-- next employee is not in the sales department, thus is not on commission. +insert into employees_test values (1004, null, 10000); +commit; diff --git a/examples/award_bonus/run_award_bonus_test.sql b/examples/award_bonus/run_award_bonus_test.sql new file mode 100644 index 000000000..b0aff827e --- /dev/null +++ b/examples/award_bonus/run_award_bonus_test.sql @@ -0,0 +1,11 @@ +@@employees_test.sql +@@award_bonus.sql +@@test_award_bonus.pkg + +set serveroutput on size unlimited format truncated + +exec ut.run(user||'.test_award_bonus',ut_documentation_reporter()); + +drop package test_award_bonus; +drop procedure award_bonus; +drop table employees_test; diff --git a/examples/award_bonus/test_award_bonus.pkg b/examples/award_bonus/test_award_bonus.pkg new file mode 100644 index 000000000..3238576cb --- /dev/null +++ b/examples/award_bonus/test_award_bonus.pkg @@ -0,0 +1,82 @@ +create or replace package test_award_bonus as + + -- %suite(Award bonus) + + -- %test(Sets new salary as pct commision * sales amount) + -- %testsetup(add_test_employee) + procedure update_employee_salary; + + -- %test(Raises exception if null bonus is passed) + -- %testsetup(add_employee_with_null_comm) + procedure fail_on_null_bonus; + + procedure add_test_employee; + + procedure add_employee_with_null_comm; + +end; +/ + +create or replace package body test_award_bonus as + + gc_test_employee constant integer := -1; + gc_salary constant number := 4500; + gc_commision_pct constant number := 0.2; + + procedure update_employee_salary is + results sys_refcursor; + expected sys_refcursor; + not_affected sys_refcursor; + c_sales_amount constant number := 1000; + begin + --arrange + open expected for + select (salary + c_sales_amount * gc_commision_pct) as new_salary + from employees_test where employee_id = gc_test_employee; + + open not_affected for + select * from employees_test where employee_id <> gc_test_employee; + + --act + award_bonus(emp_id => gc_test_employee, sales_amt => c_sales_amount); + + --assert + open results for + select salary as new_salary + from employees_test where employee_id = gc_test_employee; + + ut.expect( results ).to_( equal( expected ) ); + + open results for + select * from employees_test where employee_id != gc_test_employee; + + ut.expect( results ).to_( equal( not_affected ) ); + end; + + procedure fail_on_null_bonus is + begin + award_bonus(emp_id => gc_test_employee, sales_amt => null); + ut.expect( sqlcode ).not_to( equal( 0 ) ); + exception + when others then + ut.expect( sqlcode ).not_to( equal( 0 ) ); + end; + + procedure add_employee( emp_id number, comm_pct number, sal number ) is + begin + insert into employees_test (employee_id, commission_pct, salary) + values (emp_id, comm_pct, sal); + end; + + procedure add_test_employee is + begin + add_employee(gc_test_employee, 0.2, gc_salary); + end; + + procedure add_employee_with_null_comm is + begin + add_employee(gc_test_employee, null, gc_salary); + end; + +end; +/ diff --git a/examples/between_string/betwnstr.sql b/examples/between_string/betwnstr.sql new file mode 100644 index 000000000..dcdf343d8 --- /dev/null +++ b/examples/between_string/betwnstr.sql @@ -0,0 +1,9 @@ +create or replace function betwnstr( a_string varchar2, a_start_pos integer, a_end_pos integer ) return varchar2 is + l_start_pos pls_integer := a_start_pos; +begin + if l_start_pos = 0 then + l_start_pos := 1; + end if; + return substr( a_string, l_start_pos, a_end_pos - l_start_pos + 1); +end; +/ diff --git a/examples/between_string/run_betwnstr_test.sql b/examples/between_string/run_betwnstr_test.sql new file mode 100644 index 000000000..71553f105 --- /dev/null +++ b/examples/between_string/run_betwnstr_test.sql @@ -0,0 +1,10 @@ +@@betwnstr.sql +@@test_betwnstr.pkg + +set serveroutput on size unlimited format truncated + +exec ut.run(user||'.test_betwnstr',ut_documentation_reporter()); + +drop package test_betwnstr; +drop function betwnstr; + diff --git a/examples/between_string/test_betwnstr.pkg b/examples/between_string/test_betwnstr.pkg new file mode 100644 index 000000000..2984c1c2b --- /dev/null +++ b/examples/between_string/test_betwnstr.pkg @@ -0,0 +1,43 @@ +create or replace package test_betwnstr as + + -- %suite(Between string function) + + -- %test(Returns substring from start position to end position) + procedure normal_case; + + -- %test(Returns substring when start position is zero) + procedure zero_start_position; + + -- %test(Returns string until end if end position is greated than string length) + procedure big_end_position; + + -- %test(Returns null for null inlut srting value) + procedure null_string; +end; +/ + +create or replace package body test_betwnstr as + + procedure normal_case is + begin + ut.expect( betwnstr( '1234567', 2, 5 ) ).to_( equal('2345') ); + end; + + procedure zero_start_position is + begin + ut.expect( betwnstr( '1234567', 0, 5 ) ).to_( equal('12345') ); + end; + + + procedure big_end_position is + begin + ut.expect( betwnstr( '1234567', 0, 500 ) ).to_( equal('1234567') ); + end; + + procedure null_string is + begin + ut.expect( betwnstr( null, 2, 5 ) ).to_( be_null ); + end; + +end; +/ diff --git a/examples/demo_expectations.pck b/examples/demo_expectations.pck index 15f7622bc..39713df18 100644 --- a/examples/demo_expectations.pck +++ b/examples/demo_expectations.pck @@ -147,7 +147,7 @@ create or replace package body demo_expectations is ut.expect( l_actual_timestamp_tz ).to_( equal( l_expected_timestamp_tz ) ); ut.expect( l_actual_varchar2 ).to_( equal( l_expected_varchar2 ) ); - open l_actual_cursor for select * from user_objects where rownum <100; + open l_actual_cursor for select * from user_objects where rownum <6; open l_expected_cursor for select * from user_objects where rownum <5; ut.expect(l_actual_cursor).to_equal(l_expected_cursor); @@ -178,7 +178,7 @@ create or replace package body demo_expectations is ut.expect( l_timestamp ).to_equal( l_timestamp_tz ); ut.expect( l_timestamp_ltz ).to_equal( l_date ); ut.expect( l_varchar2 ).to_equal( l_clob ); - open l_cursor for select * from user_objects where rownum <100; + open l_cursor for select * from user_objects where rownum <5; ut.expect( l_cursor ).to_equal( l_varchar2 ); --using the to_( equal( ) ) matcher @@ -192,7 +192,7 @@ create or replace package body demo_expectations is ut.expect( l_timestamp ).to_( equal( l_timestamp_tz ) ); ut.expect( l_timestamp_ltz ).to_( equal( l_date ) ); ut.expect( l_varchar2 ).to_( equal( l_clob ) ); - open l_cursor for select * from user_objects where rownum <100; + open l_cursor for select * from user_objects where rownum <5; ut.expect( l_varchar2 ).to_( equal( l_cursor ) ); end; @@ -223,8 +223,8 @@ create or replace package body demo_expectations is ut.expect( l_timestamp_ltz ).to_equal( l_timestamp_ltz ); ut.expect( l_timestamp_tz ).to_equal( l_timestamp_tz ); ut.expect( l_varchar2 ).to_equal( l_varchar2 ); - open l_cursor1 for select * from all_objects; - open l_cursor2 for select * from all_objects; + open l_cursor1 for select * from all_objects where rownum <=50; + open l_cursor2 for select * from all_objects where rownum <=50; ut.expect( l_cursor1 ).to_equal( l_cursor2 ); --using the to_( equal( ) ) matcher @@ -239,8 +239,8 @@ create or replace package body demo_expectations is ut.expect( l_timestamp_tz ).to_( equal( l_timestamp_tz ) ); ut.expect( l_varchar2 ).to_( equal( l_varchar2 ) ); - open l_cursor1 for select * from all_objects; - open l_cursor2 for select * from all_objects; + open l_cursor1 for select * from all_objects where rownum <=50; + open l_cursor2 for select * from all_objects where rownum <=50; ut.expect( l_cursor1 ).to_( equal( l_cursor2 ) ); end; @@ -291,7 +291,7 @@ create or replace package body demo_expectations is l_timestamp_tz timestamp with time zone := l_timestamp; l_varchar2 varchar2(100) := 'a string'; begin - open l_cursor for select * from user_objects where rownum <100; + open l_cursor for select * from user_objects where rownum <5; --using the to_be_null() matcher ut.expect( l_anydata ).to_be_null(); ut.expect( l_blob ).to_be_null(); @@ -306,7 +306,7 @@ create or replace package body demo_expectations is ut.expect( l_cursor ).to_be_null; --using the to_( be_null() ) matcher - open l_cursor for select * from user_objects where rownum <100; + open l_cursor for select * from user_objects where rownum <5; ut.expect( l_anydata ).to_( be_null() ); ut.expect( l_blob ).to_( be_null() ); ut.expect( l_boolean ).to_( be_null() ); @@ -432,7 +432,7 @@ create or replace package body demo_expectations is l_timestamp_tz timestamp with time zone := sysdate; l_varchar2 varchar2(100) := 'a string'; begin - open l_cursor for select * from user_objects where rownum <100; + open l_cursor for select * from user_objects where rownum <5; --using the to_be_not_null() matcher ut.expect( l_anydata ).to_be_not_null(); ut.expect( l_blob ).to_be_not_null(); @@ -447,7 +447,7 @@ create or replace package body demo_expectations is ut.expect( l_cursor ).to_be_not_null; --using the to_( be_not_null() ) matcher - open l_cursor for select * from user_objects where rownum <100; + open l_cursor for select * from user_objects where rownum <5; ut.expect( l_anydata ).to_( be_not_null() ); ut.expect( l_blob ).to_( be_not_null() ); ut.expect( l_boolean ).to_( be_not_null() ); @@ -462,7 +462,7 @@ create or replace package body demo_expectations is end; procedure demo_to_match_failure is - l_clob clob := rpad('a',32767,'a')||'Stephen'; + l_clob clob := 'There was a guy named Stephen'; begin ut.expect( 'STEPHEN' ).to_match('^Stephen$'); ut.expect( 'stephen ' ).to_match('^Stephen$', 'i'); --case insensitive @@ -479,7 +479,7 @@ create or replace package body demo_expectations is end; procedure demo_to_match_success is - l_clob clob := rpad('a',32767,'a')||'STEPHEN'; + l_clob clob := 'There was a guy named STEPHEN'; begin ut.expect( 'Hi, I am Stephen' ).to_match('Stephen$'); ut.expect( 'stephen' ).to_match('^Stephen$', 'i'); --case insensitive @@ -492,7 +492,7 @@ create or replace package body demo_expectations is end; procedure demo_to_be_like_failure is - l_clob clob := rpad('a',32767,'a')||'Stephen'; + l_clob clob := 'There was a guy named Stephen'; begin ut.expect( 'STEPHEN' ).to_be_like('Stephen'); ut.expect( 'Stephen ' ).to_be_like('Stephen\_', '\'); --escape wildcards with '\' @@ -509,7 +509,7 @@ create or replace package body demo_expectations is end; procedure demo_to_be_like_success is - l_clob clob := rpad('a',32767,'a')||'STEPHEN_'; + l_clob clob := 'There was a guy named STEPHEN_'; begin ut.expect( 'Hi, I am Stephen' ).to_be_like('%Stephen'); ut.expect( 'stephen_' ).to_be_like('_tephen\_', '\'); --escape wildcards with '\' diff --git a/examples/remove_rooms_by_name/remove_rooms_by_name.sql b/examples/remove_rooms_by_name/remove_rooms_by_name.sql new file mode 100644 index 000000000..6871692f5 --- /dev/null +++ b/examples/remove_rooms_by_name/remove_rooms_by_name.sql @@ -0,0 +1,8 @@ +create or replace procedure remove_rooms_by_name( l_name rooms.name%type ) is +begin + if l_name is null then + raise program_error; + end if; + delete from rooms where name like l_name; +end; +/ diff --git a/examples/remove_rooms_by_name/rooms.sql b/examples/remove_rooms_by_name/rooms.sql new file mode 100644 index 000000000..522c48f84 --- /dev/null +++ b/examples/remove_rooms_by_name/rooms.sql @@ -0,0 +1,11 @@ +create table rooms ( + room_key number primary key, + name varchar2(100) +); + +create table room_contents ( + contents_key number primary key, + room_key number, + name varchar2(100), + constraint fk_rooms foreign key (room_key) references rooms (room_key) +); diff --git a/examples/remove_rooms_by_name/run_remove_rooms_by_name_test.sql b/examples/remove_rooms_by_name/run_remove_rooms_by_name_test.sql new file mode 100644 index 000000000..e5d14962e --- /dev/null +++ b/examples/remove_rooms_by_name/run_remove_rooms_by_name_test.sql @@ -0,0 +1,13 @@ +@@rooms.sql +@@remove_rooms_by_name.sql +@@test_remove_rooms_by_name.pkg + +set serveroutput on size unlimited format truncated + +exec ut.run(user||'.test_remove_rooms_by_name',ut_documentation_reporter()); + +drop package test_remove_rooms_by_name; +drop procedure remove_rooms_by_name; +drop table room_contents; +drop table rooms; + diff --git a/examples/remove_rooms_by_name/test_remove_rooms_by_name.pkg b/examples/remove_rooms_by_name/test_remove_rooms_by_name.pkg new file mode 100644 index 000000000..ed76e15b7 --- /dev/null +++ b/examples/remove_rooms_by_name/test_remove_rooms_by_name.pkg @@ -0,0 +1,96 @@ +create or replace package test_remove_rooms_by_name as + + -- %suite(Remove rooms by name) + + -- %suitesetup + procedure setup_rooms; + + -- %test(Removes a room without content in it) + procedure remove_empty_room; + + -- %test(Does not remove room when it has content) + procedure room_with_content; + + -- %test(Raises exception when null room name given) + procedure null_room_name; + +end; +/ + +create or replace package body test_remove_rooms_by_name as + + procedure setup_rooms is + begin + insert all + into rooms values(1, 'Dining Room') + into rooms values(2, 'Living Room') + into rooms values(3, 'Office') + into rooms values(4, 'Bathroom') + into rooms values(5, 'Bedroom') + select 1 from dual; + + insert all + into room_contents values(1, 1, 'Table') + into room_contents values(2, 1, 'Hutch') + into room_contents values(3, 1, 'Chair') + into room_contents values(4, 2, 'Sofa') + into room_contents values(5, 2, 'Lamp') + into room_contents values(6, 3, 'Desk') + into room_contents values(7, 3, 'Chair') + into room_contents values(8, 3, 'Computer') + into room_contents values(9, 3, 'Whiteboard') + select 1 from dual; + end; + + procedure remove_empty_room is + l_rooms_not_named_b sys_refcursor; + l_remaining_rooms sys_refcursor; + begin + open l_rooms_not_named_b for select * from rooms where name not like 'B%'; + + remove_rooms_by_name('B%'); + + open l_remaining_rooms for select * from rooms; + ut.expect( l_remaining_rooms ).to_(equal(l_rooms_not_named_b)); + end; + + procedure room_with_content is + l_rooms sys_refcursor; + l_remaining_rooms sys_refcursor; + begin + open l_rooms for select * from rooms; + + begin + remove_rooms_by_name('Living Room'); + ut.expect( sqlcode ).to_( equal(-2292) ); + exception + when others then + ut.expect( sqlcode ).to_( equal(-2292) ); + end; + + open l_remaining_rooms for select * from rooms; + + ut.expect( l_remaining_rooms ).to_( equal( l_rooms ) ); + end; + + procedure null_room_name is + l_rooms sys_refcursor; + l_remaining_rooms sys_refcursor; + begin + open l_rooms for select * from rooms; + + begin + remove_rooms_by_name(NULL); + ut.expect( sqlcode ).to_( equal(-6501) ); + exception + when others then + ut.expect( sqlcode ).to_( equal(-6501) ); + end; + + open l_remaining_rooms for select * from rooms; + + ut.expect( l_remaining_rooms ).to_( equal( l_rooms ) ); + end; + +end; +/