package liquibase.sqlgenerator;
import liquibase.database.Database;
import liquibase.database.core.H2Database;
import liquibase.exception.ValidationErrors;
import liquibase.exception.Warnings;
import liquibase.sql.Sql;
import liquibase.sqlgenerator.core.AddAutoIncrementGenerator;
import liquibase.sqlgenerator.core.AddAutoIncrementGeneratorDB2;
import liquibase.sqlgenerator.core.AddAutoIncrementGeneratorHsqlH2;
import liquibase.sqlgenerator.core.AddColumnGenerator;
import liquibase.statement.SqlStatement;
import liquibase.statement.core.AddAutoIncrementStatement;
import org.junit.After;
import static org.junit.Assert.*;
import org.junit.Test;
import java.util.Collection;
import java.util.SortedSet;
public class SqlGeneratorFactoryTest {
@After
public void teardown() {
SqlGeneratorFactory.reset();
}
@Test
public void getInstance() {
assertNotNull(SqlGeneratorFactory.getInstance());
assertTrue(SqlGeneratorFactory.getInstance() == SqlGeneratorFactory.getInstance());
}
@Test
public void register() {
SqlGeneratorFactory.getInstance().getGenerators().clear();
assertEquals(0, SqlGeneratorFactory.getInstance().getGenerators().size());
SqlGeneratorFactory.getInstance().register(new MockSqlGenerator(1, "A1"));
assertEquals(1, SqlGeneratorFactory.getInstance().getGenerators().size());
}
@Test
public void unregister_instance() {
SqlGeneratorFactory factory = SqlGeneratorFactory.getInstance();
factory.getGenerators().clear();
assertEquals(0, factory.getGenerators().size());
AddAutoIncrementGeneratorHsqlH2 sqlGenerator
= new AddAutoIncrementGeneratorHsqlH2();
factory.register(new AddAutoIncrementGenerator());
factory.register(sqlGenerator);
factory.register(new AddAutoIncrementGeneratorDB2());
assertEquals(3, factory.getGenerators().size());
factory.unregister(sqlGenerator);
assertEquals(2, factory.getGenerators().size());
}
@Test
public void unregister_class() {
SqlGeneratorFactory factory = SqlGeneratorFactory.getInstance();
factory.getGenerators().clear();
assertEquals(0, factory.getGenerators().size());
AddAutoIncrementGeneratorHsqlH2 sqlGenerator
= new AddAutoIncrementGeneratorHsqlH2();
factory.register(new AddAutoIncrementGenerator());
factory.register(sqlGenerator);
factory.register(new AddAutoIncrementGeneratorDB2());
assertEquals(3, factory.getGenerators().size());
factory.unregister(AddAutoIncrementGeneratorHsqlH2.class);
assertEquals(2, factory.getGenerators().size());
}
@Test
public void unregister_class_doesNotExist() {
SqlGeneratorFactory factory = SqlGeneratorFactory.getInstance();
factory.getGenerators().clear();
assertEquals(0, factory.getGenerators().size());
factory.register(new AddAutoIncrementGenerator());
factory.register(new AddAutoIncrementGeneratorHsqlH2());
factory.register(new AddAutoIncrementGeneratorDB2());
assertEquals(3, factory.getGenerators().size());
factory.unregister(AddColumnGenerator.class);
assertEquals(3, factory.getGenerators().size());
}
@Test
public void reset() {
SqlGeneratorFactory instance1 = SqlGeneratorFactory.getInstance();
SqlGeneratorFactory.reset();
assertFalse(instance1 == SqlGeneratorFactory.getInstance());
}
@SuppressWarnings("unchecked")
@Test
public void builtInGeneratorsAreFound() {
Collection<SqlGenerator> generators = SqlGeneratorFactory.getInstance().getGenerators();
assertTrue(generators.size() > 10);
}
@Test
public void getGenerators() {
SortedSet<SqlGenerator> allGenerators = SqlGeneratorFactory.getInstance().getGenerators(new AddAutoIncrementStatement(null, null, "person", "name", "varchar(255)", null, null), new H2Database());
assertNotNull(allGenerators);
assertEquals(1, allGenerators.size());
}
private SqlGenerator addGenerator(final Class<? extends SqlStatement> sqlStatementClass, final Class<? extends Database> sqlDatabaseClass, final int level) {
SqlGenerator generator = new SqlGenerator() {
@Override
public int getPriority() {
return level;
}
@Override
public boolean generateStatementsIsVolatile(Database database) {
return false;
}
@Override
public boolean generateRollbackStatementsIsVolatile(Database database) {
return false;
}
@Override
public Warnings warn(SqlStatement sqlStatement, Database database, SqlGeneratorChain sqlGeneratorChain) {
return new Warnings();
}
@Override
public ValidationErrors validate(SqlStatement sqlStatement, Database database, SqlGeneratorChain sqlGeneratorChain) {
return new ValidationErrors();
}
@Override
public boolean supports(SqlStatement statement, Database database) {
boolean ret = sqlStatementClass.isAssignableFrom(statement.getClass()) && sqlDatabaseClass.isAssignableFrom(database.getClass());
return ret;
}
@Override
public Sql[] generateSql(SqlStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
return new Sql[0];
}
};
SqlGeneratorFactory.getInstance().register(generator);
return generator;
}
}