package com.txtr.hibernatedelta;
import java.io.InputStream;
import java.util.LinkedHashSet;
import java.util.Set;
import javax.xml.bind.JAXBContext;
import org.junit.Assert;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
import com.txtr.hibernatedelta.model.ExplicitHibernateIndex;
import com.txtr.hibernatedelta.model.HibernateColumn;
import com.txtr.hibernatedelta.model.HibernateIndexName;
import com.txtr.hibernatedelta.model.HibernateIndexNames;
import com.txtr.hibernatedelta.model.HibernateTable;
public class IndexIdFactoryTest {
@Test
public void testCopyNames() throws Exception {
String table = "table";
HibernateTable newTable = new HibernateTable(table, null, false);
newTable.addColumn(createFkColumn("a"));
newTable.addColumn(createFkColumn("b"));
newTable.addColumn(createFkColumn("c"));
ExplicitHibernateIndex index = new ExplicitHibernateIndex(null, true, false, ImmutableList.of("b"));
newTable.addExplicitIndex(index);
ExplicitHibernateIndex index2 = new ExplicitHibernateIndex(null, true, false, ImmutableList.of("c"));
newTable.addExplicitIndex(index2);
HibernateIndexNames names = new HibernateIndexNames();
names.getIndexNames().add(new HibernateIndexName("aOld", table, ImmutableList.of("a")));
names.getIndexNames().add(new HibernateIndexName("aIndex", table, ImmutableList.of("b")));
IndexIdFactory.setIndexNames(newTable, names);
Assert.assertEquals("aOld", newTable.getColumn("a").getForeignKeyIndexName());
Assert.assertEquals("table1", newTable.getColumn("c").getForeignKeyIndexName());
Assert.assertEquals("aIndex", index.getName());
Assert.assertEquals("table1", index2.getName());
}
private HibernateColumn createFkColumn(String name) {
return new HibernateColumn(name, "target", false, null, "type", null, null);
}
@Test(expected = IllegalStateException.class)
public void testTestDuplicateIndexNames() throws Exception {
assertNoDuplicateNames(getClass().getClassLoader().getResourceAsStream("test_indexNames.xml"));
}
private void assertNoDuplicateNames(InputStream inputStream) throws Exception {
Set<String> names = new LinkedHashSet<String>();
HibernateIndexNames unmarshal = (HibernateIndexNames) JAXBContext.newInstance(HibernateIndexNames.class).createUnmarshaller().unmarshal(inputStream);
for (HibernateIndexName indexName : unmarshal.getIndexNames()) {
String name = indexName.getName();
if (!names.add(name)) {
throw new IllegalStateException("duplicate index name: " + name);
}
}
}
}