package siena.base.test;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import siena.Model;
import siena.PersistenceManager;
import siena.PersistenceManagerFactory;
import siena.base.test.model.EmbeddedContainerModel;
import siena.base.test.model.EmbeddedContainerModelJava;
import siena.base.test.model.EmbeddedContainerModelNative;
import siena.base.test.model.EmbeddedContainerNative;
import siena.base.test.model.EmbeddedModel;
import siena.base.test.model.EmbeddedNative;
import siena.base.test.model.EmbeddedNative.MyEnum;
import siena.base.test.model.EmbeddedSubModel;
public abstract class BaseEmbeddedTest extends TestCase {
protected PersistenceManager pm;
public abstract PersistenceManager createPersistenceManager(List<Class<?>> classes) throws Exception;
@Override
protected void setUp() throws Exception {
super.setUp();
List<Class<?>> classes = new ArrayList<Class<?>>();
classes.add(EmbeddedModel.class);
classes.add(EmbeddedSubModel.class);
classes.add(EmbeddedContainerModel.class);
classes.add(EmbeddedContainerModelJava.class);
classes.add(EmbeddedContainerModelNative.class);
classes.add(EmbeddedContainerNative.class);
classes.add(EmbeddedNative.class);
pm = createPersistenceManager(classes);
PersistenceManagerFactory.install(pm, classes);
for (Class<?> clazz : classes) {
if(!Modifier.isAbstract(clazz.getModifiers())){
pm.createQuery(clazz).delete();
}
}
}
public void testEmbeddedModel() {
EmbeddedModel embed = new EmbeddedModel();
embed.id = "embed";
embed.alpha = "test";
embed.beta = 123;
embed.setGamma(true);
pm.insert(embed);
EmbeddedModel embed2 = new EmbeddedModel();
embed2.id = "embed2";
embed2.alpha = "test2";
embed2.beta = 1234;
embed2.setGamma(true);
pm.insert(embed2);
EmbeddedContainerModel container = new EmbeddedContainerModel();
container.id = "container";
container.embed = embed;
container.embeds = new ArrayList<EmbeddedModel>();
container.embeds.add(embed);
container.embeds.add(embed2);
pm.insert(container);
EmbeddedContainerModel afterContainer = pm.getByKey(EmbeddedContainerModel.class, container.id);
assertNotNull(afterContainer);
assertEquals(container.id, afterContainer.id);
assertNotNull(afterContainer.embed);
assertEquals(embed.id, afterContainer.embed.id);
assertEquals(null, afterContainer.embed.alpha);
assertEquals(embed.beta, afterContainer.embed.beta);
int i=0;
for(EmbeddedModel mod: afterContainer.embeds){
assertEquals(container.embeds.get(i++).id, mod.id);
}
assertEquals(embed.isGamma(), afterContainer.embed.isGamma());
}
public void testEmbeddedModelJava() {
EmbeddedModel embed = new EmbeddedModel();
embed.id = "embed";
embed.alpha = "test";
embed.beta = 123;
embed.setGamma(true);
pm.insert(embed);
EmbeddedModel embed2 = new EmbeddedModel();
embed2.id = "embed2";
embed2.alpha = "test2";
embed2.beta = 1234;
embed2.setGamma(true);
pm.insert(embed2);
EmbeddedContainerModelJava container = new EmbeddedContainerModelJava();
container.id = "container";
container.embed = embed;
container.embeds = new ArrayList<EmbeddedModel>();
container.embeds.add(embed);
container.embeds.add(embed2);
pm.insert(container);
EmbeddedContainerModelJava afterContainer = pm.getByKey(EmbeddedContainerModelJava.class, container.id);
assertNotNull(afterContainer);
assertEquals(container.id, afterContainer.id);
assertNotNull(afterContainer.embed);
assertEquals(embed.id, afterContainer.embed.id);
// doesn't ignore @EmbedIgnore as it is not possible to have fine grain in Java serialization
assertEquals("test", afterContainer.embed.alpha);
assertEquals(embed.beta, afterContainer.embed.beta);
int i=0;
for(EmbeddedModel mod: afterContainer.embeds){
assertEquals(container.embeds.get(i++).id, mod.id);
}
assertEquals(embed.isGamma(), afterContainer.embed.isGamma());
}
public void testEmbeddedNative() {
EmbeddedNative embed = new EmbeddedNative();
embed.alpha = "test";
embed.beta = 123;
embed.setGamma(true);
embed.delta = 456L;
embed.eta = new ArrayList<String>() {{ add("one"); add("two"); }};
embed.myEnum = MyEnum.ONE;
embed.big = new BigDecimal("12345678.12345678");
embed.jsonEmbed = new EmbeddedNative.SubEmbed();
embed.jsonEmbed.str = "test";
embed.jsonEmbed.l = 123L;
embed.javaEmbed = new EmbeddedNative.SubEmbed();
embed.javaEmbed.str = "test";
embed.javaEmbed.l = 123L;
embed.nativeEmbed = new EmbeddedNative.SubEmbed();
embed.nativeEmbed.str = "test";
embed.nativeEmbed.l = 123L;
EmbeddedContainerNative container = new EmbeddedContainerNative();
container.id = "container";
container.normal = "string";
container.embed = embed;
pm.save(container);
EmbeddedContainerNative afterContainer = Model.getByKey(EmbeddedContainerNative.class, container.id);
assertNotNull(afterContainer);
assertEquals(container.id, afterContainer.id);
assertEquals(container.normal, afterContainer.normal);
assertNotNull(afterContainer.embed);
assertEquals(embed.alpha, afterContainer.embed.alpha);
assertEquals(embed.beta, afterContainer.embed.beta);
assertEquals(embed.isGamma(), afterContainer.embed.isGamma());
assertEquals(embed.myEnum, afterContainer.embed.myEnum);
assertEquals(embed.big, afterContainer.embed.big);
assertEquals(embed.jsonEmbed.str, afterContainer.embed.jsonEmbed.str);
assertEquals(embed.jsonEmbed.l, afterContainer.embed.jsonEmbed.l);
assertEquals(embed.javaEmbed.str, afterContainer.embed.javaEmbed.str);
assertEquals(embed.javaEmbed.l, afterContainer.embed.javaEmbed.l);
assertEquals(embed.nativeEmbed.str, afterContainer.embed.nativeEmbed.str);
assertEquals(embed.nativeEmbed.l, afterContainer.embed.nativeEmbed.l);
}
public void testEmbeddedNativeFilter() {
List<EmbeddedContainerNative> containers = new ArrayList<EmbeddedContainerNative>();
for(int i=0; i<100; i++){
EmbeddedNative embed = new EmbeddedNative();
embed.alpha = "test"+i;
embed.beta = 123;
embed.setGamma(true);
embed.delta = 456L;
embed.eta = new ArrayList<String>() {{ add("one"); add("two"); }};
embed.myEnum = MyEnum.ONE;
embed.big = new BigDecimal("12345678.12345678");
embed.jsonEmbed = new EmbeddedNative.SubEmbed();
embed.jsonEmbed.str = "test";
embed.jsonEmbed.l = 123L;
embed.javaEmbed = new EmbeddedNative.SubEmbed();
embed.javaEmbed.str = "test";
embed.javaEmbed.l = 123L;
embed.nativeEmbed = new EmbeddedNative.SubEmbed();
embed.nativeEmbed.str = "subtest"+i;
embed.nativeEmbed.l = 123L;
EmbeddedContainerNative container = new EmbeddedContainerNative();
container.id = "container"+i;
container.normal = "string";
container.embed = embed;
pm.insert(container);
containers.add(container);
}
EmbeddedContainerNative afterContainer = Model.all(EmbeddedContainerNative.class).filter("embed.alpha", "test56").get();
assertNotNull(afterContainer);
assertEquals(containers.get(56).id, afterContainer.id);
assertEquals(containers.get(56).normal, afterContainer.normal);
assertNotNull(afterContainer.embed);
assertEquals(containers.get(56).embed.alpha, afterContainer.embed.alpha);
assertEquals(containers.get(56).embed.beta, afterContainer.embed.beta);
assertEquals(containers.get(56).embed.isGamma(), afterContainer.embed.isGamma());
assertEquals(containers.get(56).embed.myEnum, afterContainer.embed.myEnum);
assertEquals(containers.get(56).embed.big, afterContainer.embed.big);
assertEquals(containers.get(56).embed.jsonEmbed.str, afterContainer.embed.jsonEmbed.str);
assertEquals(containers.get(56).embed.jsonEmbed.l, afterContainer.embed.jsonEmbed.l);
assertEquals(containers.get(56).embed.javaEmbed.str, afterContainer.embed.javaEmbed.str);
assertEquals(containers.get(56).embed.javaEmbed.l, afterContainer.embed.javaEmbed.l);
assertEquals(containers.get(56).embed.nativeEmbed.str, afterContainer.embed.nativeEmbed.str);
assertEquals(containers.get(56).embed.nativeEmbed.l, afterContainer.embed.nativeEmbed.l);
afterContainer = Model.all(EmbeddedContainerNative.class).filter("embed.nativeEmbed.str", "subtest64").get();
assertNotNull(afterContainer);
assertEquals(containers.get(64).id, afterContainer.id);
assertEquals(containers.get(64).normal, afterContainer.normal);
assertNotNull(afterContainer.embed);
assertEquals(containers.get(64).embed.alpha, afterContainer.embed.alpha);
assertEquals(containers.get(64).embed.beta, afterContainer.embed.beta);
assertEquals(containers.get(64).embed.isGamma(), afterContainer.embed.isGamma());
assertEquals(containers.get(64).embed.myEnum, afterContainer.embed.myEnum);
assertEquals(containers.get(64).embed.big, afterContainer.embed.big);
assertEquals(containers.get(64).embed.jsonEmbed.str, afterContainer.embed.jsonEmbed.str);
assertEquals(containers.get(64).embed.jsonEmbed.l, afterContainer.embed.jsonEmbed.l);
assertEquals(containers.get(64).embed.javaEmbed.str, afterContainer.embed.javaEmbed.str);
assertEquals(containers.get(64).embed.javaEmbed.l, afterContainer.embed.javaEmbed.l);
assertEquals(containers.get(64).embed.nativeEmbed.str, afterContainer.embed.nativeEmbed.str);
assertEquals(containers.get(64).embed.nativeEmbed.l, afterContainer.embed.nativeEmbed.l);
}
public void testEmbeddedModelNative() {
EmbeddedModel embed = new EmbeddedModel();
embed.id = "embed";
embed.alpha = "test";
embed.beta = 123;
embed.setGamma(true);
embed.sub = new EmbeddedSubModel();
embed.sub.id = "sub";
embed.sub.parent = embed;
pm.insert(embed);
EmbeddedContainerModelNative container = new EmbeddedContainerModelNative();
container.id = "container";
container.embed = embed;
pm.insert(container);
EmbeddedContainerModelNative afterContainer = pm.getByKey(EmbeddedContainerModelNative.class, container.id);
assertNotNull(afterContainer);
assertEquals(container.id, afterContainer.id);
assertNotNull(afterContainer.embed);
assertEquals(embed.id, afterContainer.embed.id);
// doesn't ignore @EmbedIgnore as it is not possible to have fine grain in Java serialization
assertEquals("test", afterContainer.embed.alpha);
assertEquals(embed.beta, afterContainer.embed.beta);
assertEquals(embed.isGamma(), afterContainer.embed.isGamma());
assertEquals("sub", afterContainer.embed.sub.id);
assertNull(afterContainer.embed.sub.parent);
}
}