package sk.nociar.jpacloner; import java.util.HashSet; import java.util.Set; import javax.persistence.Transient; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import sk.nociar.jpacloner.entities.A; import sk.nociar.jpacloner.entities.B; import sk.nociar.jpacloner.entities.Bar; import sk.nociar.jpacloner.entities.Baz; import sk.nociar.jpacloner.entities.C; import sk.nociar.jpacloner.entities.DummyEntity; import sk.nociar.jpacloner.entities.Edge; import sk.nociar.jpacloner.entities.Foo; import sk.nociar.jpacloner.entities.Node; import sk.nociar.jpacloner.entities.Point; public class JpaClonerProxyTest { private static int idGenerator = 0; private static class EdgeProxy extends Edge { EdgeProxy() { setId(idGenerator++); } } private static class NodeProxy extends Node { NodeProxy() { setId(idGenerator++); } } private static class FooProxy extends Foo { FooProxy() { setId(idGenerator++); } } private static class BarProxy extends Bar { BarProxy() { setId(idGenerator++); } } private static class BazProxy extends Baz { BazProxy() { setId(idGenerator++); } } private JpaClonerTestSupport support; @Before public void setUp() { support = new JpaClonerTestSupport() { @Override protected Node createNode() { return new NodeProxy(); } @Override protected Edge createEdge() { return new EdgeProxy(); } @Override protected Point createPoint() { return new Point(1, 2); } @Override protected Foo createFoo() { return new FooProxy(); } @Override protected Bar createBar() { return new BarProxy(); } @Override protected Baz createBaz() { return new BazProxy(); } }; support.initialize(); } @Test public void testClone1() { support.testClone1(); } @Test public void testClone2() { support.testClone2(); } @Test public void testClone3() { support.testClone3(); } @Test public void testClone4() { support.testClone4(); } @Test public void testClone5() { support.testClone5(); } @Test public void testExplore() { support.testExplore(); } @Test public void testNullClone() { Assert.assertNull(JpaCloner.clone((Object)null, "foo.bar")); } @Test public void testNoGetter() { DummyEntity dummy = new DummyEntity(); dummy.setId(123); dummy.i = 666; dummy.s = "hello world"; DummyEntity clone = JpaCloner.clone(dummy); Assert.assertNotSame(dummy, clone); Assert.assertEquals(dummy, clone); Assert.assertEquals(dummy.i, clone.i); Assert.assertEquals(dummy.s, clone.s); clone = JpaCloner.clone(dummy, new PropertyFilter() { @Override public boolean test(Object entity, String property) { return !"i".equals(property); } }); Assert.assertEquals(0, clone.i); Assert.assertEquals("hello world", clone.s); } @Test public void testNoException() { JpaCloner.clone(new NodeProxy(), "bar", "xxx", "(yyy)"); } @Test public void testCloningOrder() { A a = new A(); B b1 = new B(); B b2 = new B(); B b3 = new B(); C c = new C(); // IDs a.setId(1); b1.setId(1); b2.setId(2); b3.setId(3); c.setId(1); // @ManyToOne b1.setA(a); b2.setA(a); b3.setA(a); b1.setC(c); b2.setC(c); b3.setC(c); // @OneToMany Set<B> set = new HashSet<B>(); set.add(b1); set.add(b2); set.add(b3); a.setSet(set); // clone (ignore transient fields) A a_clone = JpaCloner.clone(a, PropertyFilters.getAnnotationFilter(Transient.class), "set.c"); // verify set of B object Assert.assertEquals(a_clone.getSet().size(), 3); for (B b : a_clone.getSet()) { Assert.assertTrue(b.counter_a < b.counter_hashcode); Assert.assertTrue(b.counter_c < b.counter_hashcode); } } }