diff --git a/postgres/asserts.sql b/postgres/asserts.sql new file mode 100644 index 00000000..d51b5b6a --- /dev/null +++ b/postgres/asserts.sql @@ -0,0 +1,59 @@ +CREATE OR REPLACE FUNCTION test_assertEquals(message TEXT, expected ANYELEMENT, result ANYELEMENT) RETURNS VOID AS $$ +BEGIN + IF expected = result THEN + null; + ELSE + raise exception '%: expect ''%'' instead of ''%''', message, expected, result using errcode = 'triggered_action_exception'; + END IF; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION test_assertEquals(expected ANYELEMENT, result ANYELEMENT) RETURNS VOID AS $$ +BEGIN + perform test_assertEquals('assertEquals failure', expected, result); +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION test_assertEqualsArray(expected VARCHAR[], result VARCHAR[]) RETURNS VOID AS $$ +DECLARE + line RECORD; + error_message text; +BEGIN + IF expected = result THEN + null; + ELSE + error_message := 'assertEqualsArray failure:'; + FOR line IN SELECT expected_item, result_item FROM (SELECT unnest(expected) AS expected_item, unnest(result) AS result_item) x + LOOP + IF line.expected_item = line.result_item THEN + error_message := CONCAT(error_message, E'\n', '= ', line.expected_item); + ELSE + error_message := CONCAT(error_message, E'\n', '- ', line.expected_item); + error_message := CONCAT(error_message, E'\n', '+ ', line.result_item); + END IF; + END LOOP; + + raise exception '%', error_message using errcode = 'triggered_action_exception'; + END IF; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION test_assertEquals_golden_master(expected VARCHAR[], result VARCHAR[]) RETURNS VOID as $$ +DECLARE + golden TEXT; + line VARCHAR; +BEGIN + perform test_assertEqualsArray(expected, result); +EXCEPTION + WHEN triggered_action_exception THEN + golden := CONCAT(SQLERRM, E'\n\n', E'For update, copy:\n'); + golden := CONCAT(golden, E'expected := ARRAY['); + FOREACH line IN ARRAY result + LOOP + golden := CONCAT(golden, E'\n', '''', line, ''','); + END LOOP; + golden := CONCAT(golden, E'\n', '];'); + + raise exception '%', golden using errcode = 'triggered_action_exception'; +END; +$$ LANGUAGE plpgsql; diff --git a/postgres/asserts_tests.sql b/postgres/asserts_tests.sql new file mode 100644 index 00000000..05cd77f1 --- /dev/null +++ b/postgres/asserts_tests.sql @@ -0,0 +1,95 @@ +CREATE OR REPLACE FUNCTION test_case_assertEquals_numeric_should_fail_if_not_equals() RETURNS VOID AS $$ +DECLARE + expected_message VARCHAR; + error_message VARCHAR; + is_equals BOOLEAN; +BEGIN + BEGIN + perform test_assertEquals(7, 5); + EXCEPTION + WHEN triggered_action_exception THEN + expected_message := 'assertEquals failure: expect ''7'' instead of ''5'''; + error_message := SQLERRM; + perform test_assertTrue(format('Expect message ''%s'' instead of ''%s'' ', expected_message, error_message), error_message = expected_message); + END; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION test_case_assertEquals_numeric_should_success_if_equals() RETURNS VOID AS $$ +BEGIN + perform test_assertEquals(7, 7); +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION test_case_assertEquals_text_should_fail_if_not_equals() RETURNS VOID AS $$ +DECLARE + expected_message VARCHAR; + error_message VARCHAR; + is_equals BOOLEAN; +BEGIN + BEGIN + perform test_assertEquals('hello'::VARCHAR, 'olleh'); + EXCEPTION + WHEN triggered_action_exception THEN + expected_message := 'assertEquals failure: expect ''hello'' instead of ''olleh'''; + error_message := SQLERRM; + perform test_assertTrue(format('Expect message ''%s'' instead of ''%s'' ', expected_message, error_message), error_message = expected_message); + END; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION test_case_assertEquals_text_should_success_if_equals() RETURNS VOID AS $$ +BEGIN + perform test_assertEquals('hello'::VARCHAR, 'hello'); +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION test_case_assertEquals_should_display_custom_message_if_defined() RETURNS VOID AS $$ +DECLARE + expected_message VARCHAR; + error_message VARCHAR; + is_equals BOOLEAN; +BEGIN + BEGIN + perform test_assertEquals('Test with custom message', 'hello'::VARCHAR, 'olleh'); + EXCEPTION + WHEN triggered_action_exception THEN + expected_message := 'Test with custom message: expect ''hello'' instead of ''olleh'''; + error_message := SQLERRM; + perform test_assertTrue(format('Expect message ''%s'' instead of ''%s'' ', expected_message, error_message), error_message = expected_message); + END; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION test_case_assertEqualsArray_should_success_if_equals() RETURNS VOID AS $$ +BEGIN + perform test_assertEqualsArray(ARRAY['1','2'], ARRAY['1','2']); + perform test_assertEqualsArray(ARRAY['a','b'], ARRAY['a','b']); +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION test_case_assertEqualsArray_should_display_diff_if_failed() RETURNS VOID AS $$ +DECLARE + expected_message VARCHAR; + error_message VARCHAR; + is_equals BOOLEAN; +BEGIN + BEGIN + perform test_assertEqualsArray(ARRAY['1','2','3','4'], ARRAY['1','2','4','4']); + EXCEPTION + WHEN triggered_action_exception THEN + expected_message := CONCAT( + 'assertEqualsArray failure:', E'\n', + '= 1', E'\n', + '= 2', E'\n', + '- 3', E'\n', + '+ 4', E'\n', + '= 4' + ); + error_message := SQLERRM; + perform test_assertTrue(format('Expect message ''%s'' instead of ''%s'' ', expected_message, error_message), error_message = expected_message); + END; +END; +$$ LANGUAGE plpgsql; + +SELECT * FROM test_run_all();