package org.jboss.tools.hibernate.runtime.v_4_0.internal; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.hibernate.mapping.Column; import org.hibernate.mapping.ForeignKey; import org.hibernate.mapping.Table; import org.jboss.tools.hibernate.runtime.common.AbstractForeignKeyFacade; import org.jboss.tools.hibernate.runtime.common.IFacade; import org.jboss.tools.hibernate.runtime.common.IFacadeFactory; import org.jboss.tools.hibernate.runtime.spi.IColumn; import org.jboss.tools.hibernate.runtime.spi.IForeignKey; import org.jboss.tools.hibernate.runtime.spi.ITable; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import javassist.util.proxy.MethodHandler; import javassist.util.proxy.ProxyFactory; import javassist.util.proxy.ProxyObject; public class ForeignKeyFacadeTest { private static final IFacadeFactory FACADE_FACTORY = new FacadeFactoryImpl(); private IForeignKey foreignKeyFacade = null; private ForeignKey foreignKey = null; private String methodName = null; private Object[] arguments = null; @Before public void setUp() throws Exception { ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setSuperclass(ForeignKey.class); Class<?> proxyClass = proxyFactory.createClass(); foreignKey = (ForeignKey)proxyClass.newInstance(); ((ProxyObject)foreignKey).setHandler(new MethodHandler() { @Override public Object invoke( Object self, Method m, Method proceed, Object[] args) throws Throwable { if (methodName == null) { methodName = m.getName(); } if (arguments == null) { arguments = args; } return proceed.invoke(self, args); } }); foreignKeyFacade = new AbstractForeignKeyFacade(FACADE_FACTORY, foreignKey) {}; reset(); } @Test public void testGetReferencedTable() { ITable first = foreignKeyFacade.getReferencedTable(); Assert.assertEquals("getReferencedTable", methodName); Assert.assertArrayEquals(new Object[] {}, arguments); Assert.assertNull(first); Table table = new Table(); foreignKey.setReferencedTable(table); reset(); ITable second = foreignKeyFacade.getReferencedTable(); Assert.assertEquals("getReferencedTable", methodName); Assert.assertArrayEquals(new Object[] {}, arguments); Assert.assertNotNull(second); Assert.assertSame(table, ((IFacade)second).getTarget()); reset(); ITable third = foreignKeyFacade.getReferencedTable(); Assert.assertNull(methodName); Assert.assertNull(arguments); Assert.assertSame(second, third); } @Test public void testColumnIterator() { Column column = new Column(); foreignKey.addColumn(column); reset(); Iterator<IColumn> iterator = foreignKeyFacade.columnIterator(); Assert.assertEquals("columnIterator", methodName); Assert.assertArrayEquals(new Object[] {}, arguments); IColumn columnFacade = iterator.next(); Assert.assertSame(column, ((IFacade)columnFacade).getTarget()); Assert.assertFalse(iterator.hasNext()); } @Test public void testIsReferenceToPrimaryKey() { Assert.assertTrue(foreignKeyFacade.isReferenceToPrimaryKey()); Assert.assertEquals("isReferenceToPrimaryKey", methodName); Assert.assertArrayEquals(new Object[] {}, arguments); Column column = new Column(); ArrayList<Column> list = new ArrayList<Column>(); list.add(column); foreignKey.addReferencedColumns(list.iterator()); reset(); Assert.assertFalse(foreignKeyFacade.isReferenceToPrimaryKey()); Assert.assertEquals("isReferenceToPrimaryKey", methodName); Assert.assertArrayEquals(new Object[] {}, arguments); } @Test public void testGetReferencedColumns() { List<IColumn> list = foreignKeyFacade.getReferencedColumns(); Assert.assertTrue(list.isEmpty()); Assert.assertEquals("getReferencedColumns", methodName); Assert.assertArrayEquals(new Object[] {}, arguments); // recreate facade to reinitialize the instance variables foreignKeyFacade = new AbstractForeignKeyFacade(FACADE_FACTORY, foreignKey) {}; Column column = new Column(); ArrayList<Column> columns = new ArrayList<Column>(); columns.add(column); foreignKey.addReferencedColumns(columns.iterator()); reset(); list = foreignKeyFacade.getReferencedColumns(); Assert.assertFalse(list.isEmpty()); Assert.assertEquals("getReferencedColumns", methodName); Assert.assertArrayEquals(new Object[] {}, arguments); } @Test public void testContainsColumn() { Column column = new Column(); IColumn columnFacade = FACADE_FACTORY.createColumn(column); Assert.assertFalse(foreignKeyFacade.containsColumn(columnFacade)); Assert.assertEquals("containsColumn", methodName); Assert.assertArrayEquals(new Object[] { column }, arguments); foreignKey.addColumn(column); reset(); Assert.assertTrue(foreignKeyFacade.containsColumn(columnFacade)); Assert.assertEquals("containsColumn", methodName); Assert.assertArrayEquals(new Object[] { column }, arguments); } private void reset() { methodName = null; arguments = null; } }