GildedRose-Refactoring-Kata/plpgsql/pgunit/asserts.sql
2019-12-28 16:13:44 +01:00

60 lines
2.0 KiB
PL/PgSQL

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;