--- sql/pgtap--0.95.0--0.96.0.sql +++ sql/pgtap--0.95.0--0.96.0.sql @@ -233,183 +233,3 @@ CREATE OR REPLACE FUNCTION _error_diag( ), ''); $$ LANGUAGE sql IMMUTABLE; --- lives_ok( sql, description ) -CREATE OR REPLACE FUNCTION lives_ok ( TEXT, TEXT ) -RETURNS TEXT AS $$ -DECLARE - code TEXT := _query($1); - descr ALIAS FOR $2; - detail text; - hint text; - context text; - schname text; - tabname text; - colname text; - chkname text; - typname text; -BEGIN - EXECUTE code; - RETURN ok( TRUE, descr ); -EXCEPTION WHEN OTHERS THEN - -- There should have been no exception. - GET STACKED DIAGNOSTICS - detail = PG_EXCEPTION_DETAIL, - hint = PG_EXCEPTION_HINT, - context = PG_EXCEPTION_CONTEXT, - schname = SCHEMA_NAME, - tabname = TABLE_NAME, - colname = COLUMN_NAME, - chkname = CONSTRAINT_NAME, - typname = PG_DATATYPE_NAME; - RETURN ok( FALSE, descr ) || E'\n' || diag( - ' died: ' || _error_diag(SQLSTATE, SQLERRM, detail, hint, context, schname, tabname, colname, chkname, typname) - ); -END; -$$ LANGUAGE plpgsql; - -CREATE OR REPLACE FUNCTION _runner( text[], text[], text[], text[], text[] ) -RETURNS SETOF TEXT AS $$ -DECLARE - startup ALIAS FOR $1; - shutdown ALIAS FOR $2; - setup ALIAS FOR $3; - teardown ALIAS FOR $4; - tests ALIAS FOR $5; - tap TEXT; - tfaild INTEGER := 0; - ffaild INTEGER := 0; - tnumb INTEGER := 0; - fnumb INTEGER := 0; - tok BOOLEAN := TRUE; -BEGIN - BEGIN - -- No plan support. - PERFORM * FROM no_plan(); - FOR tap IN SELECT * FROM _runem(startup, false) LOOP RETURN NEXT tap; END LOOP; - EXCEPTION - -- Catch all exceptions and simply rethrow custom exceptions. This - -- will roll back everything in the above block. - WHEN raise_exception THEN RAISE EXCEPTION '%', SQLERRM; - END; - - -- Record how startup tests have failed. - tfaild := num_failed(); - - FOR i IN 1..COALESCE(array_upper(tests, 1), 0) LOOP - - -- What subtest are we running? - RETURN NEXT ' ' || diag_test_name('Subtest: ' || tests[i]); - - -- Reset the results. - tok := TRUE; - tnumb := COALESCE(_get('curr_test'), 0); - - IF tnumb > 0 THEN - EXECUTE 'ALTER SEQUENCE __tresults___numb_seq RESTART WITH 1'; - PERFORM _set('curr_test', 0); - PERFORM _set('failed', 0); - END IF; - - DECLARE - errstate text; - errmsg text; - detail text; - hint text; - context text; - schname text; - tabname text; - colname text; - chkname text; - typname text; - BEGIN - BEGIN - -- Run the setup functions. - FOR tap IN SELECT * FROM _runem(setup, false) LOOP - RETURN NEXT regexp_replace(tap, '^', ' ', 'gn'); - END LOOP; - - -- Run the actual test function. - FOR tap IN EXECUTE 'SELECT * FROM ' || tests[i] || '()' LOOP - RETURN NEXT regexp_replace(tap, '^', ' ', 'gn'); - END LOOP; - - -- Run the teardown functions. - FOR tap IN SELECT * FROM _runem(teardown, false) LOOP - RETURN NEXT regexp_replace(tap, '^', ' ', 'gn'); - END LOOP; - - -- Emit the plan. - fnumb := COALESCE(_get('curr_test'), 0); - RETURN NEXT ' 1..' || fnumb; - - -- Emit any error messages. - IF fnumb = 0 THEN - RETURN NEXT ' # No tests run!'; - tok = false; - ELSE - -- Report failures. - ffaild := num_failed(); - IF ffaild > 0 THEN - tok := FALSE; - RETURN NEXT ' ' || diag( - 'Looks like you failed ' || ffaild || ' test' || - CASE tfaild WHEN 1 THEN '' ELSE 's' END - || ' of ' || fnumb - ); - END IF; - END IF; - - EXCEPTION WHEN raise_exception THEN - -- Something went wrong. Record that fact. - errstate := SQLSTATE; - errmsg := SQLERRM; - GET STACKED DIAGNOSTICS - detail = PG_EXCEPTION_DETAIL, - hint = PG_EXCEPTION_HINT, - context = PG_EXCEPTION_CONTEXT, - schname = SCHEMA_NAME, - tabname = TABLE_NAME, - colname = COLUMN_NAME, - chkname = CONSTRAINT_NAME, - typname = PG_DATATYPE_NAME; - END; - - -- Always raise an exception to rollback any changes. - RAISE EXCEPTION '__TAP_ROLLBACK__'; - - EXCEPTION WHEN raise_exception THEN - IF errmsg IS NOT NULL THEN - -- Something went wrong. Emit the error message. - tok := FALSE; - RETURN NEXT regexp_replace( diag('Test died: ' || _error_diag( - errstate, errmsg, detail, hint, context, schname, tabname, colname, chkname, typname - )), '^', ' ', 'gn'); - errmsg := NULL; - END IF; - END; - - -- Restore the sequence. - EXECUTE 'ALTER SEQUENCE __tresults___numb_seq RESTART WITH ' || tnumb + 1; - PERFORM _set('curr_test', tnumb); - PERFORM _set('failed', tfaild); - - -- Record this test. - RETURN NEXT ok(tok, tests[i]); - IF NOT tok THEN tfaild := tfaild + 1; END IF; - - END LOOP; - - -- Run the shutdown functions. - FOR tap IN SELECT * FROM _runem(shutdown, false) LOOP RETURN NEXT tap; END LOOP; - - -- Finish up. - FOR tap IN SELECT * FROM _finish( COALESCE(_get('curr_test'), 0), 0, tfaild ) LOOP - RETURN NEXT tap; - END LOOP; - - -- Clean up and return. - PERFORM _cleanup(); - RETURN; -END; -$$ LANGUAGE plpgsql; -