blob: ab13744488167157b78823510384589fedbd7b97 [file] [log] [blame]
package org.apache.ddlutils.alteration;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.sql.Types;
import java.util.List;
import org.apache.ddlutils.model.Database;
/**
* Tests the comparison on the model level.
*
* @version $Revision: $
*/
public class TestModelComparison extends TestComparisonBase
{
/**
* Tests the addition of a table.
*/
public void testAddTable()
{
final String MODEL1 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TableA'>\n" +
" <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
final String MODEL2 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TABLEA'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
" <table name='TABLEB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = getPlatform(false).getChanges(model1, model2);
assertEquals(1,
changes.size());
AddTableChange change = (AddTableChange)changes.get(0);
assertTable("TABLEB", null, 1, 0, 0,
change.getNewTable());
assertColumn("COLPK", Types.INTEGER, null, null, true, true, false,
change.getNewTable().getColumn(0));
}
/**
* Tests the addition of a table with an index.
*/
public void testAddTableWithIndex()
{
final String MODEL1 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TableA'>\n" +
" <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
final String MODEL2 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TABLEA'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
" <table name='TABLEB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='COLA' type='DOUBLE'/>\n" +
" <index name='TestIndex'>\n" +
" <index-column name='COLA'/>\n" +
" </index>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = getPlatform(false).getChanges(model1, model2);
assertEquals(1,
changes.size());
AddTableChange change = (AddTableChange)changes.get(0);
assertTable("TABLEB", null, 2, 0, 1,
change.getNewTable());
assertColumn("COLPK", Types.INTEGER, null, null, true, true, false,
change.getNewTable().getColumn(0));
assertColumn("COLA", Types.DOUBLE, null, null, false, false, false,
change.getNewTable().getColumn(1));
assertIndex("TestIndex", false, new String[] { "COLA" },
change.getNewTable().getIndex(0));
}
/**
* Tests the addition of a table and a foreign key to it.
*/
public void testAddTableAndForeignKeyToIt()
{
final String MODEL1 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TABLEA'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='COLFK' type='INTEGER'/>\n" +
" </table>\n" +
"</database>";
final String MODEL2 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TABLEA'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='COLFK' type='INTEGER'/>\n" +
" <foreign-key name='TESTFKB' foreignTable='TABLEB'>\n" +
" <reference local='COLFK' foreign='COLPK'/>\n" +
" </foreign-key>\n" +
" </table>\n" +
" <table name='TABLEB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = getPlatform(false).getChanges(model1, model2);
assertEquals(2,
changes.size());
AddTableChange tableChange = (AddTableChange)changes.get(0);
AddForeignKeyChange fkChange = (AddForeignKeyChange)changes.get(1);
assertTable("TABLEB", null, 1, 0, 0,
tableChange.getNewTable());
assertColumn("COLPK", Types.INTEGER, null, null, true, true, false,
tableChange.getNewTable().getColumn(0));
assertEquals("TABLEA",
fkChange.getChangedTable());
assertForeignKey("TESTFKB", "TABLEB", new String[] { "COLFK" }, new String[] { "COLPK" },
fkChange.getNewForeignKey());
}
/**
* Tests the addition of two tables with foreign keys to each other .
*/
public void testAddTablesWithForeignKeys()
{
final String MODEL1 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
"</database>";
final String MODEL2 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TABLEA'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='COLFK' type='INTEGER'/>\n" +
" <foreign-key name='TESTFKB' foreignTable='TABLEB'>\n" +
" <reference local='COLFK' foreign='COLPK'/>\n" +
" </foreign-key>\n" +
" </table>\n" +
" <table name='TABLEB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='COLFK' type='INTEGER'/>\n" +
" <foreign-key name='TESTFKA' foreignTable='TABLEA'>\n" +
" <reference local='COLFK' foreign='COLPK'/>\n" +
" </foreign-key>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = getPlatform(false).getChanges(model1, model2);
assertEquals(4,
changes.size());
AddTableChange tableChange1 = (AddTableChange)changes.get(0);
AddTableChange tableChange2 = (AddTableChange)changes.get(1);
AddForeignKeyChange fkChange1 = (AddForeignKeyChange)changes.get(2);
AddForeignKeyChange fkChange2 = (AddForeignKeyChange)changes.get(3);
assertTable("TABLEA", null, 2, 0, 0,
tableChange1.getNewTable());
assertColumn("COLPK", Types.INTEGER, null, null, true, true, false,
tableChange1.getNewTable().getColumn(0));
assertColumn("COLFK", Types.INTEGER, null, null, false, false, false,
tableChange1.getNewTable().getColumn(1));
assertTable("TABLEB", null, 2, 0, 0,
tableChange2.getNewTable());
assertColumn("COLPK", Types.INTEGER, null, null, true, true, false,
tableChange2.getNewTable().getColumn(0));
assertColumn("COLFK", Types.INTEGER, null, null, false, false, false,
tableChange2.getNewTable().getColumn(1));
assertEquals("TABLEA",
fkChange1.getChangedTable());
assertForeignKey("TESTFKB", "TABLEB", new String[] { "COLFK" }, new String[] { "COLPK" },
fkChange1.getNewForeignKey());
assertEquals("TABLEB",
fkChange2.getChangedTable());
assertForeignKey("TESTFKA", "TABLEA", new String[] { "COLFK" }, new String[] { "COLPK" },
fkChange2.getNewForeignKey());
}
/**
* Tests the removal of a table.
*/
public void testDropTable()
{
final String MODEL1 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TableA'>\n" +
" <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
" <table name='TableB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
final String MODEL2 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TABLEB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = getPlatform(false).getChanges(model1, model2);
assertEquals(1,
changes.size());
RemoveTableChange change = (RemoveTableChange)changes.get(0);
assertEquals("TableA",
change.getChangedTable());
}
/**
* Tests the removal of a table with an index.
*/
public void testDropTableWithIndex()
{
final String MODEL1 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TableA'>\n" +
" <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='ColA' type='INTEGER'/>\n" +
" <index name='TestIndex'>\n" +
" <index-column name='ColA'/>\n" +
" </index>\n" +
" </table>\n" +
" <table name='TableB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
final String MODEL2 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TABLEB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = getPlatform(false).getChanges(model1, model2);
assertEquals(1,
changes.size());
RemoveTableChange change = (RemoveTableChange)changes.get(0);
assertEquals("TableA",
change.getChangedTable());
}
/**
* Tests the removal of a table with a foreign key.
*/
public void testDropTableWithForeignKey()
{
final String MODEL1 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TableA'>\n" +
" <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='COLFK' type='INTEGER'/>\n" +
" <foreign-key name='TESTFKB' foreignTable='TableB'>\n" +
" <reference local='COLFK' foreign='COLPK'/>\n" +
" </foreign-key>\n" +
" </table>\n" +
" <table name='TableB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
final String MODEL2 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TABLEB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = getPlatform(false).getChanges(model1, model2);
assertEquals(2,
changes.size());
RemoveForeignKeyChange fkChange = (RemoveForeignKeyChange)changes.get(0);
RemoveTableChange tableChange = (RemoveTableChange)changes.get(1);
assertEquals("TableA",
fkChange.getChangedTable());
assertEquals(model1.findTable("TableA").getForeignKey(0),
fkChange.findChangedForeignKey(model1, false));
assertEquals("TableA",
tableChange.getChangedTable());
}
/**
* Tests the removal of a table and a foreign key to it.
*/
public void testDropTableAndForeignKeyToIt()
{
final String MODEL1 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TableA'>\n" +
" <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
" <table name='TableB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='COLFK' type='INTEGER'/>\n" +
" <foreign-key name='TESTFKA' foreignTable='TableA'>\n" +
" <reference local='COLFK' foreign='ColPK'/>\n" +
" </foreign-key>\n" +
" </table>\n" +
"</database>";
final String MODEL2 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TABLEB'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='COLFK' type='INTEGER'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = getPlatform(false).getChanges(model1, model2);
assertEquals(2,
changes.size());
RemoveForeignKeyChange fkChange = (RemoveForeignKeyChange)changes.get(0);
RemoveTableChange tableChange = (RemoveTableChange)changes.get(1);
assertEquals("TableB",
fkChange.getChangedTable());
assertEquals(model1.findTable("TableB").getForeignKey(0),
fkChange.findChangedForeignKey(model1, false));
assertEquals("TableA",
tableChange.getChangedTable());
}
/**
* Tests the addition and removal of a table.
*/
public void testAddAndDropTable()
{
final String MODEL1 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TableA'>\n" +
" <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
final String MODEL2 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TABLEA'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = getPlatform(true).getChanges(model1, model2);
assertEquals(2,
changes.size());
RemoveTableChange change1 = (RemoveTableChange)changes.get(0);
AddTableChange change2 = (AddTableChange)changes.get(1);
assertEquals("TableA",
change1.getChangedTable());
assertTable("TABLEA", null, 1, 0, 0,
change2.getNewTable());
assertColumn("COLPK", Types.INTEGER, null, null, true, true, false,
change2.getNewTable().getColumn(0));
}
}