blob: b48564dca6ba560a228527443899bd85da8ab5d9 [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.PlatformInfo;
import org.apache.ddlutils.TestBase;
import org.apache.ddlutils.model.Database;
import org.apache.ddlutils.model.Table;
/**
* Tests the model comparison.
*
* @version $Revision: $
*/
public class TestModelComparator extends TestBase
{
/**
* Creates a new model comparator.
*
* @param caseSensitive Whether the comparison is case sensitive
* @return The model comparator
*/
protected ModelComparator createModelComparator(boolean caseSensitive)
{
PlatformInfo platformInfo = new PlatformInfo();
platformInfo.setHasSize(Types.DECIMAL, true);
platformInfo.setHasSize(Types.NUMERIC, true);
platformInfo.setHasSize(Types.CHAR, true);
platformInfo.setHasSize(Types.VARCHAR, true);
return new ModelComparator(platformInfo, caseSensitive);
}
/**
* 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 = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
AddTableChange change = (AddTableChange)changes.get(0);
assertEquals("TABLEB",
change.getNewTable().getName());
}
/**
* Tests the removal of a table.
*/
public void testRemoveTable()
{
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 = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
RemoveTableChange change = (RemoveTableChange)changes.get(0);
assertEquals("TableA",
change.getChangedTable().getName());
}
/**
* Tests the addition and removal of a table.
*/
public void testAddAndRemoveTable()
{
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 = createModelComparator(true).compare(model1, model2);
assertEquals(2,
changes.size());
AddTableChange change1 = (AddTableChange)changes.get(0);
RemoveTableChange change2 = (RemoveTableChange)changes.get(1);
assertEquals("TABLEA",
change1.getNewTable().getName());
assertEquals("TableA",
change2.getChangedTable().getName());
}
/**
* Tests the addition of a foreign key.
*/
public void testAddForeignKey()
{
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" +
" <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='TABLEA'>\n" +
" <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='COLFK' type='INTEGER'/>\n" +
" <foreign-key name='TESTFK' 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 = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
AddForeignKeyChange change = (AddForeignKeyChange)changes.get(0);
assertEquals("TESTFK",
change.getNewForeignKey().getName());
}
/**
* 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 = createModelComparator(false).compare(model1, model2);
assertEquals(4,
changes.size());
AddTableChange tableChange1 = (AddTableChange)changes.get(0);
AddForeignKeyChange fkChange1 = (AddForeignKeyChange)changes.get(1);
AddTableChange tableChange2 = (AddTableChange)changes.get(2);
AddForeignKeyChange fkChange2 = (AddForeignKeyChange)changes.get(3);
assertEquals("TABLEA",
tableChange1.getNewTable().getName());
assertEquals("TABLEB",
tableChange2.getNewTable().getName());
assertEquals("TESTFKB",
fkChange1.getNewForeignKey().getName());
assertEquals("TABLEA",
fkChange1.getChangedTable().getName());
assertEquals("TESTFKA",
fkChange2.getNewForeignKey().getName());
assertEquals("TABLEB",
fkChange2.getChangedTable().getName());
}
/**
* Tests the removal of a foreign key.
*/
public void testRemoveForeignKey()
{
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='TestFK' 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='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" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
RemoveForeignKeyChange change = (RemoveForeignKeyChange)changes.get(0);
assertEquals("TestFK",
change.getChangedForeignKey().getName());
}
/**
* Tests the addition and removal of a foreign key.
*/
public void testAddAndRemoveForeignKey1()
{
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='TestFK' 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='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='TESTFK' 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 = createModelComparator(true).compare(model1, model2);
assertEquals(2,
changes.size());
RemoveForeignKeyChange change1 = (RemoveForeignKeyChange)changes.get(0);
AddForeignKeyChange change2 = (AddForeignKeyChange)changes.get(1);
assertEquals("TestFK",
change1.getChangedForeignKey().getName());
assertEquals("TESTFK",
change2.getNewForeignKey().getName());
}
/**
* Tests the addition and removal of a foreign key because of a change of the references.
*/
public void testAddAndRemoveForeignKey2()
{
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='ColFK1' type='INTEGER'/>\n" +
" <column name='ColFK2' type='INTEGER'/>\n" +
" <foreign-key name='TestFK' foreignTable='TableB'>\n" +
" <reference local='ColFK1' foreign='ColPK1'/>\n" +
" <reference local='ColFK2' foreign='ColPK2'/>\n" +
" </foreign-key>\n" +
" </table>\n" +
" <table name='TableB'>\n" +
" <column name='ColPK1' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='ColPK2' 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" +
" <column name='ColFK1' type='INTEGER'/>\n" +
" <column name='ColFK2' type='INTEGER'/>\n" +
" <foreign-key name='TestFK' foreignTable='TableB'>\n" +
" <reference local='ColFK1' foreign='ColPK2'/>\n" +
" <reference local='ColFK2' foreign='ColPK1'/>\n" +
" </foreign-key>\n" +
" </table>\n" +
" <table name='TableB'>\n" +
" <column name='ColPK1' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='ColPK2' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(true).compare(model1, model2);
assertEquals(2,
changes.size());
RemoveForeignKeyChange change1 = (RemoveForeignKeyChange)changes.get(0);
AddForeignKeyChange change2 = (AddForeignKeyChange)changes.get(1);
assertEquals("TestFK",
change1.getChangedForeignKey().getName());
assertEquals("TestFK",
change2.getNewForeignKey().getName());
}
/**
* Tests that the order of the references in a foreign key is not important.
*/
public void testForeignKeyReferenceOrder()
{
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='ColFK1' type='INTEGER'/>\n" +
" <column name='ColFK2' type='INTEGER'/>\n" +
" <foreign-key name='TestFK' foreignTable='TableB'>\n" +
" <reference local='ColFK1' foreign='ColPK1'/>\n" +
" <reference local='ColFK2' foreign='ColPK2'/>\n" +
" </foreign-key>\n" +
" </table>\n" +
" <table name='TableB'>\n" +
" <column name='ColPK1' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='ColPK2' 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" +
" <column name='ColFK1' type='INTEGER'/>\n" +
" <column name='ColFK2' type='INTEGER'/>\n" +
" <foreign-key name='TestFK' foreignTable='TableB'>\n" +
" <reference local='ColFK2' foreign='ColPK2'/>\n" +
" <reference local='ColFK1' foreign='ColPK1'/>\n" +
" </foreign-key>\n" +
" </table>\n" +
" <table name='TableB'>\n" +
" <column name='ColPK1' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='ColPK2' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(true).compare(model1, model2);
assertTrue(changes.isEmpty());
}
/**
* Tests the addition of an index.
*/
public void testAddIndex()
{
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='Col' 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='COL' type='INTEGER'/>\n" +
" <index name='TESTINDEX'>\n" +
" <index-column name='COL'/>\n" +
" </index>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
AddIndexChange change = (AddIndexChange)changes.get(0);
assertEquals("TESTINDEX",
change.getNewIndex().getName());
}
/**
* Tests the removal of an index.
*/
public void testRemoveIndex()
{
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='Col' type='INTEGER'/>\n" +
" <unique name='TestIndex'>\n" +
" <unique-column name='Col'/>\n" +
" </unique>\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='Col' type='INTEGER'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(true).compare(model1, model2);
assertEquals(1,
changes.size());
RemoveIndexChange change = (RemoveIndexChange)changes.get(0);
assertEquals("TestIndex",
change.getChangedIndex().getName());
}
/**
* Tests the addition and removal of an index because of the change of type of the index.
*/
public void testAddAndRemoveIndex()
{
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='Col' type='INTEGER'/>\n" +
" <unique name='TestIndex'>\n" +
" <unique-column name='Col'/>\n" +
" </unique>\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='Col' type='INTEGER'/>\n" +
" <index name='TestIndex'>\n" +
" <index-column name='Col'/>\n" +
" </index>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(true).compare(model1, model2);
assertEquals(2,
changes.size());
RemoveIndexChange change1 = (RemoveIndexChange)changes.get(0);
AddIndexChange change2 = (AddIndexChange)changes.get(1);
assertEquals("TestIndex",
change1.getChangedIndex().getName());
assertEquals("TestIndex",
change2.getNewIndex().getName());
}
/**
* Tests the addition and removal of an index because of the change of column order.
*/
public void testChangeIndexColumnOrder()
{
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='Col1' type='INTEGER'/>\n" +
" <column name='Col2' type='DOUBLE'/>\n" +
" <index name='TestIndex'>\n" +
" <index-column name='Col1'/>\n" +
" <index-column name='Col2'/>\n" +
" </index>\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='Col1' type='INTEGER'/>\n" +
" <column name='Col2' type='DOUBLE'/>\n" +
" <index name='TestIndex'>\n" +
" <index-column name='Col2'/>\n" +
" <index-column name='Col1'/>\n" +
" </index>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(2,
changes.size());
RemoveIndexChange change1 = (RemoveIndexChange)changes.get(0);
AddIndexChange change2 = (AddIndexChange)changes.get(1);
assertEquals("TestIndex",
change1.getChangedIndex().getName());
assertEquals("TestIndex",
change2.getNewIndex().getName());
}
/**
* Tests the addition and removal of an index because of the addition of an index column.
*/
public void testAddIndexColumn()
{
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='Col1' type='INTEGER'/>\n" +
" <column name='Col2' type='DOUBLE'/>\n" +
" <index name='TestIndex'>\n" +
" <index-column name='Col1'/>\n" +
" </index>\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='Col1' type='INTEGER'/>\n" +
" <column name='Col2' type='DOUBLE'/>\n" +
" <index name='TestIndex'>\n" +
" <index-column name='Col1'/>\n" +
" <index-column name='Col2'/>\n" +
" </index>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(2,
changes.size());
RemoveIndexChange change1 = (RemoveIndexChange)changes.get(0);
AddIndexChange change2 = (AddIndexChange)changes.get(1);
assertEquals("TestIndex",
change1.getChangedIndex().getName());
assertEquals("TestIndex",
change2.getNewIndex().getName());
}
/**
* Tests the addition and removal of an index because of the removal of an index column.
*/
public void testRemoveIndexColumn()
{
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='Col1' type='INTEGER'/>\n" +
" <column name='Col2' type='DOUBLE'/>\n" +
" <index name='TestIndex'>\n" +
" <index-column name='Col1'/>\n" +
" <index-column name='Col2'/>\n" +
" </index>\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='Col1' type='INTEGER'/>\n" +
" <column name='Col2' type='DOUBLE'/>\n" +
" <index name='TestIndex'>\n" +
" <index-column name='Col1'/>\n" +
" </index>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(2,
changes.size());
RemoveIndexChange change1 = (RemoveIndexChange)changes.get(0);
AddIndexChange change2 = (AddIndexChange)changes.get(1);
assertEquals("TestIndex",
change1.getChangedIndex().getName());
assertEquals("TestIndex",
change2.getNewIndex().getName());
}
/**
* Tests the addition of a primary key.
*/
public void testAddPrimaryKey()
{
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' 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 = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
AddPrimaryKeyChange change = (AddPrimaryKeyChange)changes.get(0);
assertEquals(1,
change.getPrimaryKeyColumns().length);
assertEquals("ColPK",
change.getPrimaryKeyColumns()[0].getName());
}
/**
* Tests the removal of a primary key.
*/
public void testRemovePrimaryKey()
{
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' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
RemovePrimaryKeyChange change = (RemovePrimaryKeyChange)changes.get(0);
assertEquals(1,
change.getPrimaryKeyColumns().length);
assertEquals("ColPK",
change.getPrimaryKeyColumns()[0].getName());
}
/**
* Tests the addition of a column to the primary key.
*/
public void testAddPrimaryKeyColumn()
{
final String MODEL1 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TableA'>\n" +
" <column name='ColPK1' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='ColPK2' type='INTEGER' 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='ColPK1' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='ColPK2' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(true).compare(model1, model2);
assertEquals(1,
changes.size());
PrimaryKeyChange change = (PrimaryKeyChange)changes.get(0);
assertEquals(1,
change.getOldPrimaryKeyColumns().length);
assertEquals(2,
change.getNewPrimaryKeyColumns().length);
assertEquals("ColPK1",
change.getOldPrimaryKeyColumns()[0].getName());
assertEquals("ColPK1",
change.getNewPrimaryKeyColumns()[0].getName());
assertEquals("ColPK2",
change.getNewPrimaryKeyColumns()[1].getName());
}
/**
* Tests the removal of a column from the primary key.
*/
public void testRemovePrimaryKeyColumn()
{
final String MODEL1 =
"<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
"<database name='test'>\n" +
" <table name='TableA'>\n" +
" <column name='ColPK1' type='INTEGER' primaryKey='true' required='true'/>\n" +
" <column name='ColPK2' 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='ColPK1' type='INTEGER' required='true'/>\n" +
" <column name='ColPK2' type='INTEGER' primaryKey='true' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
PrimaryKeyChange change = (PrimaryKeyChange)changes.get(0);
assertEquals(2,
change.getOldPrimaryKeyColumns().length);
assertEquals(1,
change.getNewPrimaryKeyColumns().length);
assertEquals("ColPK1",
change.getOldPrimaryKeyColumns()[0].getName());
assertEquals("ColPK2",
change.getOldPrimaryKeyColumns()[1].getName());
assertEquals("ColPK2",
change.getNewPrimaryKeyColumns()[0].getName());
}
/**
* Tests the addition a column.
*/
public void testAddColumn()
{
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" +
" <column name='Col1' type='DOUBLE'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
AddColumnChange change = (AddColumnChange)changes.get(0);
assertEquals("Col1",
change.getNewColumn().getName());
}
/**
* Tests the removal of a column.
*/
public void testChangeColumnOrder()
{
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='Col1' type='DOUBLE'/>\n" +
" <column name='Col2' type='INTEGER' required='true'/>\n" +
" <column name='Col3' type='VARCHAR' size='32'/>\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='Col3' type='VARCHAR' size='32'/>\n" +
" <column name='Col2' type='INTEGER' required='true'/>\n" +
" <column name='Col1' type='DOUBLE'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
ColumnOrderChange change = (ColumnOrderChange)changes.get(0);
Table sourceTable = change.getChangedTable();
assertEquals(3,
change.getNewPosition(sourceTable.getColumn(1)));
assertEquals(-1,
change.getNewPosition(sourceTable.getColumn(2)));
assertEquals(1,
change.getNewPosition(sourceTable.getColumn(3)));
}
/**
* Tests the removal of a column.
*/
public void testRemoveColumn()
{
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='Col1' type='DOUBLE'/>\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 = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
RemoveColumnChange change = (RemoveColumnChange)changes.get(0);
assertEquals("Col1",
change.getChangedColumn().getName());
}
/**
* Tests changing the data type of a column.
*/
public void testChangeColumnDataType()
{
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='Col' type='DOUBLE'/>\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='Col' type='INTEGER'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(true).compare(model1, model2);
assertEquals(1,
changes.size());
ColumnDataTypeChange change = (ColumnDataTypeChange)changes.get(0);
assertEquals("Col",
change.getChangedColumn().getName());
assertEquals(Types.INTEGER,
change.getNewTypeCode());
}
/**
* Tests changing the size of a column.
*/
public void testChangeColumnSize()
{
// note that we also have a size for the INTEGER column, but we don't
// expect a change for it because the size is not relevant for this type
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' size='8' primaryKey='true' required='true'/>\n" +
" <column name='Col' type='VARCHAR' size='16'/>\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='COL' type='VARCHAR' size='32'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
ColumnSizeChange change = (ColumnSizeChange)changes.get(0);
assertEquals("Col",
change.getChangedColumn().getName());
assertEquals(32,
change.getNewSize());
assertEquals(0,
change.getNewScale());
}
/**
* Tests changing the scale of a column.
*/
public void testChangeColumnScale()
{
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='Col' type='NUMERIC' size='32,0'/>\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='Col' type='NUMERIC' size='32,5'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(true).compare(model1, model2);
assertEquals(1,
changes.size());
ColumnSizeChange change = (ColumnSizeChange)changes.get(0);
assertEquals("Col",
change.getChangedColumn().getName());
assertEquals(32,
change.getNewSize());
assertEquals(5,
change.getNewScale());
}
/**
* Tests removing the size of a column. This test shows how the comparator
* reacts in the common case of comparing a model read from a live database
* (which usually returns sizes for every column) and a model from XML.
* The model comparator will filter out these changes depending on the
* platform info with which the comparator was created.
*/
public void testRemoveColumnSize()
{
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='Col' type='INTEGER' size='8'/>\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='COL' type='INTEGER'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertTrue(changes.isEmpty());
}
/**
* Tests changing the default value of a column.
*/
public void testChangeDefaultValue()
{
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='Col' type='INTEGER' default='1'/>\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='Col' type='INTEGER' default='2'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(true).compare(model1, model2);
assertEquals(1,
changes.size());
ColumnDefaultValueChange change = (ColumnDefaultValueChange)changes.get(0);
assertEquals("Col",
change.getChangedColumn().getName());
assertEquals("2",
change.getNewDefaultValue());
}
/**
* Tests that shows that the same default value expressed differently does not
* result in a change.
*/
public void testSameDefaultValueExpressedDifferently()
{
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='Col' type='DOUBLE' default='10'/>\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='COL' type='DOUBLE' default='1e+1'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertTrue(changes.isEmpty());
}
/**
* Tests adding a default value to a column.
*/
public void testAddDefaultValue()
{
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='Col' 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='Col' type='INTEGER' default='0'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(true).compare(model1, model2);
assertEquals(1,
changes.size());
ColumnDefaultValueChange change = (ColumnDefaultValueChange)changes.get(0);
assertEquals("Col",
change.getChangedColumn().getName());
assertEquals("0",
change.getNewDefaultValue());
}
/**
* Tests chainging the required-constraint of a column.
*/
public void testChangeColumnRequired()
{
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='Col' type='INTEGER' required='false'/>\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='COL' type='INTEGER' required='true'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
ColumnRequiredChange change = (ColumnRequiredChange)changes.get(0);
assertEquals("Col",
change.getChangedColumn().getName());
}
/**
* Tests chainging the auto-increment-constraint of a column.
*/
public void testChangeColumnAutoIncrement()
{
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='Col' type='INTEGER' autoIncrement='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" +
" <column name='COL' type='INTEGER' autoIncrement='false'/>\n" +
" </table>\n" +
"</database>";
Database model1 = parseDatabaseFromString(MODEL1);
Database model2 = parseDatabaseFromString(MODEL2);
List changes = createModelComparator(false).compare(model1, model2);
assertEquals(1,
changes.size());
ColumnAutoIncrementChange change = (ColumnAutoIncrementChange)changes.get(0);
assertEquals("Col",
change.getChangedColumn().getName());
}
}