package org.odata4j.test.unit.producer.inmemory; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import java.util.Collection; import java.util.List; import org.core4j.Enumerable; import org.core4j.Predicate1; import org.junit.Ignore; import org.junit.Test; import org.odata4j.edm.EdmDataServices; import org.odata4j.edm.EdmEntityType; import org.odata4j.edm.EdmMultiplicity; import org.odata4j.edm.EdmNavigationProperty; import org.odata4j.edm.EdmProperty; import org.odata4j.producer.inmemory.BeanBasedPropertyModel; import org.odata4j.producer.inmemory.EnumsAsStringsPropertyModelDelegate; import org.odata4j.producer.inmemory.InMemoryProducer; /** * Test various aspects of InMemoryEdmGenerator * * hierarchy: * RHS * Base * ----Sub1 * ----Sub1_2 * ----Sub2 */ public class InMemoryEdmTest { public static class RHS { public String getRHSProp1() { return ""; } public void setRHSProp1() {} } public static class Base { // key public String getBaseProp1() { return ""; } public void setBaseProp1() {} // base class relationships public Collection<RHS> getRHSs() { return null; } public void setRHSs(Collection<RHS> value) {} public RHS getRHS() { return null; } public void setRHS(RHS value) {} } public static class Sub1 extends Base { public String getSub1Prop1() { return ""; } public void setSub1Prop1() {} } public static class Sub2 extends Base { public String getSub2Prop1() { return ""; } public void setSub2Prop1() {} } public static class Sub1_2 extends Sub1 { public String getSub1_2Prop1() { return ""; } public void setSub1_2Prop1() {} // leaf relationships public Collection<Sub2> getSub2s() { return null; } public void setSub2s(Collection<Sub2> value) {} public Sub2 getSub2() { return null; } public void setSub2(Sub2 value) {} } private void register(InMemoryProducer p, Class<? extends Object> clazz, boolean flat, String... keys) { p.register(clazz, new EnumsAsStringsPropertyModelDelegate(new BeanBasedPropertyModel(clazz, flat)), clazz.getSimpleName() + "s", // set clazz.getSimpleName(), // type null, keys); // keys } private void assertKeys(List<String> keys, String[] expect) { assertEquals(expect.length, keys.size()); for (String k : expect) { assertTrue(keys.contains(k)); } } private void assertNavProp(String fromType, EdmMultiplicity fromMult, String toType, EdmMultiplicity toMult, EdmNavigationProperty got) { assertEquals(fromType, got.getFromRole().getType().getName()); assertEquals(fromMult, got.getFromRole().getMultiplicity()); assertEquals(toType, got.getToRole().getType().getName()); assertEquals(toMult, got.getToRole().getMultiplicity()); } private void assertProps(Enumerable<EdmProperty> got, String... expected) { assertEquals(expected.length, got.count()); for (final String e : expected) { EdmProperty p = got.first(new Predicate1<EdmProperty>() { @Override public boolean apply(EdmProperty t) { return t.getName().equals(e); } }); assertEquals(e, p.getName()); } } @Test public void testHierarchyEdm() { InMemoryProducer p = new InMemoryProducer("myns", null, // String containerName, 100, // int maxResults, null, // EdmDecorator decorator, null, // InMemoryTypeMapping typeMapping, false); // boolean flattenEdm); register(p, RHS.class, false, "RHSProp1"); register(p, Base.class, false, "BaseProp1"); register(p, Sub1.class, false, "BaseProp1"); register(p, Sub1_2.class, false, "BaseProp1"); register(p, Sub2.class, false, "BaseProp1"); EdmDataServices edm = p.getMetadata(); //EdmxFormatWriter.write(edm, new OutputStreamWriter(System.out)); EdmEntityType rhs = (EdmEntityType) edm.findEdmEntityType("myns." + RHS.class.getSimpleName()); assertTrue(rhs != null); assertTrue(rhs.getBaseType() == null); assertKeys(rhs.getKeys(), new String[] { "RHSProp1" }); assertEquals(0, rhs.getDeclaredNavigationProperties().count()); assertEquals(1, rhs.getDeclaredProperties().count()); assertProps(rhs.getDeclaredProperties(), new String[] { "RHSProp1" }); assertProps(rhs.getProperties(), new String[] { "RHSProp1" }); EdmEntityType base = (EdmEntityType) edm.findEdmEntityType("myns." + Base.class.getSimpleName()); assertTrue(base != null); assertTrue(base.getBaseType() == null); assertKeys(base.getKeys(), new String[] { "BaseProp1" }); assertProps(base.getDeclaredProperties(), new String[] { "BaseProp1" }); assertProps(base.getProperties(), new String[] { "BaseProp1" }); assertEquals(2, base.getDeclaredNavigationProperties().count()); assertEquals(2, base.getNavigationProperties().count()); assertNavProp("Base", EdmMultiplicity.MANY, "RHS", EdmMultiplicity.ONE, base.findDeclaredNavigationProperty("RHS")); assertNavProp("Base", EdmMultiplicity.ZERO_TO_ONE, "RHS", EdmMultiplicity.MANY, base.findDeclaredNavigationProperty("RHSs")); EdmEntityType sub1 = (EdmEntityType) edm.findEdmEntityType("myns." + Sub1.class.getSimpleName()); assertTrue(sub1 != null); assertEquals(base, sub1.getBaseType()); assertKeys(sub1.getKeys(), new String[] { "BaseProp1" }); assertProps(sub1.getDeclaredProperties(), new String[] { "Sub1Prop1" }); assertProps(sub1.getProperties(), new String[] { "BaseProp1", "Sub1Prop1" }); assertEquals(0, sub1.getDeclaredNavigationProperties().count()); assertEquals(2, sub1.getNavigationProperties().count()); assertNavProp("Base", EdmMultiplicity.MANY, "RHS", EdmMultiplicity.ONE, sub1.findNavigationProperty("RHS")); assertNavProp("Base", EdmMultiplicity.ZERO_TO_ONE, "RHS", EdmMultiplicity.MANY, sub1.findNavigationProperty("RHSs")); EdmEntityType sub2 = (EdmEntityType) edm.findEdmEntityType("myns." + Sub2.class.getSimpleName()); assertTrue(sub2 != null); assertEquals(base, sub2.getBaseType()); assertKeys(sub2.getKeys(), new String[] { "BaseProp1" }); assertProps(sub2.getDeclaredProperties(), new String[] { "Sub2Prop1" }); assertProps(sub2.getProperties(), new String[] { "BaseProp1", "Sub2Prop1" }); assertEquals(0, sub2.getDeclaredNavigationProperties().count()); assertEquals(2, sub2.getNavigationProperties().count()); assertNavProp("Base", EdmMultiplicity.MANY, "RHS", EdmMultiplicity.ONE, sub2.findNavigationProperty("RHS")); assertNavProp("Base", EdmMultiplicity.ZERO_TO_ONE, "RHS", EdmMultiplicity.MANY, sub2.findNavigationProperty("RHSs")); EdmEntityType sub1_2 = (EdmEntityType) edm.findEdmEntityType("myns." + Sub1_2.class.getSimpleName()); assertTrue(sub1_2 != null); assertEquals(sub1, sub1_2.getBaseType()); assertKeys(sub1_2.getKeys(), new String[] { "BaseProp1" }); assertProps(sub1_2.getDeclaredProperties(), new String[] { "Sub1_2Prop1" }); assertProps(sub1_2.getProperties(), new String[] { "BaseProp1", "Sub1Prop1", "Sub1_2Prop1" }); assertEquals(2, sub1_2.getDeclaredNavigationProperties().count()); assertEquals(4, sub1_2.getNavigationProperties().count()); assertNavProp("Base", EdmMultiplicity.MANY, "RHS", EdmMultiplicity.ONE, sub1_2.findNavigationProperty("RHS")); assertNavProp("Base", EdmMultiplicity.ZERO_TO_ONE, "RHS", EdmMultiplicity.MANY, sub1_2.findNavigationProperty("RHSs")); assertNavProp("Sub1_2", EdmMultiplicity.MANY, "Sub2", EdmMultiplicity.ONE, sub1_2.findDeclaredNavigationProperty("Sub2")); assertNavProp("Sub1_2", EdmMultiplicity.ZERO_TO_ONE, "Sub2", EdmMultiplicity.MANY, sub1_2.findDeclaredNavigationProperty("Sub2s")); } @Test public void testFlatEdm() { InMemoryProducer p = new InMemoryProducer("myns"); register(p, RHS.class, true, "RHSProp1"); register(p, Sub1.class, true, "BaseProp1"); EdmDataServices edm = p.getMetadata(); // EdmxFormatWriter.write(edm, new OutputStreamWriter(System.out)); EdmEntityType sub1 = (EdmEntityType) edm.findEdmEntityType("myns." + Sub1.class.getSimpleName()); assertTrue(sub1 != null); assertEquals(null, sub1.getBaseType()); assertKeys(sub1.getKeys(), new String[] { "BaseProp1" }); assertProps(sub1.getDeclaredProperties(), new String[] { "BaseProp1", "Sub1Prop1" }); assertProps(sub1.getProperties(), new String[] { "BaseProp1", "Sub1Prop1" }); assertEquals(2, sub1.getDeclaredNavigationProperties().count()); assertEquals(2, sub1.getNavigationProperties().count()); assertNavProp("Sub1", EdmMultiplicity.MANY, "RHS", EdmMultiplicity.ONE, sub1.findNavigationProperty("RHS")); assertNavProp("Sub1", EdmMultiplicity.ZERO_TO_ONE, "RHS", EdmMultiplicity.MANY, sub1.findNavigationProperty("RHSs")); } @Ignore("this currently fails, should not") //@Test public void testUniqueAssociationNames() { InMemoryProducer p = new InMemoryProducer("myns"); register(p, RHS.class, true, "RHSProp1"); register(p, Base.class, true, "BaseProp1"); EdmDataServices edm = p.getMetadata(); EdmEntityType base = (EdmEntityType) edm.findEdmEntityType("myns.Base"); EdmNavigationProperty a1 = base.findNavigationProperty("RHS"); EdmNavigationProperty a2 = base.findNavigationProperty("RHSs"); assertFalse(a1.getRelationship().getName() + " should not equal " + a1.getRelationship().getName(), a1.getRelationship().getName().equals(a1.getRelationship().getName())); } }