package test.enhancement; import com.avaje.ebean.bean.EntityBean; import com.avaje.ebean.bean.EntityBeanIntercept; import org.junit.Assert; import org.junit.Test; import test.model.BaseEntity; import test.model.Customer; import java.lang.reflect.Field; import java.util.Date; public class CustomerEntityTests extends BaseTest { private static final int PROPERTY_COUNT = 6; @Test public void testBasic() { Field field; try { field = BaseEntity.class.getField("_ebean_props"); String[] names = (String[]) field.get(null); Assert.assertNotNull(names); Assert.assertEquals(3, names.length); Assert.assertEquals("id", names[0]); Assert.assertEquals("version", names[1]); Assert.assertEquals("one", names[2]); } catch (Exception e) { Assert.fail(); } Customer customer = new Customer(); Assert.assertTrue(customer instanceof EntityBean); EntityBean custEb = (EntityBean)customer; String[] custFieldNames = custEb._ebean_getPropertyNames(); Assert.assertEquals(PROPERTY_COUNT, custFieldNames.length); Assert.assertEquals("id", custFieldNames[0]); Assert.assertEquals("version", custFieldNames[1]); Assert.assertEquals("one", custFieldNames[2]); Assert.assertEquals("name", custFieldNames[3]); Assert.assertEquals("whenStart", custFieldNames[4]); Assert.assertEquals("contacts", custFieldNames[5]); Assert.assertEquals("id", custEb._ebean_getPropertyName(0)); Assert.assertEquals("version", custEb._ebean_getPropertyName(1)); Assert.assertEquals("one", custEb._ebean_getPropertyName(2)); Assert.assertEquals("name", custEb._ebean_getPropertyName(3)); Assert.assertEquals("whenStart", custEb._ebean_getPropertyName(4)); Assert.assertEquals("contacts", custEb._ebean_getPropertyName(5)); EntityBeanIntercept customerIntercept = custEb._ebean_getIntercept(); customer.setId(23l); // this is null as the bean has not been marked as loaded yet Assert.assertNull(customerIntercept.getChanged()); boolean[] loaded = customerIntercept.getLoaded(); Assert.assertNotNull(loaded); Assert.assertEquals(PROPERTY_COUNT, loaded.length); Assert.assertEquals(true, loaded[0]); Assert.assertEquals(false, loaded[1]); assertLoaded(customerIntercept, 0); assertNotLoaded(customerIntercept, 1,2,3,4); customer.setVersion(1l); assertLoaded(customerIntercept, 0, 1); assertNotLoaded(customerIntercept, 2,3,4); customer.setName("hello"); assertLoaded(customerIntercept, 0, 1, 3); assertNotLoaded(customerIntercept, 2, 4); Assert.assertNull(customerIntercept.getChanged()); Assert.assertTrue(customer.hashCode() > 0); Assert.assertTrue(customerIntercept.isNew()); Assert.assertFalse(customerIntercept.isDirty()); customerIntercept.setLoaded(); // Will not change (set dirty flag) String otherName = "h"+"ello"; customer.setName(otherName); Assert.assertNull(customerIntercept.getChanged()); // This will set it to be modified customer.setName("nameModified"); Assert.assertTrue(customerIntercept.isDirty()); Assert.assertTrue(customerIntercept.isNewOrDirty()); Assert.assertNotNull(customerIntercept.getChanged()); assertChanged(customerIntercept, 3); assertNotChanged(customerIntercept, 0,1,2,4); } @Test public void testViaFieldSet() { Customer c2 = new Customer(); EntityBean c2Entity = (EntityBean)c2; EntityBeanIntercept c2Intercept = c2Entity._ebean_getIntercept(); Date now = new Date(); c2Entity._ebean_setField(0, 12L); c2Entity._ebean_setField(1, 34L); c2.setName("c2name"); c2.setWhenStart(now); Assert.assertEquals(Long.valueOf(12), c2.getId()); Assert.assertEquals(Long.valueOf(12), c2Entity._ebean_getField(0)); Assert.assertEquals(Long.valueOf(34), c2.getVersion()); Assert.assertEquals(Long.valueOf(34), c2Entity._ebean_getField(1)); Assert.assertEquals("c2name", c2.getName()); Assert.assertEquals("c2name", c2Entity._ebean_getField(3)); Assert.assertEquals(now, c2.getWhenStart()); Assert.assertEquals(now, c2Entity._ebean_getField(4)); // AFTER LOADED ... then changes are tracked c2Intercept.setLoaded(); Assert.assertNull(c2Intercept.getChanged()); c2.setName("c2NameChanged"); Assert.assertNotNull(c2Intercept.getChanged()); Assert.assertEquals(PROPERTY_COUNT, c2Intercept.getChanged().length); assertChanged(c2Intercept, 3); assertNotChanged(c2Intercept, 0,1,2,4); // Call setters but no actual change in value c2.setWhenStart(now); c2.setName("c2"+"Name"+"Changed"); assertChanged(c2Intercept, 3); assertNotChanged(c2Intercept, 0,1,2,4); } private void assertLoaded(EntityBeanIntercept intercept, int... idx) { assertThatLoaded(intercept, true, idx); } private void assertNotLoaded(EntityBeanIntercept intercept, int... idx) { assertThatLoaded(intercept, false, idx); } private void assertChanged(EntityBeanIntercept intercept, int... idx) { assertThatChanged(intercept, true, idx); } private void assertNotChanged(EntityBeanIntercept intercept, int... idx) { assertThatChanged(intercept, false, idx); } private void assertThatLoaded(EntityBeanIntercept intercept, boolean propertyLoaded, int... idx) { boolean[] loaded = intercept.getLoaded(); Assert.assertNotNull(loaded); for (int pos : idx) { Assert.assertEquals(propertyLoaded, loaded[pos]); } } private void assertThatChanged(EntityBeanIntercept intercept, boolean propertyLoaded, int... idx) { boolean[] changedFlags = intercept.getChanged(); Assert.assertNotNull(changedFlags); for (int pos : idx) { Assert.assertEquals(propertyLoaded, changedFlags[pos]); } } }