CREATE OR REPLACE FUNCTION unit_tests.create_unique_name_test()

RETURNS test_result AS $$

DECLARE message test_result;

DECLARE result TEXT;
DECLARE table_name TEXT = 'unit_tests.temp_create_unique_name';
DECLARE col_name TEXT = 'name';
DECLARE col_unique_name TEXT = 'unique_name';

BEGIN

EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
EXECUTE format('CREATE TABLE IF NOT EXISTS %s (%s TEXT, %s TEXT)', table_name, col_name, col_unique_name);

SELECT create_unique_name INTO result FROM framework.create_unique_name('test', table_name, col_name, col_unique_name);
IF result <> 'test' THEN
    SELECT assert.fail('Expected "test" value is "' || result || '"') INTO message;
    EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
    RETURN message;
END IF;

EXECUTE format('INSERT INTO %s (%s, %s) VALUES ($1, $2);', table_name, col_name, col_unique_name)
USING 'test', 'test';
SELECT create_unique_name INTO result FROM framework.create_unique_name('test', table_name, col_name, col_unique_name);
IF result <> 'test-2' THEN
    SELECT assert.fail('Expected "test-2" value is "' || result || '"') INTO message;
    EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
    RETURN message;
END IF;

EXECUTE format('INSERT INTO %s (%s, %s) VALUES ($1, $2);', table_name, col_name, col_unique_name)
USING 'test', 'test-2';
SELECT create_unique_name INTO result FROM framework.create_unique_name('test', table_name, col_name, col_unique_name);
IF result <> 'test-3' THEN
    SELECT assert.fail('Expected "test-3" value is "' || result || '"') INTO message;
    EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
    RETURN message;
END IF;

EXECUTE format('INSERT INTO %s (%s, %s) VALUES ($1, $2);', table_name, col_name, col_unique_name)
USING 'test', 'test-3';
SELECT create_unique_name INTO result FROM framework.create_unique_name('test', table_name, col_name, col_unique_name);
IF result <> 'test-4' THEN
    SELECT assert.fail('Expected "test-4" value is "' || result || '"') INTO message;
    EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
    RETURN message;
END IF;

EXECUTE format('INSERT INTO %s (%s, %s) VALUES ($1, $2);', table_name, col_name, col_unique_name)
USING 'test-2', 'test-2';
SELECT create_unique_name INTO result FROM framework.create_unique_name('test-2', table_name, col_name, col_unique_name);
IF result <> 'test-2-3' THEN
    SELECT assert.fail('Expected "test-2-3" value is "' || result || '"') INTO message;
    EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
    RETURN message;
END IF;

EXECUTE format('DROP TABLE IF EXISTS %s', table_name);
SELECT assert.ok('framework.create_unique_name is OK') INTO message;
RETURN message;

END; $$ LANGUAGE plpgsql;