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.io.StringReader;
import java.io.StringWriter;
import java.sql.Types;

import junit.framework.TestCase;

import org.apache.commons.lang.StringUtils;
import org.apache.ddlutils.model.CascadeActionEnum;
import org.apache.ddlutils.model.Column;
import org.apache.ddlutils.model.Database;
import org.apache.ddlutils.model.ForeignKey;
import org.apache.ddlutils.model.Index;
import org.apache.ddlutils.model.IndexColumn;
import org.apache.ddlutils.model.ModelException;
import org.apache.ddlutils.model.Reference;
import org.apache.ddlutils.model.Table;
import org.apache.ddlutils.model.TypeMap;

/**
 * Tests the database XML reading/writing via the {@link org.apache.ddlutils.io.DatabaseIO} class.
 * 
 * @version $Revision: 289996 $
 */
public class TestDatabaseIO extends TestCase
{
    /**
     * Reads the database model from the given string.
     * 
     * @param modelAsXml The database model XML
     * @return The database model
     */
    private Database readModel(String modelAsXml)
    {
        DatabaseIO dbIO = new DatabaseIO();

        dbIO.setUseInternalDtd(true);
        dbIO.setValidateXml(false);
        return dbIO.read(new StringReader(modelAsXml));
    }

    /**
     * Writes the given database model to a string.
     * 
     * @param model The database model
     * @return The database model XML
     */
    private String writeModel(Database model)
    {
        StringWriter writer = new StringWriter();

        new DatabaseIO().write(model, writer);
        return StringUtils.replace(writer.toString(), "\r\n", "\n");
    }

    /**
     * Asserts the data in a table object.
     * 
     * @param name                    The expected name
     * @param description             The expected description
     * @param numColumns              The expected number of columns
     * @param numPrimaryKeyColumns    The expected number of primary key columns
     * @param numAutoIncrementColumns The expected number of auto increment columns
     * @param numForeignKeys          The expected number of foreign keys
     * @param numIndexes              The expected number of indexes
     * @param table                   The table
     */
    private void assertEquals(String name,
                              String description,
                              int    numColumns,
                              int    numPrimaryKeyColumns,
                              int    numAutoIncrementColumns,
                              int    numForeignKeys,
                              int    numIndexes,
                              Table  table)
    {
        assertEquals(name, table.getName());
        assertEquals(description, table.getDescription());
        assertEquals(numColumns, table.getColumnCount());
        assertEquals(numPrimaryKeyColumns, table.getPrimaryKeyColumns().length);
        assertEquals(numAutoIncrementColumns, table.getAutoIncrementColumns().length);
        assertEquals(numForeignKeys, table.getForeignKeyCount());
        assertEquals(numIndexes, table.getIndexCount());
    }

    /**
     * Asserts the data in a column object.
     * 
     * @param name            The expected name
     * @param typeCode        The exected JDBC type code
     * @param size            The expected size value
     * @param scale           The expected scale value
     * @param defaultValue    The expected default value
     * @param description     The expected description
     * @param javaName        The expected java name
     * @param isPrimaryKey    The expected primary key status
     * @param isRequired      The expected required satus
     * @param isAutoIncrement The expected auto increment status
     * @param column          The column
     */
    private void assertEquals(String  name,
                              int     typeCode,
                              int     size,
                              int     scale,
                              String  defaultValue,
                              String  description,
                              String  javaName,
                              boolean isPrimaryKey,
                              boolean isRequired,
                              boolean isAutoIncrement,
                              Column  column)
    {
        assertEquals(name, column.getName());
        assertEquals(TypeMap.getJdbcTypeName(typeCode), column.getType());
        assertEquals(typeCode, column.getTypeCode());
        assertEquals(size, column.getSizeAsInt());
        assertEquals(size, column.getPrecisionRadix());
        assertEquals(scale, column.getScale());
        if ((size <= 0) && (scale <= 0)) {
            assertNull(column.getSize());
        }
        else if (scale == 0) {
            assertEquals("" + size, column.getSize());
        }
        else {
            assertEquals("" + size + "," + scale, column.getSize());
        }
        assertEquals(defaultValue, column.getDefaultValue());
        assertEquals(description, column.getDescription());
        assertEquals(javaName, column.getJavaName());
        assertEquals(isPrimaryKey, column.isPrimaryKey());
        assertEquals(isRequired, column.isRequired());
        assertEquals(isAutoIncrement, column.isAutoIncrement());
    }

    /**
     * Asserts data in a foreign key object.
     * 
     * @param name            The expected name
     * @param onUpdate        The expected onUpdate action
     * @param onDelete        The expected onDelete action
     * @param referencedTable The expected referenced table
     * @param numReferences   The expected number of references
     * @param foreignKey      The foreign key
     */
    private void assertEquals(String            name,
                              CascadeActionEnum onUpdate,
                              CascadeActionEnum onDelete,
                              Table             referencedTable,
                              int               numReferences,
                              ForeignKey        foreignKey)
    {
        assertEquals(name, foreignKey.getName());
        assertEquals(onUpdate, foreignKey.getOnUpdate());
        assertEquals(onDelete, foreignKey.getOnDelete());
        assertEquals(referencedTable, foreignKey.getForeignTable());
        assertEquals(referencedTable.getName(), foreignKey.getForeignTableName());
        assertEquals(numReferences, foreignKey.getReferenceCount());
    }

    /**
     * Asserts data in a reference object.
     * 
     * @param localColumn   The expected local column
     * @param foreignColumn The expected foreign column
     * @param ref           The reference
     */
    private void assertEquals(Column localColumn, Column foreignColumn, Reference ref)
    {
        assertEquals(localColumn, ref.getLocalColumn());
        assertEquals(localColumn.getName(), ref.getLocalColumnName());
        assertEquals(foreignColumn, ref.getForeignColumn());
        assertEquals(foreignColumn.getName(), ref.getForeignColumnName());
    }

    /**
     * Asserts data in an index object.
     * 
     * @param name       The expected name
     * @param isUnique   The expected unique status
     * @param numColumns The expected number of columns
     * @param index      The index
     */
    private void assertEquals(String name, boolean isUnique, int numColumns, Index index)
    {
        assertEquals(name, index.getName());
        assertEquals(isUnique, index.isUnique());
        assertEquals(numColumns, index.getColumnCount());
    }

    /**
     * Asserts data in an index column object.
     * 
     * @param column      The expected column
     * @param size        The expected size value 
     * @param indexColumn The index column
     */
    private void assertEquals(Column column, String size, IndexColumn indexColumn)
    {
        assertEquals(column, indexColumn.getColumn());
        assertEquals(column.getName(), indexColumn.getName());
        assertEquals(size, indexColumn.getSize());
    }

    /**
     * Asserts that the given database model, written to XML, is equal to the given
     * expected XML.
     * 
     * @param expectedXml The expected XML
     * @param model       The database model
     */
    private void assertEquals(String expectedXml, Database model)
    {
        assertEquals(expectedXml, writeModel(model));
    }

    /**
     * Tests an XML document without a database element.
     */
    public void testNoDatabaseElement()
    {
        assertNull(readModel("<data-base></data-base>"));
    }

    /**
     * Tests that an exception is generated when the database element has no name attribute.
     */
    public void testDatabaseWithoutName()
    {
        try
        {
            readModel(
                "<database>\n" +
                "  <table name='TestTable'>\n" +
                "    <column name='id'\n" +
                "            type='INTEGER'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model without tables.
     */
    public void testNoTables() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "</database>");

        assertEquals("test",
                     model.getName());
        assertEquals(0,
                     model.getTableCount());

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\" />\n",
            model);
    }

    /**
     * Tests a database model with a table without columns.
     */
    public void testTableWithoutColumns() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        assertEquals("SomeTable", "Some table", 0, 0, 0, 0, 0,
                     model.getTable(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\" />\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests that an exception is generated when the table element has no name attribute.
     */
    public void testTableWithoutName()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table>\n" +
                "    <column name='id'\n" +
                "            type='INTEGER'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model with a table with a single column.
     */
    public void testSingleColumn() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='INTEGER'/>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("SomeTable", "Some table", 1, 0, 0, 0, 0,
                     table);
        assertEquals("ID", Types.INTEGER, 0, 0, null, null, null, false, false, false,
                     table.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"false\" required=\"false\" type=\"INTEGER\" autoIncrement=\"false\" />\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests that an exception is generated when the column element has no name attribute.
     */
    public void testColumnWithoutName()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TestTable'>\n" +
                "    <column type='INTEGER'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests that an exception is generated when the column element has no type attribute.
     */
    public void testColumnWithoutType()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TestTable'>\n" +
                "    <column name='id'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model columns of all possible datatypes.
     */
    public void testColumnTypes() throws Exception
    {
        StringBuffer modelXml = new StringBuffer();
        int[]        types    = TypeMap.getSuportedJdbcTypes();

        modelXml.append("<database name='test'>\n");
        modelXml.append("  <table name='SomeTable'\n");
        modelXml.append("         description='Some table'>\n");
        for (int idx = 0; idx < types.length; idx++)
        {
            modelXml.append("    <column name='ID");
            modelXml.append(idx);
            modelXml.append("' type='");
            modelXml.append(TypeMap.getJdbcTypeName(types[idx]));
            modelXml.append("'/>\n");
        }
        modelXml.append("  </table>\n");
        modelXml.append("</database>");

        Database model = readModel(modelXml.toString());

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("SomeTable", "Some table", types.length, 0, 0, 0, 0,
                     table);

        for (int idx = 0; idx < types.length; idx++)
        {
            assertEquals("ID" + idx, types[idx], 0, 0, null, null, null, false, false, false,
                         table.getColumn(idx));
        }

        modelXml.setLength(0);
        modelXml.append("<?xml version='1.0' encoding='UTF-8'?>\n");
        modelXml.append("<database name=\"test\">\n");
        modelXml.append("  <table name=\"SomeTable\" description=\"Some table\">\n");
        for (int idx = 0; idx < types.length; idx++)
        {
            modelXml.append("    <column name=\"ID");
            modelXml.append(idx);
            modelXml.append("\" primaryKey=\"false\" required=\"false\" type=\"");
            modelXml.append(TypeMap.getJdbcTypeName(types[idx]));
            modelXml.append("\" autoIncrement=\"false\" />\n");
        }
        modelXml.append("  </table>\n");
        modelXml.append("</database>\n");

        assertEquals(modelXml.toString(), model);
    }

    /**
     * Tests an illegal column type.
     */
    public void testColumnWithIllegalType()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TestTable'>\n" +
                "    <column name='id'\n" +
                "            type='illegal'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model with a table with a primary key column.
     */
    public void testPrimaryKeyColumn() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='INTEGER'\n" +
            "            primaryKey='true'/>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("SomeTable", "Some table", 1, 1, 0, 0, 0,
                     table);

        Column column = table.getColumn(0);

        assertEquals("ID", Types.INTEGER, 0, 0, null, null, null, true, false, false,
                     column);

        assertEquals(column, table.getPrimaryKeyColumns()[0]);
        
        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"true\" required=\"false\" type=\"INTEGER\" autoIncrement=\"false\" />\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with a table with a required column.
     */
    public void testRequiredColumn() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='INTEGER'\n" +
            "            required='true'/>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("SomeTable", "Some table", 1, 0, 0, 0, 0,
                     table);
        assertEquals("ID", Types.INTEGER, 0, 0, null, null, null, false, true, false,
                     table.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"false\" required=\"true\" type=\"INTEGER\" autoIncrement=\"false\" />\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with a table with an autoincrement column.
     */
    public void testAutoIncrementColumn() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='INTEGER'\n" +
            "            autoIncrement='true'/>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("SomeTable", "Some table", 1, 0, 1, 0, 0,
                     table);

        Column column = table.getColumn(0);

        assertEquals("ID", Types.INTEGER, 0, 0, null, null, null, false, false, true,
                     column);

        assertEquals(column, table.getAutoIncrementColumns()[0]);

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"false\" required=\"false\" type=\"INTEGER\" autoIncrement=\"true\" />\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with a table with a column with a size spec.
     */
    public void testColumnWithSize1() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='VARCHAR'\n" +
            "            size='20'/>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("SomeTable", "Some table", 1, 0, 0, 0, 0,
                     table);
        assertEquals("ID", Types.VARCHAR, 20, 0, null, null, null, false, false, false,
                     table.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"false\" required=\"false\" type=\"VARCHAR\" size=\"20\" autoIncrement=\"false\" />\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with a table with a column with a size spec.
     */
    public void testColumnWithSize2() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='DECIMAL'\n" +
            "            size='10,3'/>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("SomeTable", "Some table", 1, 0, 0, 0, 0,
                     table);
        assertEquals("ID", Types.DECIMAL, 10, 3, null, null, null, false, false, false,
                     table.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"false\" required=\"false\" type=\"DECIMAL\" size=\"10,3\" autoIncrement=\"false\" />\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with a table with a column with a description.
     */
    public void testColumnWithDescription() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='INTEGER'\n" +
            "            description='Foo'/>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("SomeTable", "Some table", 1, 0, 0, 0, 0,
                     table);
        assertEquals("ID", Types.INTEGER, 0, 0, null, "Foo", null, false, false, false,
                     table.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"false\" required=\"false\" type=\"INTEGER\" autoIncrement=\"false\" description=\"Foo\" />\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with a table with a column with a default.
     */
    public void testColumnWithDefault() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='VARCHAR'\n" +
            "            size='32'\n" +
            "            default='Test string'/>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("SomeTable", "Some table", 1, 0, 0, 0, 0,
                     table);
        assertEquals("ID", Types.VARCHAR, 32, 0, "Test string", null, null, false, false, false,
                     table.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"false\" required=\"false\" type=\"VARCHAR\" size=\"32\" default=\"Test string\" autoIncrement=\"false\" />\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with a table with a column with a java name.
     */
    public void testColumnWithJavaName() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='DOUBLE'\n" +
            "            javaName='testString'/>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("SomeTable", "Some table", 1, 0, 0, 0, 0,
                     table);
        assertEquals("ID", Types.DOUBLE, 0, 0, null, null, "testString", false, false, false,
                     table.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"false\" required=\"false\" type=\"DOUBLE\" autoIncrement=\"false\" javaName=\"testString\" />\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model containing a single foreignkey.
     */
    public void testSingleForeignkey() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='VARCHAR'\n" +
            "            size='16'\n" +
            "            primaryKey='true'\n" +
            "            required='true'\n" +
            "            description='The primary key'/>\n" +
            "  </table>\n" +
            "  <table name='AnotherTable'\n" +
            "         description='And another table'>\n" +
            "    <column name='Some_ID'\n" +
            "            type='VARCHAR'\n" +
            "            size='16'\n" +
            "            description='The foreign key'/>\n" +
            "    <foreign-key foreignTable='SomeTable'>\n" +
            "       <reference local='Some_ID' foreign='ID'/>\n" +
            "    </foreign-key>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(2, model.getTableCount());

        Table someTable = model.getTable(0);

        assertEquals("SomeTable", "Some table", 1, 1, 0, 0, 0,
                     someTable);

        Column pkColumn = someTable.getColumn(0);

        assertEquals("ID", Types.VARCHAR, 16, 0, null, "The primary key", null, true, true, false,
                     pkColumn);

        Table anotherTable = model.getTable(1);

        assertEquals("AnotherTable", "And another table", 1, 0, 0, 1, 0,
                     anotherTable);

        Column fkColumn = anotherTable.getColumn(0);

        assertEquals("Some_ID", Types.VARCHAR, 16, 0, null, "The foreign key", null, false, false, false,
                     fkColumn);

        ForeignKey fk = anotherTable.getForeignKey(0);

        assertEquals(null, CascadeActionEnum.NONE, CascadeActionEnum.NONE, someTable, 1, fk);
        assertEquals(fkColumn, pkColumn, fk.getFirstReference());

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"true\" required=\"true\" type=\"VARCHAR\" size=\"16\" autoIncrement=\"false\" description=\"The primary key\" />\n" +
            "  </table>\n" +
            "  <table name=\"AnotherTable\" description=\"And another table\">\n" +
            "    <column name=\"Some_ID\" primaryKey=\"false\" required=\"false\" type=\"VARCHAR\" size=\"16\" autoIncrement=\"false\" description=\"The foreign key\" />\n" +
            "    <foreign-key foreignTable=\"SomeTable\">\n" +
            "      <reference local=\"Some_ID\" foreign=\"ID\" />\n" +
            "    </foreign-key>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model containing a foreignkey with two references.
     */
    public void testForeignkeyWithTwoReferences() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='VARCHAR'\n" +
            "            size='16'\n" +
            "            primaryKey='true'\n" +
            "            required='true'\n" +
            "            description='The primary key'/>\n" +
            "    <column name='VALUE1'\n" +
            "            type='INTEGER'\n" +
            "            required='false'\n" +
            "            description='A value'/>\n" +
            "    <column name='VALUE2'\n" +
            "            type='DOUBLE'\n" +
            "            required='false'\n" +
            "            description='Another value'/>\n" +
            "  </table>\n" +
            "  <table name='AnotherTable'\n" +
            "         description='And another table'>\n" +
            "    <column name='Some_ID'\n" +
            "            type='VARCHAR'\n" +
            "            size='16'\n" +
            "            description='The foreign key'/>\n" +
            "    <column name='Some_Value'\n" +
            "            type='DOUBLE'/>\n" +
            "    <foreign-key foreignTable='SomeTable'>\n" +
            "       <reference local='Some_ID' foreign='ID'/>\n" +
            "       <reference local='Some_Value' foreign='VALUE2'/>\n" +
            "    </foreign-key>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(2, model.getTableCount());

        Table someTable = model.getTable(0);

        assertEquals("SomeTable", "Some table", 3, 1, 0, 0, 0,
                     someTable);
        assertEquals("ID", Types.VARCHAR, 16, 0, null, "The primary key", null, true, true, false,
                     someTable.getColumn(0));

        Table anotherTable = model.getTable(1);

        assertEquals("AnotherTable", "And another table", 2, 0, 0, 1, 0,
                     anotherTable);
        assertEquals("Some_ID", Types.VARCHAR, 16, 0, null, "The foreign key", null, false, false, false,
                     anotherTable.getColumn(0));

        ForeignKey fk = anotherTable.getForeignKey(0);

        assertEquals(null, CascadeActionEnum.NONE, CascadeActionEnum.NONE, someTable, 2, fk);
        assertEquals(anotherTable.getColumn(0), someTable.getColumn(0), fk.getReference(0));
        assertEquals(anotherTable.getColumn(1), someTable.getColumn(2), fk.getReference(1));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"true\" required=\"true\" type=\"VARCHAR\" size=\"16\" autoIncrement=\"false\" description=\"The primary key\" />\n" +
            "    <column name=\"VALUE1\" primaryKey=\"false\" required=\"false\" type=\"INTEGER\" autoIncrement=\"false\" description=\"A value\" />\n" +
            "    <column name=\"VALUE2\" primaryKey=\"false\" required=\"false\" type=\"DOUBLE\" autoIncrement=\"false\" description=\"Another value\" />\n" +
            "  </table>\n" +
            "  <table name=\"AnotherTable\" description=\"And another table\">\n" +
            "    <column name=\"Some_ID\" primaryKey=\"false\" required=\"false\" type=\"VARCHAR\" size=\"16\" autoIncrement=\"false\" description=\"The foreign key\" />\n" +
            "    <column name=\"Some_Value\" primaryKey=\"false\" required=\"false\" type=\"DOUBLE\" autoIncrement=\"false\" />\n" +
            "    <foreign-key foreignTable=\"SomeTable\">\n" +
            "      <reference local=\"Some_ID\" foreign=\"ID\" />\n" +
            "      <reference local=\"Some_Value\" foreign=\"VALUE2\" />\n" +
            "    </foreign-key>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a foreign key without references.
     */
    public void testForeignKeyWithoutReferences()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='SomeTable'\n" +
                "         description='Some table'>\n" +
                "    <column name='ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            primaryKey='true'\n" +
                "            required='true'\n" +
                "            description='The primary key'/>\n" +
                "  </table>\n" +
                "  <table name='AnotherTable'\n" +
                "         description='And another table'>\n" +
                "    <column name='Some_ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            description='The foreign key'/>\n" +
                "    <foreign-key foreignTable='SomeTable'>\n" +
                "    </foreign-key>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model containing a named foreignkey.
     */
    public void testNamedForeignkey() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='VARCHAR'\n" +
            "            size='16'\n" +
            "            primaryKey='true'\n" +
            "            required='true'\n" +
            "            description='The primary key'/>\n" +
            "  </table>\n" +
            "  <table name='AnotherTable'\n" +
            "         description='And another table'>\n" +
            "    <column name='Some_ID'\n" +
            "            type='VARCHAR'\n" +
            "            size='16'\n" +
            "            description='The foreign key'/>\n" +
            "    <foreign-key name='The foreignkey' foreignTable='SomeTable'>\n" +
            "       <reference local='Some_ID' foreign='ID'/>\n" +
            "    </foreign-key>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(2, model.getTableCount());

        Table someTable = model.getTable(0);

        assertEquals("SomeTable", "Some table", 1, 1, 0, 0, 0,
                     someTable);
        assertEquals("ID", Types.VARCHAR, 16, 0, null, "The primary key", null, true, true, false,
                     someTable.getColumn(0));

        Table anotherTable = model.getTable(1);

        assertEquals("AnotherTable", "And another table", 1, 0, 0, 1, 0,
                     anotherTable);
        assertEquals("Some_ID", Types.VARCHAR, 16, 0, null, "The foreign key", null, false, false, false,
                     anotherTable.getColumn(0));

        ForeignKey fk = anotherTable.getForeignKey(0);

        assertEquals("The foreignkey", CascadeActionEnum.NONE, CascadeActionEnum.NONE, someTable, 1, fk);
        assertEquals(anotherTable.getColumn(0), someTable.getColumn(0), fk.getReference(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"true\" required=\"true\" type=\"VARCHAR\" size=\"16\" autoIncrement=\"false\" description=\"The primary key\" />\n" +
            "  </table>\n" +
            "  <table name=\"AnotherTable\" description=\"And another table\">\n" +
            "    <column name=\"Some_ID\" primaryKey=\"false\" required=\"false\" type=\"VARCHAR\" size=\"16\" autoIncrement=\"false\" description=\"The foreign key\" />\n" +
            "    <foreign-key foreignTable=\"SomeTable\" name=\"The foreignkey\">\n" +
            "      <reference local=\"Some_ID\" foreign=\"ID\" />\n" +
            "    </foreign-key>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a foreign key referencing a non-existing table.
     */
    public void testForeignKeyReferencingUndefinedTable()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='SomeTable'\n" +
                "         description='Some table'>\n" +
                "    <column name='ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            primaryKey='true'\n" +
                "            required='true'\n" +
                "            description='The primary key'/>\n" +
                "  </table>\n" +
                "  <table name='AnotherTable'\n" +
                "         description='And another table'>\n" +
                "    <column name='Some_ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            description='The foreign key'/>\n" +
                "    <foreign-key foreignTable='TheTable'>\n" +
                "       <reference local='Some_ID' foreign='ID'/>\n" +
                "    </foreign-key>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a foreign key using a non-existing column in the local table.
     */
    public void testForeignKeyUsingUndefinedColumn()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='SomeTable'\n" +
                "         description='Some table'>\n" +
                "    <column name='ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            primaryKey='true'\n" +
                "            required='true'\n" +
                "            description='The primary key'/>\n" +
                "  </table>\n" +
                "  <table name='AnotherTable'\n" +
                "         description='And another table'>\n" +
                "    <column name='Some_ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            description='The foreign key'/>\n" +
                "    <foreign-key foreignTable='SomeTable'>\n" +
                "       <reference local='ID' foreign='ID'/>\n" +
                "    </foreign-key>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a foreign key referencing a non-existing column in the foreign table.
     */
    public void testForeignKeyReferencingUndefinedColumn()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='SomeTable'\n" +
                "         description='Some table'>\n" +
                "    <column name='ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            primaryKey='true'\n" +
                "            required='true'\n" +
                "            description='The primary key'/>\n" +
                "  </table>\n" +
                "  <table name='AnotherTable'\n" +
                "         description='And another table'>\n" +
                "    <column name='Some_ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            description='The foreign key'/>\n" +
                "    <foreign-key foreignTable='SomeTable'>\n" +
                "       <reference local='Some_ID' foreign='TheID'/>\n" +
                "    </foreign-key>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a foreign key without a local column.
     */
    public void testForeignKeyWithoutLocalColumn()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='SomeTable'\n" +
                "         description='Some table'>\n" +
                "    <column name='ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            primaryKey='true'\n" +
                "            required='true'\n" +
                "            description='The primary key'/>\n" +
                "  </table>\n" +
                "  <table name='AnotherTable'\n" +
                "         description='And another table'>\n" +
                "    <column name='Some_ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            description='The foreign key'/>\n" +
                "    <foreign-key foreignTable='SomeTable'>\n" +
                "       <reference foreign='ID'/>\n" +
                "    </foreign-key>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a foreign key without a remote column.
     */
    public void testForeignKeyWithoutRemoteColumn()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='SomeTable'\n" +
                "         description='Some table'>\n" +
                "    <column name='ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            primaryKey='true'\n" +
                "            required='true'\n" +
                "            description='The primary key'/>\n" +
                "  </table>\n" +
                "  <table name='AnotherTable'\n" +
                "         description='And another table'>\n" +
                "    <column name='Some_ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            description='The foreign key'/>\n" +
                "    <foreign-key foreignTable='SomeTable'>\n" +
                "       <reference local='Some_ID'/>\n" +
                "    </foreign-key>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model containing two foreignkeys.
     */
    public void testTwoForeignkeys() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'\n" +
            "         description='Some table'>\n" +
            "    <column name='ID'\n" +
            "            type='VARCHAR'\n" +
            "            size='16'\n" +
            "            primaryKey='true'\n" +
            "            required='true'\n" +
            "            description='The primary key'/>\n" +
            "    <column name='VALUE1'\n" +
            "            type='INTEGER'\n" +
            "            required='false'\n" +
            "            description='A value'/>\n" +
            "    <column name='VALUE2'\n" +
            "            type='DOUBLE'\n" +
            "            required='false'\n" +
            "            description='Another value'/>\n" +
            "  </table>\n" +
            "  <table name='AnotherTable'\n" +
            "         description='And another table'>\n" +
            "    <column name='Some_ID'\n" +
            "            type='VARCHAR'\n" +
            "            size='16'\n" +
            "            description='The foreign key'/>\n" +
            "    <column name='Some_Value'\n" +
            "            type='DOUBLE'/>\n" +
            "    <foreign-key foreignTable='SomeTable'>\n" +
            "       <reference local='Some_ID' foreign='ID'/>\n" +
            "    </foreign-key>\n" +
            "    <foreign-key foreignTable='SomeTable'>\n" +
            "       <reference local='Some_Value' foreign='VALUE2'/>\n" +
            "    </foreign-key>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(2, model.getTableCount());

        Table someTable = model.getTable(0);

        assertEquals("SomeTable", "Some table", 3, 1, 0, 0, 0,
                     someTable);
        assertEquals("ID", Types.VARCHAR, 16, 0, null, "The primary key", null, true, true, false,
                     someTable.getColumn(0));

        Table anotherTable = model.getTable(1);

        assertEquals("AnotherTable", "And another table", 2, 0, 0, 2, 0,
                     anotherTable);
        assertEquals("Some_ID", Types.VARCHAR, 16, 0, null, "The foreign key", null, false, false, false,
                     anotherTable.getColumn(0));

        ForeignKey fk = anotherTable.getForeignKey(0);

        assertEquals(null, CascadeActionEnum.NONE, CascadeActionEnum.NONE, someTable, 1, fk);
        assertEquals(anotherTable.getColumn(0), someTable.getColumn(0), fk.getReference(0));

        fk = anotherTable.getForeignKey(1);

        assertEquals(null, CascadeActionEnum.NONE, CascadeActionEnum.NONE, someTable, 1, fk);
        assertEquals(anotherTable.getColumn(1), someTable.getColumn(2), fk.getReference(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\" description=\"Some table\">\n" +
            "    <column name=\"ID\" primaryKey=\"true\" required=\"true\" type=\"VARCHAR\" size=\"16\" autoIncrement=\"false\" description=\"The primary key\" />\n" +
            "    <column name=\"VALUE1\" primaryKey=\"false\" required=\"false\" type=\"INTEGER\" autoIncrement=\"false\" description=\"A value\" />\n" +
            "    <column name=\"VALUE2\" primaryKey=\"false\" required=\"false\" type=\"DOUBLE\" autoIncrement=\"false\" description=\"Another value\" />\n" +
            "  </table>\n" +
            "  <table name=\"AnotherTable\" description=\"And another table\">\n" +
            "    <column name=\"Some_ID\" primaryKey=\"false\" required=\"false\" type=\"VARCHAR\" size=\"16\" autoIncrement=\"false\" description=\"The foreign key\" />\n" +
            "    <column name=\"Some_Value\" primaryKey=\"false\" required=\"false\" type=\"DOUBLE\" autoIncrement=\"false\" />\n" +
            "    <foreign-key foreignTable=\"SomeTable\">\n" +
            "      <reference local=\"Some_ID\" foreign=\"ID\" />\n" +
            "    </foreign-key>\n" +
            "    <foreign-key foreignTable=\"SomeTable\">\n" +
            "      <reference local=\"Some_Value\" foreign=\"VALUE2\" />\n" +
            "    </foreign-key>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model containing two foreignkeys with the same name.
     */
    public void testTwoForeignkeysWithSameName() throws Exception
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='SomeTable'\n" +
                "         description='Some table'>\n" +
                "    <column name='ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            primaryKey='true'\n" +
                "            required='true'\n" +
                "            description='The primary key'/>\n" +
                "    <column name='VALUE1'\n" +
                "            type='INTEGER'\n" +
                "            required='false'\n" +
                "            description='A value'/>\n" +
                "    <column name='VALUE2'\n" +
                "            type='DOUBLE'\n" +
                "            required='false'\n" +
                "            description='Another value'/>\n" +
                "  </table>\n" +
                "  <table name='AnotherTable'\n" +
                "         description='And another table'>\n" +
                "    <column name='Some_ID'\n" +
                "            type='VARCHAR'\n" +
                "            size='16'\n" +
                "            description='The foreign key'/>\n" +
                "    <column name='Some_Value'\n" +
                "            type='DOUBLE'/>\n" +
                "    <foreign-key name='The foreignkey' foreignTable='SomeTable'>\n" +
                "       <reference local='Some_ID' foreign='ID'/>\n" +
                "    </foreign-key>\n" +
                "    <foreign-key name='The foreignkey' foreignTable='SomeTable'>\n" +
                "       <reference local='Some_Value' foreign='VALUE2'/>\n" +
                "    </foreign-key>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model with an index.
     */
    public void testSingleIndex() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='TableWithIndex'>\n" +
            "    <column name='id'\n" +
            "            type='DOUBLE'\n" +
            "            primaryKey='true'\n" +
            "            required='true'/>\n" +
            "    <column name='value'\n" +
            "            type='SMALLINT'\n" +
            "            default='1'/>\n" +
            "    <index>\n" +
            "      <index-column name='value'/>\n" +
            "    </index>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("TableWithIndex", null, 2, 1, 0, 0, 1,
                     table);
        assertEquals("id", Types.DOUBLE, 0, 0, null, null, null, true, true, false,
                     table.getColumn(0));
        assertEquals("value", Types.SMALLINT, 0, 0, "1", null, null, false, false, false,
                     table.getColumn(1));

        Index index = table.getIndex(0);

        assertEquals(null, false, 1, index);
        assertEquals(table.getColumn(1), null, index.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"TableWithIndex\">\n" +
            "    <column name=\"id\" primaryKey=\"true\" required=\"true\" type=\"DOUBLE\" autoIncrement=\"false\" />\n" +
            "    <column name=\"value\" primaryKey=\"false\" required=\"false\" type=\"SMALLINT\" default=\"1\" autoIncrement=\"false\" />\n" +
            "    <index>\n" +
            "      <index-column name=\"value\" />\n" +
            "    </index>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with an index with two columns.
     */
    public void testIndexWithTwoColumns() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='TableWithIndex'>\n" +
            "    <column name='id'\n" +
            "            type='DOUBLE'\n" +
            "            primaryKey='true'\n" +
            "            required='true'/>\n" +
            "    <column name='when'\n" +
            "            type='TIMESTAMP'\n" +
            "            required='true'/>\n" +
            "    <column name='value'\n" +
            "            type='SMALLINT'\n" +
            "            default='1'/>\n" +
            "    <index>\n" +
            "      <index-column name='when'/>\n" +
            "      <index-column name='id'/>\n" +
            "    </index>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("TableWithIndex", null, 3, 1, 0, 0, 1,
                     table);
        assertEquals("id", Types.DOUBLE, 0, 0, null, null, null, true, true, false,
                     table.getColumn(0));
        assertEquals("when", Types.TIMESTAMP, 0, 0, null, null, null, false, true, false,
                     table.getColumn(1));
        assertEquals("value", Types.SMALLINT, 0, 0, "1", null, null, false, false, false,
                     table.getColumn(2));

        Index index = table.getIndex(0);

        assertEquals(null, false, 2, index);
        assertEquals(table.getColumn(1), null, index.getColumn(0));
        assertEquals(table.getColumn(0), null, index.getColumn(1));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"TableWithIndex\">\n" +
            "    <column name=\"id\" primaryKey=\"true\" required=\"true\" type=\"DOUBLE\" autoIncrement=\"false\" />\n" +
            "    <column name=\"when\" primaryKey=\"false\" required=\"true\" type=\"TIMESTAMP\" autoIncrement=\"false\" />\n" +
            "    <column name=\"value\" primaryKey=\"false\" required=\"false\" type=\"SMALLINT\" default=\"1\" autoIncrement=\"false\" />\n" +
            "    <index>\n" +
            "      <index-column name=\"when\" />\n" +
            "      <index-column name=\"id\" />\n" +
            "    </index>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with an index with a name.
     */
    public void testIndexWithName() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='TableWithIndex'>\n" +
            "    <column name='id'\n" +
            "            type='DOUBLE'\n" +
            "            primaryKey='true'\n" +
            "            required='true'/>\n" +
            "    <column name='value'\n" +
            "            type='SMALLINT'\n" +
            "            default='1'/>\n" +
            "    <index name='The Index'>\n" +
            "      <index-column name='value'/>\n" +
            "    </index>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("TableWithIndex", null, 2, 1, 0, 0, 1,
                     table);
        assertEquals("id", Types.DOUBLE, 0, 0, null, null, null, true, true, false,
                     table.getColumn(0));
        assertEquals("value", Types.SMALLINT, 0, 0, "1", null, null, false, false, false,
                     table.getColumn(1));

        Index index = table.getIndex(0);

        assertEquals("The Index", false, 1, index);
        assertEquals(table.getColumn(1), null, index.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"TableWithIndex\">\n" +
            "    <column name=\"id\" primaryKey=\"true\" required=\"true\" type=\"DOUBLE\" autoIncrement=\"false\" />\n" +
            "    <column name=\"value\" primaryKey=\"false\" required=\"false\" type=\"SMALLINT\" default=\"1\" autoIncrement=\"false\" />\n" +
            "    <index name=\"The Index\">\n" +
            "      <index-column name=\"value\" />\n" +
            "    </index>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with an index without index columns.
     */
    public void testIndexWithoutColumns() throws Exception
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TableWithIndex'>\n" +
                "    <column name='id'\n" +
                "            type='DOUBLE'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <column name='value'\n" +
                "            type='SMALLINT'\n" +
                "            default='1'/>\n" +
                "    <index>\n" +
                "    </index>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model with an index with an index column that references an undefined column.
     */
    public void testIndexWithUndefinedColumns() throws Exception
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TableWithIndex'>\n" +
                "    <column name='id'\n" +
                "            type='DOUBLE'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <column name='value'\n" +
                "            type='SMALLINT'\n" +
                "            default='1'/>\n" +
                "    <index>\n" +
                "      <index-column name='theValue'/>\n" +
                "    </index>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model with an index with an index column that has no name.
     */
    public void testIndexWithNoNameColumn() throws Exception
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TableWithIndex'>\n" +
                "    <column name='id'\n" +
                "            type='DOUBLE'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <column name='value'\n" +
                "            type='SMALLINT'\n" +
                "            default='1'/>\n" +
                "    <index>\n" +
                "      <index-column/>\n" +
                "    </index>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }


    /**
     * Tests a database model with an unique index.
     */
    public void testSingleUniqueIndex() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='TableWithIndex'>\n" +
            "    <column name='id'\n" +
            "            type='DOUBLE'\n" +
            "            primaryKey='true'\n" +
            "            required='true'/>\n" +
            "    <column name='value'\n" +
            "            type='SMALLINT'\n" +
            "            default='1'/>\n" +
            "    <unique>\n" +
            "      <unique-column name='value'/>\n" +
            "    </unique>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("TableWithIndex", null, 2, 1, 0, 0, 1,
                     table);
        assertEquals("id", Types.DOUBLE, 0, 0, null, null, null, true, true, false,
                     table.getColumn(0));
        assertEquals("value", Types.SMALLINT, 0, 0, "1", null, null, false, false, false,
                     table.getColumn(1));

        Index index = table.getIndex(0);

        assertEquals(null, true, 1, index);
        assertEquals(table.getColumn(1), null, index.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"TableWithIndex\">\n" +
            "    <column name=\"id\" primaryKey=\"true\" required=\"true\" type=\"DOUBLE\" autoIncrement=\"false\" />\n" +
            "    <column name=\"value\" primaryKey=\"false\" required=\"false\" type=\"SMALLINT\" default=\"1\" autoIncrement=\"false\" />\n" +
            "    <unique>\n" +
            "      <unique-column name=\"value\" />\n" +
            "    </unique>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with an unique index with two columns.
     */
    public void testUniqueIndexWithTwoColumns() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='TableWithIndex'>\n" +
            "    <column name='id'\n" +
            "            type='DOUBLE'\n" +
            "            primaryKey='true'\n" +
            "            required='true'/>\n" +
            "    <column name='when'\n" +
            "            type='TIMESTAMP'\n" +
            "            required='true'/>\n" +
            "    <column name='value'\n" +
            "            type='SMALLINT'\n" +
            "            default='1'/>\n" +
            "    <unique>\n" +
            "      <unique-column name='when'/>\n" +
            "      <unique-column name='id'/>\n" +
            "    </unique>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("TableWithIndex", null, 3, 1, 0, 0, 1,
                     table);
        assertEquals("id", Types.DOUBLE, 0, 0, null, null, null, true, true, false,
                     table.getColumn(0));
        assertEquals("when", Types.TIMESTAMP, 0, 0, null, null, null, false, true, false,
                     table.getColumn(1));
        assertEquals("value", Types.SMALLINT, 0, 0, "1", null, null, false, false, false,
                     table.getColumn(2));

        Index index = table.getIndex(0);

        assertEquals(null, true, 2, index);
        assertEquals(table.getColumn(1), null, index.getColumn(0));
        assertEquals(table.getColumn(0), null, index.getColumn(1));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"TableWithIndex\">\n" +
            "    <column name=\"id\" primaryKey=\"true\" required=\"true\" type=\"DOUBLE\" autoIncrement=\"false\" />\n" +
            "    <column name=\"when\" primaryKey=\"false\" required=\"true\" type=\"TIMESTAMP\" autoIncrement=\"false\" />\n" +
            "    <column name=\"value\" primaryKey=\"false\" required=\"false\" type=\"SMALLINT\" default=\"1\" autoIncrement=\"false\" />\n" +
            "    <unique>\n" +
            "      <unique-column name=\"when\" />\n" +
            "      <unique-column name=\"id\" />\n" +
            "    </unique>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with an unique index with a name.
     */
    public void testUniqueIndexWithName() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='TableWithIndex'>\n" +
            "    <column name='id'\n" +
            "            type='DOUBLE'\n" +
            "            primaryKey='true'\n" +
            "            required='true'/>\n" +
            "    <column name='value'\n" +
            "            type='SMALLINT'\n" +
            "            default='1'/>\n" +
            "    <unique name='The Index'>\n" +
            "      <unique-column name='value'/>\n" +
            "    </unique>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("TableWithIndex", null, 2, 1, 0, 0, 1,
                     table);
        assertEquals("id", Types.DOUBLE, 0, 0, null, null, null, true, true, false,
                     table.getColumn(0));
        assertEquals("value", Types.SMALLINT, 0, 0, "1", null, null, false, false, false,
                     table.getColumn(1));

        Index index = table.getIndex(0);

        assertEquals("The Index", true, 1, index);
        assertEquals(table.getColumn(1), null, index.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"TableWithIndex\">\n" +
            "    <column name=\"id\" primaryKey=\"true\" required=\"true\" type=\"DOUBLE\" autoIncrement=\"false\" />\n" +
            "    <column name=\"value\" primaryKey=\"false\" required=\"false\" type=\"SMALLINT\" default=\"1\" autoIncrement=\"false\" />\n" +
            "    <unique name=\"The Index\">\n" +
            "      <unique-column name=\"value\" />\n" +
            "    </unique>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a database model with an unique index without index columns.
     */
    public void testUniqueIndexWithoutColumns() throws Exception
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TableWithIndex'>\n" +
                "    <column name='id'\n" +
                "            type='DOUBLE'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <column name='value'\n" +
                "            type='SMALLINT'\n" +
                "            default='1'/>\n" +
                "    <unique>\n" +
                "    </unique>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model with an unique index with an index column that references an undefined column.
     */
    public void testUniqueIndexWithUndefinedColumns() throws Exception
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TableWithIndex'>\n" +
                "    <column name='id'\n" +
                "            type='DOUBLE'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <column name='value'\n" +
                "            type='SMALLINT'\n" +
                "            default='1'/>\n" +
                "    <unique>\n" +
                "      <unique-column name='theValue'/>\n" +
                "    </unique>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model with an unique index with an index column that has no name.
     */
    public void testUniqueIndexWithNoNameColumn() throws Exception
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TableWithIndex'>\n" +
                "    <column name='id'\n" +
                "            type='DOUBLE'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <column name='value'\n" +
                "            type='SMALLINT'\n" +
                "            default='1'/>\n" +
                "    <unique>\n" +
                "      <unique-column/>\n" +
                "    </unique>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests a database model with indices, both uniques and non-uniques.
     */
    public void testMixedIndexes() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='TableWithIndexes'>\n" +
            "    <column name='id'\n" +
            "            type='SMALLINT'\n" +
            "            primaryKey='false'\n" +
            "            required='true'\n" +
            "            autoIncrement='true'/>\n" +
            "    <column name='when'\n" +
            "            type='DATE'/>\n" +
            "    <unique name='important column'>\n" +
            "      <unique-column name='id'/>\n" +
            "    </unique>\n" +
            "    <index>\n" +
            "      <index-column name='when'/>\n" +
            "    </index>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("TableWithIndexes", null, 2, 0, 1, 0, 2,
                     table);
        assertEquals("id", Types.SMALLINT, 0, 0, null, null, null, false, true, true,
                     table.getColumn(0));
        assertEquals("when", Types.DATE, 0, 0, null, null, null, false, false, false,
                     table.getColumn(1));
        assertEquals(table.getColumn(0), table.getAutoIncrementColumns()[0]);

        Index index = table.getIndex(0);

        assertEquals("important column", true, 1, index);
        assertEquals(table.getColumn(0), null, index.getColumn(0));

        index = table.getIndex(1);

        assertEquals(null, false, 1, index);
        assertEquals(table.getColumn(1), null, index.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"TableWithIndexes\">\n" +
            "    <column name=\"id\" primaryKey=\"false\" required=\"true\" type=\"SMALLINT\" autoIncrement=\"true\" />\n" +
            "    <column name=\"when\" primaryKey=\"false\" required=\"false\" type=\"DATE\" autoIncrement=\"false\" />\n" +
            "    <unique name=\"important column\">\n" +
            "      <unique-column name=\"id\" />\n" +
            "    </unique>\n" +
            "    <index>\n" +
            "      <index-column name=\"when\" />\n" +
            "    </index>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests a complex database model with multiple tables, foreign keys, indices and uniques.
     */
    public void testComplex() throws Exception
    {
        // A = id:INTEGER, parentId:INTEGER, name:VARCHAR(32); fk 'parent' -> A (parentId -> id), unique(name)
        // B = id:TIMESTAMP, aid:INTEGER, cid:CHAR(32) fk -> A (aid -> id), fk -> C (cid -> id), index(aid,cid)
        // C = id:CHAR(32), text:LONGVARCHAR; index 'byText' (text)
        
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='A'\n" +
            "         description='Table A'>\n" +
            "    <column name='id'\n" +
            "            type='INTEGER'\n" +
            "            autoIncrement='true'\n" +
            "            primaryKey='true'\n" +
            "            required='true'\n" +
            "            description='The primary key of table A'/>\n" +
            "    <column name='parentId'\n" +
            "            type='INTEGER'\n" +
            "            description='The field for the foreign key parent'/>\n" +
            "    <column name='name'\n" +
            "            type='VARCHAR'\n" +
            "            size='32'\n" +
            "            required='true'\n" +
            "            description='The name'/>\n" +
            "    <foreign-key name='parent' foreignTable='A'>\n" +
            "       <reference local='parentId' foreign='id'/>\n" +
            "    </foreign-key>\n" +
            "    <unique>\n" +
            "      <unique-column name='name'/>\n" +
            "    </unique>\n" +
            "  </table>\n" +
            "  <table name='B'\n" +
            "         description='Table B'>\n" +
            "    <column name='id'\n" +
            "            type='TIMESTAMP'\n" +
            "            primaryKey='true'\n" +
            "            required='true'\n" +
            "            description='The primary key of table B'/>\n" +
            "    <column name='aid'\n" +
            "            type='INTEGER'\n" +
            "            description='The field for the foreign key towards A'/>\n" +
            "    <column name='cid'\n" +
            "            type='CHAR'\n" +
            "            size='32'\n" +
            "            description='The field for the foreign key towards C'/>\n" +
            "    <foreign-key foreignTable='A'>\n" +
            "       <reference local='aid' foreign='id'/>\n" +
            "    </foreign-key>\n" +
            "    <foreign-key foreignTable='C'>\n" +
            "       <reference local='cid' foreign='id'/>\n" +
            "    </foreign-key>\n" +
            "    <index>\n" +
            "      <index-column name='aid'/>\n" +
            "      <index-column name='cid'/>\n" +
            "    </index>\n" +
            "  </table>\n" +
            "  <table name='C'\n" +
            "         description='Table C'>\n" +
            "    <column name='id'\n" +
            "            type='CHAR'\n" +
            "            size='32'\n" +
            "            primaryKey='true'\n" +
            "            required='true'\n" +
            "            description='The primary key of table C'/>\n" +
            "    <column name='text'\n" +
            "            type='LONGVARCHAR'\n" +
            "            description='The text'/>\n" +
            "    <index name='byText'>\n" +
            "      <index-column name='text'/>\n" +
            "    </index>\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(3, model.getTableCount());

        // table A

        Table table = model.getTable(0);

        assertEquals("A", "Table A", 3, 1, 1, 1, 1,
                     table);
        assertEquals("id", Types.INTEGER, 0, 0, null, "The primary key of table A", null, true, true, true,
                     table.getColumn(0));
        assertEquals("parentId", Types.INTEGER, 0, 0, null, "The field for the foreign key parent", null, false, false, false,
                     table.getColumn(1));
        assertEquals("name", Types.VARCHAR, 32, 0, null, "The name", null, false, true, false,
                     table.getColumn(2));
        assertEquals(table.getColumn(0), table.getAutoIncrementColumns()[0]);

        ForeignKey fk = table.getForeignKey(0);

        assertEquals("parent", CascadeActionEnum.NONE, CascadeActionEnum.NONE, table, 1, fk);
        assertEquals(table.getColumn(1), table.getColumn(0), fk.getFirstReference());

        Index index = table.getIndex(0);

        assertEquals(null, true, 1, index);
        assertEquals(table.getColumn(2), null, index.getColumn(0));

        // table B
        
        table = model.getTable(1);

        assertEquals("B", "Table B", 3, 1, 0, 2, 1,
                     table);
        assertEquals("id", Types.TIMESTAMP, 0, 0, null, "The primary key of table B", null, true, true, false,
                     table.getColumn(0));
        assertEquals("aid", Types.INTEGER, 0, 0, null, "The field for the foreign key towards A", null, false, false, false,
                     table.getColumn(1));
        assertEquals("cid", Types.CHAR, 32, 0, null, "The field for the foreign key towards C", null, false, false, false,
                     table.getColumn(2));

        fk = table.getForeignKey(0);

        assertEquals(null, CascadeActionEnum.NONE, CascadeActionEnum.NONE, model.getTable(0), 1, fk);
        assertEquals(table.getColumn(1), model.getTable(0).getColumn(0), fk.getFirstReference());

        fk = table.getForeignKey(1);

        assertEquals(null, CascadeActionEnum.NONE, CascadeActionEnum.NONE, model.getTable(2), 1, fk);
        assertEquals(table.getColumn(2), model.getTable(2).getColumn(0), fk.getFirstReference());

        index = table.getIndex(0);

        assertEquals(null, false, 2, index);
        assertEquals(table.getColumn(1), null, index.getColumn(0));
        assertEquals(table.getColumn(2), null, index.getColumn(1));

        // table C

        table = model.getTable(2);

        assertEquals("C", "Table C", 2, 1, 0, 0, 1,
                     table);
        assertEquals("id", Types.CHAR, 32, 0, null, "The primary key of table C", null, true, true, false,
                     table.getColumn(0));
        assertEquals("text", Types.LONGVARCHAR, 0, 0, null, "The text", null, false, false, false,
                     table.getColumn(1));

        index = table.getIndex(0);

        assertEquals("byText", false, 1, index);
        assertEquals(table.getColumn(1), null, index.getColumn(0));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"A\" description=\"Table A\">\n" +
            "    <column name=\"id\" primaryKey=\"true\" required=\"true\" type=\"INTEGER\" autoIncrement=\"true\" description=\"The primary key of table A\" />\n" +
            "    <column name=\"parentId\" primaryKey=\"false\" required=\"false\" type=\"INTEGER\" autoIncrement=\"false\" description=\"The field for the foreign key parent\" />\n" +
            "    <column name=\"name\" primaryKey=\"false\" required=\"true\" type=\"VARCHAR\" size=\"32\" autoIncrement=\"false\" description=\"The name\" />\n" +
            "    <foreign-key foreignTable=\"A\" name=\"parent\">\n" +
            "      <reference local=\"parentId\" foreign=\"id\" />\n" +
            "    </foreign-key>\n" +
            "    <unique>\n" +
            "      <unique-column name=\"name\" />\n" +
            "    </unique>\n" +
            "  </table>\n" +
            "  <table name=\"B\" description=\"Table B\">\n" +
            "    <column name=\"id\" primaryKey=\"true\" required=\"true\" type=\"TIMESTAMP\" autoIncrement=\"false\" description=\"The primary key of table B\" />\n" +
            "    <column name=\"aid\" primaryKey=\"false\" required=\"false\" type=\"INTEGER\" autoIncrement=\"false\" description=\"The field for the foreign key towards A\" />\n" +
            "    <column name=\"cid\" primaryKey=\"false\" required=\"false\" type=\"CHAR\" size=\"32\" autoIncrement=\"false\" description=\"The field for the foreign key towards C\" />\n" +
            "    <foreign-key foreignTable=\"A\">\n" +
            "      <reference local=\"aid\" foreign=\"id\" />\n" +
            "    </foreign-key>\n" +
            "    <foreign-key foreignTable=\"C\">\n" +
            "      <reference local=\"cid\" foreign=\"id\" />\n" +
            "    </foreign-key>\n" +
            "    <index>\n" +
            "      <index-column name=\"aid\" />\n" +
            "      <index-column name=\"cid\" />\n" +
            "    </index>\n" +
            "  </table>\n" +
            "  <table name=\"C\" description=\"Table C\">\n" +
            "    <column name=\"id\" primaryKey=\"true\" required=\"true\" type=\"CHAR\" size=\"32\" autoIncrement=\"false\" description=\"The primary key of table C\" />\n" +
            "    <column name=\"text\" primaryKey=\"false\" required=\"false\" type=\"LONGVARCHAR\" autoIncrement=\"false\" description=\"The text\" />\n" +
            "    <index name=\"byText\">\n" +
            "      <index-column name=\"text\" />\n" +
            "    </index>\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }

    /**
     * Tests that an exception is generated when an index references an undefined column.
     */
    public void testUndefinedIndexColumn()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TableWidthIndex'>\n" +
                "    <column name='id'\n" +
                "            type='INTEGER'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <index name='test index'>\n" +
                "      <index-column name='id'/>\n" +
                "      <index-column name='value'/>\n" +
                "    </index>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests that an exception is generated when two table elements have the same value in their name attributes.
     */
    public void testTwoTablesWithTheSameName()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TestTable'>\n" +
                "    <column name='id1'\n" +
                "            type='INTEGER'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "  </table>\n" +
                "  <table name='TestTable'>\n" +
                "    <column name='id2'\n" +
                "            type='INTEGER'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests that an exception is generated when two column elements within the same table
     * element have the same value in their name attributes.
     */
    public void testTwoColumnsWithTheSameName()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TestTable'>\n" +
                "    <column name='id'\n" +
                "            type='INTEGER'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <column name='id'\n" +
                "            type='VARCHAR'/>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests that an exception is generated when the a unique index references an undefined column.
     */
    public void testUndefinedUniqueColumn()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TableWidthUnique'>\n" +
                "    <column name='id'\n" +
                "            type='INTEGER'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <unique>\n" +
                "      <unique-column name='value'/>\n" +
                "    </unique>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests that an exception is generated when two indices have the same value in their name attributes.
     */
    public void testTwoIndicesWithTheSameName()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TableWidthIndex'>\n" +
                "    <column name='id'\n" +
                "            type='INTEGER'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <column name='value1'\n" +
                "            type='INTEGER'\n" +
                "            required='true'/>\n" +
                "    <column name='value2'\n" +
                "            type='INTEGER'\n" +
                "            required='true'/>\n" +
                "    <index name='the index'>\n" +
                "      <index-column name='value1'/>\n" +
                "    </index>\n" +
                "    <index name='the index'>\n" +
                "      <index-column name='value2'/>\n" +
                "    </index>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests that an exception is generated when two unique indices have the
     * same value in their name attributes.
     */
    public void testTwoUniqueIndicesWithTheSameName()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TableWidthUnique'>\n" +
                "    <column name='id'\n" +
                "            type='INTEGER'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <column name='value1'\n" +
                "            type='INTEGER'\n" +
                "            required='true'/>\n" +
                "    <column name='value2'\n" +
                "            type='INTEGER'\n" +
                "            required='true'/>\n" +
                "    <unique name='the unique'>\n" +
                "      <unique-column name='value1'/>\n" +
                "    </unique>\n" +
                "    <unique name='the unique'>\n" +
                "      <unique-column name='value2'/>\n" +
                "    </unique>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Tests that an exception is generated when a unique and a normal index
     * have the same value in their name attributes.
     */
    public void testUniqueAndNormalIndexWithTheSameName()
    {
        try
        {
            readModel(
                "<database name='test'>\n" +
                "  <table name='TableWidthUnique'>\n" +
                "    <column name='id'\n" +
                "            type='INTEGER'\n" +
                "            primaryKey='true'\n" +
                "            required='true'/>\n" +
                "    <column name='value1'\n" +
                "            type='INTEGER'\n" +
                "            required='true'/>\n" +
                "    <column name='value2'\n" +
                "            type='INTEGER'\n" +
                "            required='true'/>\n" +
                "    <index name='test'>\n" +
                "      <index-column name='value1'/>\n" +
                "    </index>\n" +
                "    <unique name='test'>\n" +
                "      <unique-column name='value2'/>\n" +
                "    </unique>\n" +
                "  </table>\n" +
                "</database>");

            fail();
        }
        catch (ModelException ex)
        {}
    }

    /**
     * Regression test ensuring that wrong XML is not read (regarding betwixt issue #37369).
     */
    public void testFaultReadOfTable() 
    {
        Database database = readModel(
                "<database name='db' >\n" +
                "  <index name='NotATable'/>\n" +
                "</database>");

        assertEquals(0, database.getTableCount());
    }

    /**
     * Tests the Torque/Turbine extensions BOOLEANINT & BOOLEANCHAR.
     */
    public void testTurbineExtension() throws Exception
    {
        Database model = readModel(
            "<database name='test'>\n" +
            "  <table name='SomeTable'>\n" +
            "    <column name='intField'\n" +
            "            type='BOOLEANINT'/>\n" +
            "    <column name='charField'\n" +
            "            type='BOOLEANCHAR' />\n" +
            "  </table>\n" +
            "</database>");

        assertEquals("test", model.getName());
        assertEquals(1, model.getTableCount());
        
        Table table = model.getTable(0);

        assertEquals("SomeTable", null, 2, 0, 0, 0, 0,
                     table);
        assertEquals("intField", Types.TINYINT, 0, 0, null, null, null, false, false, false,
                     table.getColumn(0));
        assertEquals("charField", Types.CHAR, 0, 0, null, null, null, false, false, false,
                     table.getColumn(1));

        assertEquals(
            "<?xml version='1.0' encoding='UTF-8'?>\n" +
            "<database name=\"test\">\n" +
            "  <table name=\"SomeTable\">\n" +
            "    <column name=\"intField\" primaryKey=\"false\" required=\"false\" type=\"TINYINT\" autoIncrement=\"false\" />\n" +
            "    <column name=\"charField\" primaryKey=\"false\" required=\"false\" type=\"CHAR\" autoIncrement=\"false\" />\n" +
            "  </table>\n" +
            "</database>\n",
            model);
    }
}
