Added: db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestDropColumn.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestDropColumn.java?rev=602807&view=auto ============================================================================== --- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestDropColumn.java (added) +++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestDropColumn.java Mon Dec 10 00:20:47 2007 @@ -0,0 +1,1025 @@ +package org.apache.ddlutils.io; + +/* + * 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.math.BigDecimal; +import java.sql.Date; +import java.util.List; + +import junit.framework.Test; + +/** + * Tests database alterations that drop columns. + * + * @version $Revision: $ + */ +public class TestDropColumn extends RoundtripTestBase +{ + /** + * Parameterized test case pattern. + * + * @return The tests + */ + public static Test suite() throws Exception + { + return getTests(TestDropColumn.class); + } + + /** + * Tests the removal of a column. + */ + public void testDropColumn() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='TIMESTAMP'/>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), new Date(new java.util.Date().getTime()) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(1), beans.get(0), "pk"); + } + + /** + * Tests the removal of a auto increment column. + */ + public void testDropAutoIncrementColumn() + { + if (!getPlatformInfo().isNonPKIdentityColumnsSupported()) + { + return; + } + + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER' autoIncrement='true'/>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(1), beans.get(0), "pk"); + } + + /** + * Tests the removal of a required column. + */ + public void testDropRequiredColumn() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='NUMERIC' size='12,0' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), new BigDecimal(2) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(1), beans.get(0), "pk"); + } + + /** + * Tests the removal of a column that has a default value. + */ + public void testDropColumnWithDefault() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='DOUBLE' default='3.1'/>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(1), beans.get(0), "pk"); + } + + /** + * Tests the removal of a required column that has a default value. + */ + public void testDropRequiredColumnWithDefault() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='CHAR' size='8' required='true' default='text'/>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(1), beans.get(0), "pk"); + } + + /** + * Tests the removal of multiple columns. + */ + public void testDropMultipleColumns() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue1' type='CHAR' size='8' default='text'/>\n"+ + " <column name='avalue2' type='INTEGER'/>\n"+ + " <column name='avalue3' type='DOUBLE' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue2' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), null, new Integer(2), new Double(2) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(1), beans.get(0), "pk"); + assertEquals(new Integer(2), beans.get(0), "avalue2"); + } + + /** + * Tests the removal of multiple columns, including one with auto incremen. + */ + public void testDropMultipleColumnsInclAutoIncrement() + { + if (!getPlatformInfo().isNonPKIdentityColumnsSupported()) + { + return; + } + + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue1' type='CHAR' size='8' default='text'/>\n"+ + " <column name='avalue2' type='DOUBLE' required='true'/>\n"+ + " <column name='avalue3' type='INTEGER' autoIncrement='true'/>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue2' type='DOUBLE' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), null, new Double(2), null }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(1), beans.get(0), "pk"); + assertEquals(new Double(2), beans.get(0), "avalue2"); + } + + /** + * Tests the removal of a primary key column. + */ + public void testDropPKColumn() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk1' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2), new Integer(3) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(2), beans.get(0), "pk2"); + assertEquals(new Integer(3), beans.get(0), "avalue"); + } + + /** + * Tests the removal of the single primary key column. + */ + public void testDropSinglePKColumn() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(2), beans.get(0), "avalue"); + } + + /** + * Tests the removal of multiple primary key columns. + */ + public void testDropMultiplePKColumns() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk1' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='pk3' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2), new Integer(3), new Integer(4) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(2), beans.get(0), "pk2"); + assertEquals(new Integer(4), beans.get(0), "avalue"); + } + + /** + * Tests the removal of all primary key columns. + */ + public void testDropAllPKColumns() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk1' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='pk3' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2), new Integer(3), new Integer(4) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(4), beans.get(0), "avalue"); + } + + /** + * Tests the removal of a column from a non-unique index. + */ + public void testDropColumnFromIndex() + { + if (!getPlatformInfo().isIndicesSupported()) + { + return; + } + + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue1' type='INTEGER'/>\n"+ + " <column name='avalue2' type='VARCHAR' size='32'/>\n"+ + " <index name='test'>\n"+ + " <index-column name='avalue1'/>\n"+ + " <index-column name='avalue2'/>\n"+ + " </index>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue2' type='VARCHAR' size='32'/>\n"+ + " <index name='test'>\n"+ + " <index-column name='avalue2'/>\n"+ + " </index>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2), "text" }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(1), beans.get(0), "pk"); + assertEquals((Object)"text", beans.get(0), "avalue2"); + } + + /** + * Tests the removal of the single column from an unique index. + */ + public void testDropSingleColumnFromIndex() + { + if (!getPlatformInfo().isIndicesSupported()) + { + return; + } + + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " <unique name='test'>\n"+ + " <unique-column name='avalue'/>\n"+ + " </unique>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(1), beans.get(0), "pk"); + } + + /** + * Tests the removal of a column from a non-unique index. + */ + public void testDropMultipleColumnsFromIndex() + { + if (!getPlatformInfo().isIndicesSupported()) + { + return; + } + + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue1' type='INTEGER'/>\n"+ + " <column name='avalue2' type='VARCHAR' size='32'/>\n"+ + " <column name='avalue3' type='TIMESTAMP'/>\n"+ + " <index name='test'>\n"+ + " <index-column name='avalue1'/>\n"+ + " <index-column name='avalue2'/>\n"+ + " <index-column name='avalue3'/>\n"+ + " </index>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue2' type='VARCHAR' size='32'/>\n"+ + " <index name='test'>\n"+ + " <index-column name='avalue2'/>\n"+ + " </index>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2), "text" }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(1), beans.get(0), "pk"); + assertEquals((Object)"text", beans.get(0), "avalue2"); + } + + /** + * Tests the removal of all column from an unique index. + */ + public void testDropAllColumnsFromIndex() + { + if (!getPlatformInfo().isIndicesSupported()) + { + return; + } + + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue1' type='INTEGER' required='true'/>\n"+ + " <column name='avalue2' type='VARCHAR' size='32' required='true'/>\n"+ + " <column name='avalue3' type='DOUBLE' required='true'/>\n"+ + " <unique name='test'>\n"+ + " <unique-column name='avalue1'/>\n"+ + " <unique-column name='avalue2'/>\n"+ + " <unique-column name='avalue3'/>\n"+ + " </unique>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip", new Object[] { new Integer(1), new Integer(2), "text", new Double(2.0) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans = getRows("roundtrip"); + + assertEquals(new Integer(1), beans.get(0), "pk"); + } + + /** + * Tests the removal of the single local column from a foreign key. + */ + public void testDropSingleLocalColumnFromFK() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='VARCHAR' size='32'/>\n"+ + " <foreign-key foreignTable='roundtrip1'>\n"+ + " <reference local='avalue' foreign='pk'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip1", new Object[] { "text" }); + insertRow("roundtrip2", new Object[] { new Integer(1), "text" }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans1 = getRows("roundtrip1"); + List beans2 = getRows("roundtrip2"); + + assertEquals((Object)"text", beans1.get(0), "pk"); + assertEquals(new Integer(1), beans2.get(0), "pk"); + } + + /** + * Tests the removal of the single foreign column from a foreign key. + */ + public void testDropSingleForeignColumnFromFK() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='VARCHAR' size='32'/>\n"+ + " <foreign-key foreignTable='roundtrip1'>\n"+ + " <reference local='avalue' foreign='pk'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='VARCHAR' size='32'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip1", new Object[] { "text", new Integer(2) }); + insertRow("roundtrip2", new Object[] { new Integer(1), "text" }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans1 = getRows("roundtrip1"); + List beans2 = getRows("roundtrip2"); + + assertEquals(new Integer(2), beans1.get(0), "avalue"); + assertEquals(new Integer(1), beans2.get(0), "pk"); + assertEquals((Object)"text", beans2.get(0), "avalue"); + } + + /** + * Tests the removal of all local columns from a foreign key. + */ + public void testDropAllLocalColumnsFromFK() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk1' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue1' type='VARCHAR' size='32'/>\n"+ + " <column name='avalue2' type='INTEGER'/>\n"+ + " <foreign-key foreignTable='roundtrip1'>\n"+ + " <reference local='avalue1' foreign='pk1'/>\n"+ + " <reference local='avalue2' foreign='pk2'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk1' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip1", new Object[] { "text", new Integer(2) }); + insertRow("roundtrip2", new Object[] { new Integer(1), "text", new Integer(2) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans1 = getRows("roundtrip1"); + List beans2 = getRows("roundtrip2"); + + assertEquals((Object)"text", beans1.get(0), "pk1"); + assertEquals(new Integer(2), beans1.get(0), "pk2"); + assertEquals(new Integer(1), beans2.get(0), "pk"); + } + + /** + * Tests the removal of all foreign columns from a foreign key. + */ + public void testDropAllForeignColumnsFromFK() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk1' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue1' type='VARCHAR' size='32'/>\n"+ + " <column name='avalue2' type='INTEGER'/>\n"+ + " <foreign-key foreignTable='roundtrip1'>\n"+ + " <reference local='avalue1' foreign='pk1'/>\n"+ + " <reference local='avalue2' foreign='pk2'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue1' type='VARCHAR' size='32'/>\n"+ + " <column name='avalue2' type='INTEGER'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip1", new Object[] { "text", new Integer(2), new Integer(3) }); + insertRow("roundtrip2", new Object[] { new Integer(1), "text", new Integer(2) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans1 = getRows("roundtrip1"); + List beans2 = getRows("roundtrip2"); + + assertEquals(new Integer(3), beans1.get(0), "avalue"); + assertEquals(new Integer(1), beans2.get(0), "pk"); + assertEquals((Object)"text", beans2.get(0), "avalue1"); + assertEquals(new Integer(2), beans2.get(0), "avalue2"); + } + + /** + * Tests the removal of a local and foreign column from a foreign key. + */ + public void testDropLocalAndForeignColumnFromFK() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk1' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue1' type='VARCHAR' size='32'/>\n"+ + " <column name='avalue2' type='INTEGER'/>\n"+ + " <foreign-key foreignTable='roundtrip1'>\n"+ + " <reference local='avalue1' foreign='pk1'/>\n"+ + " <reference local='avalue2' foreign='pk2'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue2' type='INTEGER'/>\n"+ + " <foreign-key foreignTable='roundtrip1'>\n"+ + " <reference local='avalue2' foreign='pk2'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip1", new Object[] { "text", new Integer(2), new Integer(3) }); + insertRow("roundtrip2", new Object[] { new Integer(1), "text", new Integer(2) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans1 = getRows("roundtrip1"); + List beans2 = getRows("roundtrip2"); + + assertEquals(new Integer(2), beans1.get(0), "pk2"); + assertEquals(new Integer(3), beans1.get(0), "avalue"); + assertEquals(new Integer(1), beans2.get(0), "pk"); + assertEquals(new Integer(2), beans2.get(0), "avalue2"); + } + + /** + * Tests the removal of multiple local and foreign columns from a foreign key. + */ + public void testDropMultipleLocalAndForeignColumnsFromFK() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk1' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='pk3' type='DOUBLE' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue1' type='VARCHAR' size='32'/>\n"+ + " <column name='avalue2' type='INTEGER'/>\n"+ + " <column name='avalue3' type='DOUBLE'/>\n"+ + " <foreign-key foreignTable='roundtrip1'>\n"+ + " <reference local='avalue1' foreign='pk1'/>\n"+ + " <reference local='avalue2' foreign='pk2'/>\n"+ + " <reference local='avalue3' foreign='pk3'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue2' type='INTEGER'/>\n"+ + " <foreign-key foreignTable='roundtrip1'>\n"+ + " <reference local='avalue2' foreign='pk2'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip1", new Object[] { "text", new Integer(2), new Double(4), new Integer(3) }); + insertRow("roundtrip2", new Object[] { new Integer(1), "text", new Integer(2), new Double(4) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans1 = getRows("roundtrip1"); + List beans2 = getRows("roundtrip2"); + + assertEquals(new Integer(2), beans1.get(0), "pk2"); + assertEquals(new Integer(3), beans1.get(0), "avalue"); + assertEquals(new Integer(1), beans2.get(0), "pk"); + assertEquals(new Integer(2), beans2.get(0), "avalue2"); + } + + /** + * Tests the removal of all local and foreign columns from a foreign key. + */ + public void testDropAllLocalAndForeignColumnsFromFK() + { + final String model1Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='pk1' type='VARCHAR' size='32' primaryKey='true' required='true'/>\n"+ + " <column name='pk2' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='pk3' type='DOUBLE' primaryKey='true' required='true'/>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " <column name='avalue1' type='VARCHAR' size='32'/>\n"+ + " <column name='avalue2' type='INTEGER'/>\n"+ + " <column name='avalue3' type='DOUBLE'/>\n"+ + " <foreign-key foreignTable='roundtrip1'>\n"+ + " <reference local='avalue1' foreign='pk1'/>\n"+ + " <reference local='avalue2' foreign='pk2'/>\n"+ + " <reference local='avalue3' foreign='pk3'/>\n"+ + " </foreign-key>\n"+ + " </table>\n"+ + "</database>"; + final String model2Xml = + "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+ + "<database name='roundtriptest'>\n"+ + " <table name='roundtrip1'>\n"+ + " <column name='avalue' type='INTEGER'/>\n"+ + " </table>\n"+ + " <table name='roundtrip2'>\n"+ + " <column name='pk' type='INTEGER' primaryKey='true' required='true'/>\n"+ + " </table>\n"+ + "</database>"; + + createDatabase(model1Xml); + + insertRow("roundtrip1", new Object[] { "text", new Integer(2), new Double(4), new Integer(3) }); + insertRow("roundtrip2", new Object[] { new Integer(1), "text", new Integer(2), new Double(4) }); + + alterDatabase(model2Xml); + + assertEquals(getAdjustedModel(), + readModelFromDatabase("roundtriptest")); + + List beans1 = getRows("roundtrip1"); + List beans2 = getRows("roundtrip2"); + + assertEquals(new Integer(3), beans1.get(0), "avalue"); + assertEquals(new Integer(1), beans2.get(0), "pk"); + } +}