olingo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From chri...@apache.org
Subject [6/6] olingo-odata4 git commit: [OLINGO-786] Move edm tests to commons core
Date Thu, 08 Oct 2015 11:46:55 GMT
[OLINGO-786] Move edm tests to commons core

Tests for the edm only depend on the commons part so they should be there
as  well.


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/9c1981c4
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/9c1981c4
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/9c1981c4

Branch: refs/heads/olingo786
Commit: 9c1981c410388cf0fdb035730222fbcde7f52465
Parents: 546cf34
Author: Christian Amend <christian.amend@sap.com>
Authored: Thu Oct 8 13:45:16 2015 +0200
Committer: Christian Amend <christian.amend@sap.com>
Committed: Thu Oct 8 13:45:16 2015 +0200

----------------------------------------------------------------------
 .../core/edm/provider/AbstractEdmNamedTest.java |  59 +++
 .../core/edm/provider/EdmActionImplTest.java    | 156 ++++++++
 .../edm/provider/EdmActionImportImplTest.java   | 104 +++++
 .../edm/provider/EdmComplexTypeImplTest.java    | 169 ++++++++
 .../provider/EdmEntityContainerImplTest.java    | 299 ++++++++++++++
 .../core/edm/provider/EdmEntitySetImplTest.java |  83 ++++
 .../edm/provider/EdmEntityTypeImplTest.java     | 391 +++++++++++++++++++
 .../server/core/edm/provider/EdmEnumTest.java   | 372 ++++++++++++++++++
 .../core/edm/provider/EdmFunctionImplTest.java  |  78 ++++
 .../edm/provider/EdmFunctionImportImplTest.java |  88 +++++
 .../edm/provider/EdmKeyPropertyRefImplTest.java | 141 +++++++
 .../core/edm/provider/EdmMappingTest.java       |  72 ++++
 .../core/edm/provider/EdmMemberImplTest.java    |  40 ++
 .../provider/EdmNavigationPropertyImplTest.java | 146 +++++++
 .../core/edm/provider/EdmParameterImplTest.java | 143 +++++++
 .../core/edm/provider/EdmPropertyImplTest.java  | 158 ++++++++
 .../EdmProviderImplOverloadingTest.java         | 199 ++++++++++
 .../core/edm/provider/EdmProviderImplTest.java  | 225 +++++++++++
 .../edm/provider/EdmReturnTypeImplTest.java     | 134 +++++++
 .../core/edm/provider/EdmSchemaImplTest.java    | 363 +++++++++++++++++
 .../core/edm/provider/EdmSingletonImplTest.java | 131 +++++++
 .../edm/provider/EdmTypeDefinitionImplTest.java |  77 ++++
 .../core/edm/provider/EdmTypeImplTest.java      |  62 +++
 .../core/edm/provider/AbstractEdmNamedTest.java |  59 ---
 .../core/edm/provider/EdmActionImplTest.java    | 156 --------
 .../edm/provider/EdmActionImportImplTest.java   | 104 -----
 .../edm/provider/EdmComplexTypeImplTest.java    | 169 --------
 .../provider/EdmEntityContainerImplTest.java    | 299 --------------
 .../core/edm/provider/EdmEntitySetImplTest.java |  83 ----
 .../edm/provider/EdmEntityTypeImplTest.java     | 391 -------------------
 .../server/core/edm/provider/EdmEnumTest.java   | 372 ------------------
 .../core/edm/provider/EdmFunctionImplTest.java  |  78 ----
 .../edm/provider/EdmFunctionImportImplTest.java |  88 -----
 .../edm/provider/EdmKeyPropertyRefImplTest.java | 141 -------
 .../core/edm/provider/EdmMappingTest.java       |  72 ----
 .../core/edm/provider/EdmMemberImplTest.java    |  40 --
 .../provider/EdmNavigationPropertyImplTest.java | 146 -------
 .../core/edm/provider/EdmParameterImplTest.java | 143 -------
 .../core/edm/provider/EdmPropertyImplTest.java  | 158 --------
 .../EdmProviderImplOverloadingTest.java         | 199 ----------
 .../core/edm/provider/EdmProviderImplTest.java  | 225 -----------
 .../edm/provider/EdmReturnTypeImplTest.java     | 134 -------
 .../core/edm/provider/EdmSchemaImplTest.java    | 363 -----------------
 .../core/edm/provider/EdmSingletonImplTest.java | 131 -------
 .../edm/provider/EdmTypeDefinitionImplTest.java |  77 ----
 .../core/edm/provider/EdmTypeImplTest.java      |  62 ---
 46 files changed, 3690 insertions(+), 3690 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9c1981c4/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/AbstractEdmNamedTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/AbstractEdmNamedTest.java b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/AbstractEdmNamedTest.java
new file mode 100644
index 0000000..5e12b7c
--- /dev/null
+++ b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/AbstractEdmNamedTest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.edm.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.olingo.commons.api.edm.EdmAnnotatable;
+import org.apache.olingo.commons.api.edm.EdmNamed;
+import org.apache.olingo.commons.api.edm.provider.CsdlAnnotatable;
+import org.apache.olingo.commons.api.edm.provider.CsdlAnnotation;
+import org.apache.olingo.commons.core.edm.AbstractEdmNamed;
+import org.junit.Test;
+
+public class AbstractEdmNamedTest {
+
+  @Test
+  public void getNameTest() {
+    EdmNamed obj = new EdmNamedImplTester("Name");
+    assertEquals("Name", obj.getName());
+    EdmAnnotatable an = (EdmAnnotatable) obj;
+    assertNotNull(an.getAnnotations().get(0));
+  }
+
+  private class EdmNamedImplTester extends AbstractEdmNamed {
+
+    public EdmNamedImplTester(final String name) {
+      super(null, name, new AnnoTester());
+    }
+  }
+
+  private class AnnoTester implements CsdlAnnotatable {
+    @Override
+    public List<CsdlAnnotation> getAnnotations() {
+      CsdlAnnotation annotation = new CsdlAnnotation();
+      annotation.setTerm("NS.SimpleTerm");
+      return Arrays.asList(annotation);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9c1981c4/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImplTest.java
new file mode 100644
index 0000000..86bd9f4
--- /dev/null
+++ b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImplTest.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.edm.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.olingo.commons.api.edm.EdmAction;
+import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmParameter;
+import org.apache.olingo.commons.api.edm.EdmSingleton;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
+import org.apache.olingo.commons.api.edm.provider.CsdlAction;
+import org.apache.olingo.commons.api.edm.provider.CsdlParameter;
+import org.apache.olingo.commons.api.edm.provider.CsdlReturnType;
+import org.apache.olingo.commons.core.edm.EdmActionImpl;
+import org.apache.olingo.commons.core.edm.EdmProviderImpl;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EdmActionImplTest {
+
+  private EdmAction actionImpl1;
+  private EdmAction actionImpl2;
+  private EdmAction actionImpl3;
+
+  @Before
+  public void setup() {
+    EdmProviderImpl provider = mock(EdmProviderImpl.class);
+    List<CsdlParameter> parameters = new ArrayList<CsdlParameter>();
+    parameters.add(new CsdlParameter().setName("Id").setType(new FullQualifiedName("namespace", "name")));
+    FullQualifiedName action1Name = new FullQualifiedName("namespace", "action1");
+    CsdlAction action1 = new CsdlAction().setName("action1").setBound(true).setParameters(parameters);
+    actionImpl1 = new EdmActionImpl(provider, action1Name, action1);
+
+    FullQualifiedName action2Name = new FullQualifiedName("namespace", "action2");
+    FullQualifiedName returnTypeName = new FullQualifiedName("Edm", "String");
+    CsdlReturnType returnType = new CsdlReturnType().setType(returnTypeName);
+    CsdlAction action2 = new CsdlAction().setName("action2").setParameters(parameters).setReturnType(returnType);
+    actionImpl2 = new EdmActionImpl(provider, action2Name, action2);
+
+    FullQualifiedName action3Name = new FullQualifiedName("namespace", "action3");
+    CsdlAction action3 =
+        new CsdlAction().setName("action3").setParameters(parameters).setReturnType(returnType).setEntitySetPath(
+            "path/Id");
+    actionImpl3 = new EdmActionImpl(provider, action3Name, action3);
+  }
+
+  @Test
+  public void action1BasicMethodCalls() {
+    assertTrue(actionImpl1.isBound());
+    assertEquals(EdmTypeKind.ACTION, actionImpl1.getKind());
+    assertNull(actionImpl1.getReturnType());
+    // assertEquals("returnName", actionImpl1.getReturnType().getType().getName());
+    assertNotNull(actionImpl1.getParameterNames());
+
+    for (String name : actionImpl1.getParameterNames()) {
+      EdmParameter parameter = actionImpl1.getParameter(name);
+      assertNotNull(parameter);
+      assertEquals(name, parameter.getName());
+    }
+
+    assertNull(actionImpl1.getReturnedEntitySet(null));
+    assertNull(actionImpl1.getReturnedEntitySet(mock(EdmEntitySet.class)));
+  }
+
+  @Test
+  public void action2BasicMethodCalls() {
+    assertFalse(actionImpl2.isBound());
+    assertEquals(EdmTypeKind.ACTION, actionImpl2.getKind());
+    assertEquals("String", actionImpl2.getReturnType().getType().getName());
+    assertNotNull(actionImpl2.getParameterNames());
+
+    for (String name : actionImpl2.getParameterNames()) {
+      EdmParameter parameter = actionImpl2.getParameter(name);
+      assertNotNull(parameter);
+      assertEquals(name, parameter.getName());
+    }
+
+    assertNull(actionImpl2.getReturnedEntitySet(null));
+    assertNull(actionImpl2.getReturnedEntitySet(mock(EdmEntitySet.class)));
+  }
+
+  @Test
+  public void action3BasicMethodCalls() {
+    assertFalse(actionImpl3.isBound());
+    assertEquals(EdmTypeKind.ACTION, actionImpl3.getKind());
+    assertEquals("String", actionImpl3.getReturnType().getType().getName());
+    assertNotNull(actionImpl3.getParameterNames());
+
+    for (String name : actionImpl3.getParameterNames()) {
+      EdmParameter parameter = actionImpl3.getParameter(name);
+      assertNotNull(parameter);
+      assertEquals(name, parameter.getName());
+    }
+
+    actionImpl3.getReturnedEntitySet(null);
+  }
+
+  @Test
+  public void action3getReturnedEntitySetWithEntitySet() {
+    EdmEntitySet set = mock(EdmEntitySet.class);
+    when(set.getRelatedBindingTarget("path/Id")).thenReturn(set);
+
+    EdmEntitySet returnedEntitySet = actionImpl3.getReturnedEntitySet(set);
+
+    assertEquals(set, returnedEntitySet);
+  }
+
+  @Test(expected = EdmException.class)
+  public void action3getReturnedEntitySetWithNullReturn() {
+    EdmEntitySet set = mock(EdmEntitySet.class);
+    when(set.getRelatedBindingTarget("path")).thenReturn(null);
+
+    actionImpl3.getReturnedEntitySet(set);
+    fail();
+  }
+
+  @Test(expected = EdmException.class)
+  public void action3getReturnedEntitySetWithSingleton() {
+    EdmSingleton singleton = mock(EdmSingleton.class);
+    EdmEntitySet set = mock(EdmEntitySet.class);
+    when(set.getRelatedBindingTarget("path")).thenReturn(singleton);
+
+    actionImpl3.getReturnedEntitySet(set);
+    fail();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9c1981c4/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java
new file mode 100644
index 0000000..02824f4
--- /dev/null
+++ b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmActionImportImplTest.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.edm.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.olingo.commons.api.edm.EdmAction;
+import org.apache.olingo.commons.api.edm.EdmActionImport;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.provider.CsdlActionImport;
+import org.apache.olingo.commons.core.edm.EdmActionImportImpl;
+import org.apache.olingo.commons.core.edm.EdmProviderImpl;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EdmActionImportImplTest {
+
+  EdmEntityContainer container;
+
+  EdmActionImport actionImport;
+
+  private EdmAction action;
+
+  private EdmEntitySet entitySet;
+
+  @Before
+  public void setup() {
+    FullQualifiedName actionFqn = new FullQualifiedName("namespace", "actionName");
+    FullQualifiedName entityContainerFqn = new FullQualifiedName("namespace", "containerName");
+    String target = entityContainerFqn.getFullQualifiedNameAsString() + "/entitySetName";
+    CsdlActionImport providerActionImport =
+        new CsdlActionImport().setName("actionImportName").setAction(actionFqn).setEntitySet(target);
+
+    EdmProviderImpl edm = mock(EdmProviderImpl.class);
+    container = mock(EdmEntityContainer.class);
+    when(edm.getEntityContainer(entityContainerFqn)).thenReturn(container);
+    action = mock(EdmAction.class);
+    when(edm.getUnboundAction(actionFqn)).thenReturn(action);
+
+    entitySet = mock(EdmEntitySet.class);
+    when(container.getEntitySet("entitySetName")).thenReturn(entitySet);
+    actionImport = new EdmActionImportImpl(edm, container, providerActionImport);
+  }
+
+  @Test
+  public void simpleActionTest() {
+    assertEquals("actionImportName", actionImport.getName());
+    assertTrue(container == actionImport.getEntityContainer());
+    assertTrue(action == actionImport.getUnboundAction());
+  }
+
+  @Test
+  public void getReturnedEntitySet() {
+    EdmEntitySet returnedEntitySet = actionImport.getReturnedEntitySet();
+    assertNotNull(returnedEntitySet);
+    assertTrue(returnedEntitySet == entitySet);
+
+    // Chaching
+    assertTrue(returnedEntitySet == actionImport.getReturnedEntitySet());
+  }
+
+  @Test(expected = EdmException.class)
+  public void getReturnedEntitySetNonExistingContainer() {
+    String target = "alias.nonexisting/Es";
+    CsdlActionImport providerActionImport = new CsdlActionImport().setName("actionImportName").setEntitySet(target);
+    EdmActionImport actionImport =
+        new EdmActionImportImpl(mock(EdmProviderImpl.class), container, providerActionImport);
+    actionImport.getReturnedEntitySet();
+  }
+
+  @Test(expected = EdmException.class)
+  public void getReturnedEntitySetNonExistingEntitySet() {
+    String target = "nonExisting";
+    CsdlActionImport providerActionImport = new CsdlActionImport().setName("actionImportName").setEntitySet(target);
+    EdmProviderImpl edm = mock(EdmProviderImpl.class);
+    when(edm.getEntityContainer(null)).thenReturn(container);
+    EdmActionImport actionImport = new EdmActionImportImpl(edm, container, providerActionImport);
+    actionImport.getReturnedEntitySet();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9c1981c4/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmComplexTypeImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmComplexTypeImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmComplexTypeImplTest.java
new file mode 100644
index 0000000..b97c995
--- /dev/null
+++ b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmComplexTypeImplTest.java
@@ -0,0 +1,169 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.edm.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.olingo.commons.api.edm.EdmComplexType;
+import org.apache.olingo.commons.api.edm.EdmElement;
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.provider.CsdlComplexType;
+import org.apache.olingo.commons.api.edm.provider.CsdlEdmProvider;
+import org.apache.olingo.commons.api.edm.provider.CsdlNavigationProperty;
+import org.apache.olingo.commons.api.edm.provider.CsdlProperty;
+import org.apache.olingo.commons.core.edm.EdmComplexTypeImpl;
+import org.apache.olingo.commons.core.edm.EdmProviderImpl;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EdmComplexTypeImplTest {
+
+  private EdmComplexType baseType;
+
+  private EdmComplexType type;
+
+  @Before
+  public void setupTypes() throws Exception {
+    CsdlEdmProvider provider = mock(CsdlEdmProvider.class);
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
+
+    FullQualifiedName baseName = new FullQualifiedName("namespace", "BaseTypeName");
+    CsdlComplexType baseComplexType = new CsdlComplexType();
+    List<CsdlProperty> baseProperties = new ArrayList<CsdlProperty>();
+    baseProperties.add(new CsdlProperty().setName("prop1").setType(
+        EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    List<CsdlNavigationProperty> baseNavigationProperties = new ArrayList<CsdlNavigationProperty>();
+    baseNavigationProperties.add(new CsdlNavigationProperty().setName("nav1"));
+    baseComplexType.setName("BaseTypeName").setAbstract(false).setOpenType(false).setProperties(baseProperties)
+        .setNavigationProperties(baseNavigationProperties);
+    when(provider.getComplexType(baseName)).thenReturn(baseComplexType);
+
+    baseType = new EdmComplexTypeImpl(edm, baseName, baseComplexType);
+
+    FullQualifiedName name = new FullQualifiedName("namespace", "typeName");
+    CsdlComplexType complexType = new CsdlComplexType().setBaseType(baseName);
+    List<CsdlProperty> properties = new ArrayList<CsdlProperty>();
+    properties.add(new CsdlProperty().setName("prop2").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    List<CsdlNavigationProperty> navigationProperties = new ArrayList<CsdlNavigationProperty>();
+    navigationProperties.add(new CsdlNavigationProperty().setName("nav2"));
+    complexType.setName("BaseTypeName").setAbstract(false).setOpenType(false).setProperties(properties)
+        .setNavigationProperties(navigationProperties);
+    when(provider.getComplexType(name)).thenReturn(complexType);
+
+    type = new EdmComplexTypeImpl(edm, name, complexType);
+  }
+
+  @Test
+  public void noPropertiesAndNoNavPropertiesMustNotResultInException() {
+    EdmProviderImpl edm = mock(EdmProviderImpl.class);
+    CsdlComplexType complexType = new CsdlComplexType().setName("n");
+    new EdmComplexTypeImpl(edm, new FullQualifiedName("n", "n"), complexType);
+  }
+
+  @Test
+  public void typeMustBeCompatibletoBasetype() {
+    assertTrue(type.compatibleTo(baseType));
+  }
+
+  @Test
+  public void baseTypeMustNotBeCompatibleToType() {
+    assertFalse(baseType.compatibleTo(type));
+  }
+
+  @Test(expected = EdmException.class)
+  public void nullForCompatibleTypeMustResultInEdmException() {
+    assertFalse(type.compatibleTo(null));
+  }
+
+  @Test
+  public void getBaseType() {
+    assertNull(baseType.getBaseType());
+    assertNotNull(type.getBaseType());
+  }
+
+  @Test
+  public void propertiesBehaviour() {
+    List<String> propertyNames = baseType.getPropertyNames();
+    assertEquals(1, propertyNames.size());
+    assertEquals("prop1", baseType.getProperty("prop1").getName());
+  }
+
+  @Test
+  public void propertiesBehaviourWithBaseType() {
+    List<String> propertyNames = type.getPropertyNames();
+    assertEquals(2, propertyNames.size());
+    assertEquals("prop1", type.getProperty("prop1").getName());
+    assertEquals("prop2", type.getProperty("prop2").getName());
+  }
+
+  @Test
+  public void navigationPropertiesBehaviour() {
+    List<String> navigationPropertyNames = baseType.getNavigationPropertyNames();
+    assertEquals(1, navigationPropertyNames.size());
+    assertEquals("nav1", baseType.getProperty("nav1").getName());
+  }
+
+  @Test
+  public void navigationPropertiesBehaviourWithBaseType() {
+    List<String> navigationPropertyNames = type.getNavigationPropertyNames();
+    assertEquals(2, navigationPropertyNames.size());
+    assertEquals("nav1", type.getProperty("nav1").getName());
+    assertEquals("nav2", type.getProperty("nav2").getName());
+  }
+
+  @Test
+  public void propertyCaching() {
+    EdmElement property = type.getProperty("prop1");
+    assertTrue(property == type.getProperty("prop1"));
+
+    property = type.getProperty("prop2");
+    assertTrue(property == type.getProperty("prop2"));
+
+    property = type.getProperty("nav1");
+    assertTrue(property == type.getProperty("nav1"));
+
+    property = type.getProperty("nav2");
+    assertTrue(property == type.getProperty("nav2"));
+  }
+
+  @Test(expected = EdmException.class)
+  public void nonExistingBaseType() throws Exception {
+    CsdlEdmProvider provider = mock(CsdlEdmProvider.class);
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
+    FullQualifiedName typeWithNonexistingBaseTypeName = new FullQualifiedName("namespace", "typeName");
+    CsdlComplexType complexTypeForNonexistingBaseType =
+        new CsdlComplexType().setBaseType(new FullQualifiedName("wrong", "wrong"));
+    complexTypeForNonexistingBaseType.setName("typeName");
+    when(provider.getComplexType(typeWithNonexistingBaseTypeName)).thenReturn(complexTypeForNonexistingBaseType);
+    EdmComplexTypeImpl instance =
+        new EdmComplexTypeImpl(edm, typeWithNonexistingBaseTypeName, complexTypeForNonexistingBaseType);
+    instance.getBaseType();
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9c1981c4/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImplTest.java
new file mode 100644
index 0000000..82aa145
--- /dev/null
+++ b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityContainerImplTest.java
@@ -0,0 +1,299 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.edm.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.olingo.commons.api.ex.ODataException;
+import org.apache.olingo.commons.api.edm.EdmActionImport;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmFunctionImport;
+import org.apache.olingo.commons.api.edm.EdmSingleton;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.provider.CsdlAbstractEdmProvider;
+import org.apache.olingo.commons.api.edm.provider.CsdlActionImport;
+import org.apache.olingo.commons.api.edm.provider.CsdlEdmProvider;
+import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainer;
+import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainerInfo;
+import org.apache.olingo.commons.api.edm.provider.CsdlEntitySet;
+import org.apache.olingo.commons.api.edm.provider.CsdlFunctionImport;
+import org.apache.olingo.commons.api.edm.provider.CsdlSingleton;
+import org.apache.olingo.commons.core.edm.EdmEntityContainerImpl;
+import org.apache.olingo.commons.core.edm.EdmProviderImpl;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EdmEntityContainerImplTest {
+
+  EdmEntityContainer container;
+
+  @Before
+  public void setup() {
+    CsdlEdmProvider provider = new CustomProvider();
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
+    CsdlEntityContainerInfo entityContainerInfo =
+        new CsdlEntityContainerInfo().setContainerName(new FullQualifiedName("space", "name"));
+    container = new EdmEntityContainerImpl(edm, provider, entityContainerInfo);
+  }
+
+  @Test
+  public void getAllEntitySetInitial() {
+    List<EdmEntitySet> entitySets = container.getEntitySets();
+    assertNotNull(entitySets);
+    assertEquals(2, entitySets.size());
+  }
+
+  @Test
+  public void getAllEntitySetsAfterOneWasAlreadyLoaded() {
+    container.getEntitySet("entitySetName");
+    List<EdmEntitySet> entitySets = container.getEntitySets();
+    assertNotNull(entitySets);
+    assertEquals(2, entitySets.size());
+  }
+
+  @Test
+  public void getAllSingletonsInitial() {
+    List<EdmSingleton> singletons = container.getSingletons();
+    assertNotNull(singletons);
+    assertEquals(2, singletons.size());
+  }
+
+  @Test
+  public void getAllSingletonsAfterOneWasAlreadyLoaded() {
+    container.getSingleton("singletonName");
+    List<EdmSingleton> singletons = container.getSingletons();
+    assertNotNull(singletons);
+    assertEquals(2, singletons.size());
+  }
+
+  @Test
+  public void getAllActionImportsInitial() {
+    List<EdmActionImport> actionImports = container.getActionImports();
+    assertNotNull(actionImports);
+    assertEquals(2, actionImports.size());
+  }
+
+  @Test
+  public void getAllActionImportsAfterOneWasAlreadyLoaded() {
+    container.getActionImport("actionImportName");
+    List<EdmActionImport> actionImports = container.getActionImports();
+    assertNotNull(actionImports);
+    assertEquals(2, actionImports.size());
+  }
+
+  @Test
+  public void getAllFunctionImportsInitial() {
+    List<EdmFunctionImport> functionImports = container.getFunctionImports();
+    assertNotNull(functionImports);
+    assertEquals(2, functionImports.size());
+  }
+
+  @Test
+  public void getAllFunctionImportsAfterOneWasAlreadyLoaded() {
+    container.getFunctionImport("functionImportName");
+    List<EdmFunctionImport> functionImports = container.getFunctionImports();
+    assertNotNull(functionImports);
+    assertEquals(2, functionImports.size());
+  }
+
+  @Test
+  public void checkEdmExceptionConversion() throws Exception {
+    CsdlEdmProvider provider = mock(CsdlEdmProvider.class);
+    FullQualifiedName containerName = new FullQualifiedName("space", "name");
+    when(provider.getEntitySet(containerName, null)).thenThrow(new ODataException("msg"));
+    when(provider.getSingleton(containerName, null)).thenThrow(new ODataException("msg"));
+    when(provider.getFunctionImport(containerName, null)).thenThrow(new ODataException("msg"));
+    when(provider.getActionImport(containerName, null)).thenThrow(new ODataException("msg"));
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
+    CsdlEntityContainerInfo entityContainerInfo =
+        new CsdlEntityContainerInfo().setContainerName(containerName);
+    EdmEntityContainer container = new EdmEntityContainerImpl(edm, provider, entityContainerInfo);
+    boolean thrown = false;
+    try {
+      container.getEntitySet(null);
+    } catch (EdmException e) {
+      thrown = true;
+    }
+    if (!thrown) {
+      fail("Expected EdmException not thrown");
+    }
+    try {
+      container.getSingleton(null);
+    } catch (EdmException e) {
+      thrown = true;
+    }
+    if (!thrown) {
+      fail("Expected EdmException not thrown");
+    }
+    try {
+      container.getActionImport(null);
+    } catch (EdmException e) {
+      thrown = true;
+    }
+    if (!thrown) {
+      fail("Expected EdmException not thrown");
+    }
+    try {
+      container.getFunctionImport(null);
+    } catch (EdmException e) {
+      thrown = true;
+    }
+    if (!thrown) {
+      fail("Expected EdmException not thrown");
+    }
+  }
+
+  @Test
+  public void simpleContainerGetter() {
+    assertEquals("name", container.getName());
+    assertEquals("space", container.getNamespace());
+  }
+
+  @Test
+  public void getExistingFunctionImport() {
+    EdmFunctionImport functionImport = container.getFunctionImport("functionImportName");
+    assertNotNull(functionImport);
+    assertEquals("functionImportName", functionImport.getName());
+    // Caching
+    assertTrue(functionImport == container.getFunctionImport("functionImportName"));
+  }
+
+  @Test
+  public void getNonExistingFunctionImport() {
+    assertNull(container.getFunctionImport(null));
+  }
+
+  @Test
+  public void getExistingActionImport() {
+    EdmActionImport actionImport = container.getActionImport("actionImportName");
+    assertNotNull(actionImport);
+    assertEquals("actionImportName", actionImport.getName());
+    // Caching
+    assertTrue(actionImport == container.getActionImport("actionImportName"));
+  }
+
+  @Test
+  public void getNonExistingActionImport() {
+    assertNull(container.getActionImport(null));
+  }
+
+  @Test
+  public void getExistingSingleton() {
+    EdmSingleton singleton = container.getSingleton("singletonName");
+    assertNotNull(singleton);
+    assertEquals("singletonName", singleton.getName());
+    // Caching
+    assertTrue(singleton == container.getSingleton("singletonName"));
+  }
+
+  @Test
+  public void getNonExistingSingleton() {
+    assertNull(container.getSingleton(null));
+  }
+
+  @Test
+  public void getExistingEntitySet() {
+    EdmEntitySet entitySet = container.getEntitySet("entitySetName");
+    assertNotNull(entitySet);
+    assertEquals("entitySetName", entitySet.getName());
+    // Caching
+    assertTrue(entitySet == container.getEntitySet("entitySetName"));
+  }
+
+  @Test
+  public void getNonExistingEntitySet() {
+    assertNull(container.getEntitySet(null));
+  }
+
+  private class CustomProvider extends CsdlAbstractEdmProvider {
+    @Override
+    public CsdlEntitySet getEntitySet(final FullQualifiedName entityContainer, final String entitySetName)
+        throws ODataException {
+      if (entitySetName != null) {
+        return new CsdlEntitySet().setName("entitySetName");
+      }
+      return null;
+    }
+
+    @Override
+    public CsdlSingleton getSingleton(final FullQualifiedName entityContainer, final String singletonName)
+        throws ODataException {
+      if (singletonName != null) {
+        return new CsdlSingleton().setName("singletonName");
+      }
+      return null;
+    }
+
+    @Override
+    public CsdlActionImport getActionImport(final FullQualifiedName entityContainer, final String actionImportName)
+        throws ODataException {
+      if (actionImportName != null) {
+        return new CsdlActionImport().setName("actionImportName");
+      }
+      return null;
+    }
+
+    @Override
+    public CsdlFunctionImport getFunctionImport(final FullQualifiedName entityContainer,
+        final String functionImportName)
+        throws ODataException {
+      if (functionImportName != null) {
+        return new CsdlFunctionImport().setName("functionImportName");
+      }
+      return null;
+    }
+
+    @Override
+    public CsdlEntityContainer getEntityContainer() throws ODataException {
+      CsdlEntityContainer container = new CsdlEntityContainer();
+      List<CsdlEntitySet> entitySets = new ArrayList<CsdlEntitySet>();
+      entitySets.add(new CsdlEntitySet().setName("entitySetName"));
+      entitySets.add(new CsdlEntitySet().setName("entitySetName2"));
+      container.setEntitySets(entitySets);
+
+      List<CsdlSingleton> singletons = new ArrayList<CsdlSingleton>();
+      singletons.add(new CsdlSingleton().setName("singletonName"));
+      singletons.add(new CsdlSingleton().setName("singletonName2"));
+      container.setSingletons(singletons);
+
+      List<CsdlActionImport> actionImports = new ArrayList<CsdlActionImport>();
+      actionImports.add(new CsdlActionImport().setName("actionImportName"));
+      actionImports.add(new CsdlActionImport().setName("actionImportName2"));
+      container.setActionImports(actionImports);
+
+      List<CsdlFunctionImport> functionImports = new ArrayList<CsdlFunctionImport>();
+      functionImports.add(new CsdlFunctionImport().setName("functionImportName"));
+      functionImports.add(new CsdlFunctionImport().setName("functionImportName2"));
+      container.setFunctionImports(functionImports);
+
+      return container;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9c1981c4/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntitySetImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntitySetImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntitySetImplTest.java
new file mode 100644
index 0000000..b80e59d
--- /dev/null
+++ b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntitySetImplTest.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.edm.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+
+import org.apache.olingo.commons.api.edm.EdmBindingTarget;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.commons.api.edm.EdmEntityType;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.provider.CsdlEdmProvider;
+import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainerInfo;
+import org.apache.olingo.commons.api.edm.provider.CsdlEntitySet;
+import org.apache.olingo.commons.api.edm.provider.CsdlEntityType;
+import org.apache.olingo.commons.api.edm.provider.CsdlNavigationPropertyBinding;
+import org.apache.olingo.commons.api.edm.provider.CsdlPropertyRef;
+import org.apache.olingo.commons.core.edm.EdmEntityContainerImpl;
+import org.apache.olingo.commons.core.edm.EdmEntitySetImpl;
+import org.apache.olingo.commons.core.edm.EdmProviderImpl;
+import org.junit.Test;
+
+public class EdmEntitySetImplTest {
+
+  @Test
+  public void entitySet() throws Exception {
+    CsdlEdmProvider provider = mock(CsdlEdmProvider.class);
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
+
+    final FullQualifiedName typeName = new FullQualifiedName("ns", "entityType");
+    final CsdlEntityType entityTypeProvider = new CsdlEntityType()
+        .setName(typeName.getName())
+        .setKey(Arrays.asList(new CsdlPropertyRef().setName("Id")));
+    when(provider.getEntityType(typeName)).thenReturn(entityTypeProvider);
+
+    final FullQualifiedName containerName = new FullQualifiedName("ns", "container");
+    final CsdlEntityContainerInfo containerInfo = new CsdlEntityContainerInfo().setContainerName(containerName);
+    when(provider.getEntityContainerInfo(containerName)).thenReturn(containerInfo);
+    final EdmEntityContainer entityContainer = new EdmEntityContainerImpl(edm, provider, containerInfo);
+
+    final String entitySetName = "entitySet";
+    final CsdlEntitySet entitySetProvider = new CsdlEntitySet()
+        .setName(entitySetName)
+        .setType(typeName)
+        .setIncludeInServiceDocument(true)
+        .setNavigationPropertyBindings(Arrays.asList(
+            new CsdlNavigationPropertyBinding().setPath("path")
+                .setTarget(containerName.getFullQualifiedNameAsString() + "/" + entitySetName)));
+    when(provider.getEntitySet(containerName, entitySetName)).thenReturn(entitySetProvider);
+
+    final EdmEntitySet entitySet = new EdmEntitySetImpl(edm, entityContainer, entitySetProvider);
+    assertEquals(entitySetName, entityContainer.getEntitySet(entitySetName).getName());
+    assertEquals(entitySetName, entitySet.getName());
+    final EdmEntityType entityType = entitySet.getEntityType();
+    assertEquals(typeName.getNamespace(), entityType.getNamespace());
+    assertEquals(typeName.getName(), entityType.getName());
+    assertEquals(entityContainer, entitySet.getEntityContainer());
+    assertNull(entitySet.getRelatedBindingTarget(null));
+    final EdmBindingTarget target = entitySet.getRelatedBindingTarget("path");
+    assertEquals(entitySetName, target.getName());
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9c1981c4/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
new file mode 100644
index 0000000..ac36a8a
--- /dev/null
+++ b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
@@ -0,0 +1,391 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.edm.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.olingo.commons.api.edm.EdmComplexType;
+import org.apache.olingo.commons.api.edm.EdmElement;
+import org.apache.olingo.commons.api.edm.EdmEntityType;
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmKeyPropertyRef;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.EdmProperty;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.provider.CsdlComplexType;
+import org.apache.olingo.commons.api.edm.provider.CsdlEdmProvider;
+import org.apache.olingo.commons.api.edm.provider.CsdlEntityType;
+import org.apache.olingo.commons.api.edm.provider.CsdlNavigationProperty;
+import org.apache.olingo.commons.api.edm.provider.CsdlProperty;
+import org.apache.olingo.commons.api.edm.provider.CsdlPropertyRef;
+import org.apache.olingo.commons.core.edm.EdmEntityTypeImpl;
+import org.apache.olingo.commons.core.edm.EdmProviderImpl;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EdmEntityTypeImplTest {
+
+  private EdmEntityType baseType;
+
+  private EdmEntityType typeWithBaseType;
+
+  private EdmEntityType typeWithComplexKey;
+
+  @Before
+  public void setupTypes() throws Exception {
+    CsdlEdmProvider provider = mock(CsdlEdmProvider.class);
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
+
+    FullQualifiedName baseName = new FullQualifiedName("namespace", "BaseTypeName");
+    CsdlEntityType baseType = new CsdlEntityType();
+    baseType.setName(baseName.getName());
+    List<CsdlProperty> properties = new ArrayList<CsdlProperty>();
+    properties.add(new CsdlProperty().setName("Id").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    properties.add(new CsdlProperty().setName("Name").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    baseType.setProperties(properties);
+    List<CsdlPropertyRef> key = new ArrayList<CsdlPropertyRef>();
+    key.add(new CsdlPropertyRef().setName("Id"));
+    baseType.setKey(key);
+    List<CsdlNavigationProperty> navigationProperties = new ArrayList<CsdlNavigationProperty>();
+    navigationProperties.add(new CsdlNavigationProperty().setName("nav1"));
+    baseType.setNavigationProperties(navigationProperties);
+    when(provider.getEntityType(baseName)).thenReturn(baseType);
+
+    this.baseType = new EdmEntityTypeImpl(edm, baseName, baseType);
+
+    FullQualifiedName typeName = new FullQualifiedName("namespace", "typeName");
+    CsdlEntityType type = new CsdlEntityType();
+    type.setName(typeName.getName());
+    type.setBaseType(baseName);
+    List<CsdlProperty> typeProperties = new ArrayList<CsdlProperty>();
+    typeProperties.add(new CsdlProperty().setName("address").setType(
+        EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    typeProperties.add(new CsdlProperty().setName("email").setType(
+        EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    type.setProperties(typeProperties);
+    List<CsdlNavigationProperty> typeNavigationProperties = new ArrayList<CsdlNavigationProperty>();
+    typeNavigationProperties.add(new CsdlNavigationProperty().setName("nav2"));
+    type.setNavigationProperties(typeNavigationProperties);
+    when(provider.getEntityType(typeName)).thenReturn(type);
+
+    typeWithBaseType = new EdmEntityTypeImpl(edm, typeName, type);
+
+    FullQualifiedName typeWithComplexKeyName = new FullQualifiedName("namespace", "typeName");
+    CsdlEntityType typeWithComplexKeyProvider = new CsdlEntityType();
+    typeWithComplexKeyProvider.setName(typeWithComplexKeyName.getName());
+    List<CsdlProperty> typeWithComplexKeyProperties = new ArrayList<CsdlProperty>();
+    typeWithComplexKeyProperties.add(new CsdlProperty().setName("Id").setType(
+        EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+
+    List<CsdlProperty> complexTypeProperties = new ArrayList<CsdlProperty>();
+    complexTypeProperties.add(new CsdlProperty().setName("ComplexPropName").setType(
+        EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    FullQualifiedName complexTypeName = new FullQualifiedName("namespace", "complexTypeName");
+    when(provider.getComplexType(complexTypeName)).thenReturn(
+        new CsdlComplexType().setName("complexTypeName").setProperties(complexTypeProperties));
+
+    typeWithComplexKeyProperties.add(new CsdlProperty().setName("Comp").setType(complexTypeName));
+    typeWithComplexKeyProvider.setProperties(typeWithComplexKeyProperties);
+    List<CsdlPropertyRef> keyForTypeWithComplexKey = new ArrayList<CsdlPropertyRef>();
+    keyForTypeWithComplexKey.add(new CsdlPropertyRef().setName("Id"));
+    keyForTypeWithComplexKey.add(new CsdlPropertyRef().setName("Comp/ComplexPropName").setAlias("alias"));
+    typeWithComplexKeyProvider.setKey(keyForTypeWithComplexKey);
+    when(provider.getEntityType(typeWithComplexKeyName)).thenReturn(typeWithComplexKeyProvider);
+
+    typeWithComplexKey = new EdmEntityTypeImpl(edm, typeWithComplexKeyName, typeWithComplexKeyProvider);
+  }
+
+  @Test
+  public void testAbstractBaseTypeWithoutKey() throws Exception {
+    CsdlEdmProvider provider = mock(CsdlEdmProvider.class);
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
+
+    FullQualifiedName baseName = new FullQualifiedName("namespace", "BaseTypeName");
+    CsdlEntityType baseType = new CsdlEntityType();
+    baseType.setName(baseName.getName());
+    List<CsdlProperty> properties = new ArrayList<CsdlProperty>();
+    properties.add(new CsdlProperty().setName("Id").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    properties.add(new CsdlProperty().setName("Name").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    baseType.setProperties(properties);
+    List<CsdlNavigationProperty> navigationProperties = new ArrayList<CsdlNavigationProperty>();
+    navigationProperties.add(new CsdlNavigationProperty().setName("nav1"));
+    baseType.setNavigationProperties(navigationProperties);
+    when(provider.getEntityType(baseName)).thenReturn(baseType);
+    baseType.setAbstract(true);
+    EdmEntityType edmAbstarctBaseType = new EdmEntityTypeImpl(edm, baseName, baseType);
+
+    assertEquals(2, edmAbstarctBaseType.getPropertyNames().size());
+    assertEquals("Id", edmAbstarctBaseType.getPropertyNames().get(0));
+    assertEquals("Name", edmAbstarctBaseType.getPropertyNames().get(1));
+
+    FullQualifiedName typeName = new FullQualifiedName("namespace", "typeName");
+    CsdlEntityType type = new CsdlEntityType();
+    type.setName(typeName.getName());
+    type.setBaseType(baseName);
+    List<CsdlProperty> typeProperties = new ArrayList<CsdlProperty>();
+    typeProperties.add(new CsdlProperty().setName("address").setType(
+        EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    typeProperties.add(new CsdlProperty().setName("email").setType(
+        EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    type.setProperties(typeProperties);
+    List<CsdlPropertyRef> key = new ArrayList<CsdlPropertyRef>();
+    key.add(new CsdlPropertyRef().setName("email"));
+    type.setKey(key);
+    List<CsdlNavigationProperty> typeNavigationProperties = new ArrayList<CsdlNavigationProperty>();
+    typeNavigationProperties.add(new CsdlNavigationProperty().setName("nav2"));
+    type.setNavigationProperties(typeNavigationProperties);
+    when(provider.getEntityType(typeName)).thenReturn(type);
+
+    EdmEntityType edmType = new EdmEntityTypeImpl(edm, typeName, type);
+
+    assertNotNull(edmType.getBaseType());
+    assertEquals(2, edmAbstarctBaseType.getPropertyNames().size());
+
+    assertEquals(1, edmType.getKeyPropertyRefs().size());
+    assertEquals("email", edmType.getKeyPredicateNames().get(0));
+
+    assertEquals(4, edmType.getPropertyNames().size());
+    assertEquals("Id", edmType.getPropertyNames().get(0));
+    assertEquals("Name", edmType.getPropertyNames().get(1));
+    assertEquals("address", edmType.getPropertyNames().get(2));
+    assertEquals("email", edmType.getPropertyNames().get(3));
+
+    assertEquals(2, edmType.getNavigationPropertyNames().size());
+    assertEquals("nav1", edmType.getNavigationPropertyNames().get(0));
+    assertEquals("nav2", edmType.getNavigationPropertyNames().get(1));
+  }
+
+  @Test
+  public void testAbstractBaseTypeWithtKey() throws Exception {
+    CsdlEdmProvider provider = mock(CsdlEdmProvider.class);
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
+
+    FullQualifiedName baseName = new FullQualifiedName("namespace", "BaseTypeName");
+    CsdlEntityType baseType = new CsdlEntityType();
+    baseType.setName(baseName.getName());
+    List<CsdlProperty> properties = new ArrayList<CsdlProperty>();
+    properties.add(new CsdlProperty().setName("Id").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    properties.add(new CsdlProperty().setName("Name").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    baseType.setProperties(properties);
+    List<CsdlPropertyRef> key = new ArrayList<CsdlPropertyRef>();
+    key.add(new CsdlPropertyRef().setName("Id"));
+    baseType.setKey(key);
+    List<CsdlNavigationProperty> navigationProperties = new ArrayList<CsdlNavigationProperty>();
+    navigationProperties.add(new CsdlNavigationProperty().setName("nav1"));
+    baseType.setNavigationProperties(navigationProperties);
+    when(provider.getEntityType(baseName)).thenReturn(baseType);
+    baseType.setAbstract(true);
+    EdmEntityType edmAbstarctBaseType = new EdmEntityTypeImpl(edm, baseName, baseType);
+
+    FullQualifiedName typeName = new FullQualifiedName("namespace", "typeName");
+    CsdlEntityType type = new CsdlEntityType();
+    type.setName(typeName.getName());
+    type.setBaseType(baseName);
+    List<CsdlProperty> typeProperties = new ArrayList<CsdlProperty>();
+    typeProperties.add(new CsdlProperty().setName("address").setType(
+        EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    typeProperties.add(new CsdlProperty().setName("email").setType(
+        EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    type.setProperties(typeProperties);
+    List<CsdlNavigationProperty> typeNavigationProperties = new ArrayList<CsdlNavigationProperty>();
+    typeNavigationProperties.add(new CsdlNavigationProperty().setName("nav2"));
+    type.setNavigationProperties(typeNavigationProperties);
+    when(provider.getEntityType(typeName)).thenReturn(type);
+    EdmEntityType edmType = new EdmEntityTypeImpl(edm, typeName, type);
+
+    assertNotNull(edmType.getBaseType());
+    assertEquals(2, edmAbstarctBaseType.getPropertyNames().size());
+
+    assertEquals(1, edmType.getKeyPropertyRefs().size());
+    assertEquals("Id", edmType.getKeyPredicateNames().get(0));
+
+    assertEquals(4, edmType.getPropertyNames().size());
+    assertEquals("Id", edmType.getPropertyNames().get(0));
+    assertEquals("Name", edmType.getPropertyNames().get(1));
+    assertEquals("address", edmType.getPropertyNames().get(2));
+    assertEquals("email", edmType.getPropertyNames().get(3));
+
+    assertEquals(2, edmType.getNavigationPropertyNames().size());
+    assertEquals("nav1", edmType.getNavigationPropertyNames().get(0));
+    assertEquals("nav2", edmType.getNavigationPropertyNames().get(1));
+  }
+
+  @Test
+  public void hasStream() {
+    assertFalse(typeWithBaseType.hasStream());
+  }
+
+  @Test
+  public void complexKeyWithAlias() {
+    List<String> keyPredicateNames = typeWithComplexKey.getKeyPredicateNames();
+    assertEquals(2, keyPredicateNames.size());
+    assertEquals("Id", keyPredicateNames.get(0));
+    assertEquals("alias", keyPredicateNames.get(1));
+
+    EdmKeyPropertyRef keyPropertyRef = typeWithComplexKey.getKeyPropertyRef("Id");
+    assertNotNull(keyPropertyRef);
+    assertEquals("Id", keyPropertyRef.getName());
+    assertNull(keyPropertyRef.getAlias());
+    EdmProperty keyProperty = keyPropertyRef.getProperty();
+    assertNotNull(keyProperty);
+    assertEquals(typeWithComplexKey.getProperty("Id"), keyProperty);
+
+    keyPropertyRef = typeWithComplexKey.getKeyPropertyRef("alias");
+    assertNotNull(keyPropertyRef);
+    assertEquals("Comp/ComplexPropName", keyPropertyRef.getName());
+    assertEquals("alias", keyPropertyRef.getAlias());
+
+    keyProperty = keyPropertyRef.getProperty();
+    assertNotNull(keyProperty);
+    EdmElement complexProperty = typeWithComplexKey.getProperty("Comp");
+    EdmComplexType complexType = (EdmComplexType) complexProperty.getType();
+    assertNotNull(complexType);
+    assertEquals(complexType.getProperty("ComplexPropName"), keyProperty);
+  }
+
+  @Test
+  public void keyBehaviour() {
+    List<String> keyPredicateNames = baseType.getKeyPredicateNames();
+    assertEquals(1, keyPredicateNames.size());
+    assertEquals("Id", keyPredicateNames.get(0));
+
+    EdmKeyPropertyRef keyPropertyRef = baseType.getKeyPropertyRef("Id");
+    assertNotNull(keyPropertyRef);
+    assertEquals("Id", keyPropertyRef.getName());
+    assertNull(keyPropertyRef.getAlias());
+
+    EdmProperty keyProperty = keyPropertyRef.getProperty();
+    assertNotNull(keyProperty);
+    assertEquals(baseType.getProperty("Id"), keyProperty);
+
+    List<EdmKeyPropertyRef> keyPropertyRefs = baseType.getKeyPropertyRefs();
+    assertNotNull(keyPropertyRefs);
+    assertEquals(1, keyPropertyRefs.size());
+    assertEquals("Id", keyPropertyRefs.get(0).getName());
+  }
+
+  @Test
+  public void keyBehaviourWithBasetype() {
+    List<String> keyPredicateNames = typeWithBaseType.getKeyPredicateNames();
+    assertEquals(1, keyPredicateNames.size());
+    assertEquals("Id", keyPredicateNames.get(0));
+
+    EdmKeyPropertyRef keyPropertyRef = typeWithBaseType.getKeyPropertyRef("Id");
+    assertNotNull(keyPropertyRef);
+    assertEquals("Id", keyPropertyRef.getName());
+    assertNull(keyPropertyRef.getAlias());
+
+    List<EdmKeyPropertyRef> keyPropertyRefs = typeWithBaseType.getKeyPropertyRefs();
+    assertNotNull(keyPropertyRefs);
+    assertEquals(1, keyPropertyRefs.size());
+    assertEquals("Id", keyPropertyRefs.get(0).getName());
+    for (int i = 0; i < keyPropertyRefs.size(); i++) {
+      assertEquals(keyPropertyRefs.get(i).getName(), typeWithBaseType.getKeyPropertyRefs().get(i).getName());
+    }
+  }
+
+  @Test
+  public void getBaseType() {
+    assertNull(baseType.getBaseType());
+    assertNotNull(typeWithBaseType.getBaseType());
+  }
+
+  @Test
+  public void propertiesBehaviour() {
+    List<String> propertyNames = baseType.getPropertyNames();
+    assertEquals(2, propertyNames.size());
+    assertEquals("Id", baseType.getProperty("Id").getName());
+    assertEquals("Name", baseType.getProperty("Name").getName());
+  }
+
+  @Test
+  public void propertiesBehaviourWithBaseType() {
+    List<String> propertyNames = typeWithBaseType.getPropertyNames();
+    assertEquals(4, propertyNames.size());
+    assertEquals("Id", typeWithBaseType.getProperty("Id").getName());
+    assertEquals("Name", typeWithBaseType.getProperty("Name").getName());
+    assertEquals("address", typeWithBaseType.getProperty("address").getName());
+    assertEquals("email", typeWithBaseType.getProperty("email").getName());
+  }
+
+  @Test
+  public void navigationPropertiesBehaviour() {
+    List<String> navigationPropertyNames = baseType.getNavigationPropertyNames();
+    assertEquals(1, navigationPropertyNames.size());
+    assertEquals("nav1", baseType.getProperty("nav1").getName());
+  }
+
+  @Test
+  public void navigationPropertiesBehaviourWithBaseType() {
+    List<String> navigationPropertyNames = typeWithBaseType.getNavigationPropertyNames();
+    assertEquals(2, navigationPropertyNames.size());
+    assertEquals("nav1", typeWithBaseType.getProperty("nav1").getName());
+    assertEquals("nav2", typeWithBaseType.getProperty("nav2").getName());
+  }
+
+  @Test
+  public void propertyCaching() {
+    EdmElement property = typeWithBaseType.getProperty("Id");
+    assertTrue(property == typeWithBaseType.getProperty("Id"));
+
+    property = typeWithBaseType.getProperty("address");
+    assertTrue(property == typeWithBaseType.getProperty("address"));
+
+    property = typeWithBaseType.getProperty("nav1");
+    assertTrue(property == typeWithBaseType.getProperty("nav1"));
+
+    property = typeWithBaseType.getProperty("nav2");
+    assertTrue(property == typeWithBaseType.getProperty("nav2"));
+  }
+
+  @Test
+  public void abstractTypeDoesNotNeedKey() {
+    EdmProviderImpl edm = mock(EdmProviderImpl.class);
+    CsdlEntityType entityType = new CsdlEntityType().setName("n").setAbstract(true);
+    new EdmEntityTypeImpl(edm, new FullQualifiedName("n", "n"), entityType);
+  }
+
+  @Test(expected = EdmException.class)
+  public void invalidBaseType() {
+    EdmProviderImpl edm = mock(EdmProviderImpl.class);
+    CsdlEntityType entityType = new CsdlEntityType().setName("n").setBaseType(new FullQualifiedName("wrong", "wrong"));
+    EdmEntityTypeImpl instance = new EdmEntityTypeImpl(edm, new FullQualifiedName("n", "n"), entityType);
+    instance.getBaseType();
+  }
+
+  @Test
+  public void abstractTypeWithAbstractBaseTypeDoesNotNeedKey() throws Exception {
+    CsdlEdmProvider provider = mock(CsdlEdmProvider.class);
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
+    FullQualifiedName baseName = new FullQualifiedName("n", "base");
+    when(provider.getEntityType(baseName)).thenReturn(new CsdlEntityType().setName("base").setAbstract(true));
+    CsdlEntityType entityType = new CsdlEntityType().setName("n").setAbstract(true).setBaseType(baseName);
+    new EdmEntityTypeImpl(edm, new FullQualifiedName("n", "n"), entityType);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9c1981c4/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEnumTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEnumTest.java b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEnumTest.java
new file mode 100644
index 0000000..25dcb03
--- /dev/null
+++ b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEnumTest.java
@@ -0,0 +1,372 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.edm.provider;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmEnumType;
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
+import org.apache.olingo.commons.api.edm.provider.CsdlEnumMember;
+import org.apache.olingo.commons.api.edm.provider.CsdlEnumType;
+import org.apache.olingo.commons.core.edm.EdmEnumTypeImpl;
+import org.apache.olingo.commons.core.edm.EdmProviderImpl;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class EdmEnumTest {
+
+  private final EdmEnumType instance;
+  private final EdmEnumType otherInstance;
+  private final EdmEnumType nonFlagsInstance;
+  private final EdmEnumType int16EnumType;
+  private final EdmEnumType int32EnumType;
+  private final EdmEnumType int32FlagType;
+
+  public EdmEnumTest() {
+    final List<CsdlEnumMember> memberList = Arrays.asList(
+        new CsdlEnumMember().setName("first").setValue("1"),
+        new CsdlEnumMember().setName("second").setValue("64"));
+
+    final FullQualifiedName enumName = new FullQualifiedName("namespace", "name");
+
+    instance = new EdmEnumTypeImpl(mock(EdmProviderImpl.class), enumName,
+        new CsdlEnumType().setName("name").setMembers(memberList).setFlags(true)
+            .setUnderlyingType(EdmPrimitiveTypeKind.SByte.getFullQualifiedName()));
+    
+    otherInstance = new EdmEnumTypeImpl(mock(EdmProviderImpl.class), enumName,
+        new CsdlEnumType().setName("name").setMembers(memberList).setFlags(true)
+            .setUnderlyingType(EdmPrimitiveTypeKind.SByte.getFullQualifiedName()));
+
+    nonFlagsInstance = new EdmEnumTypeImpl(mock(EdmProviderImpl.class), enumName,
+        new CsdlEnumType().setName("name").setMembers(memberList).setFlags(false)
+            .setUnderlyingType(EdmPrimitiveTypeKind.SByte.getFullQualifiedName()));
+
+    int16EnumType = new EdmEnumTypeImpl(Mockito.mock(Edm.class),
+        new FullQualifiedName("testNamespace", "testName"), new CsdlEnumType()
+    .setName("MyEnum")
+    .setFlags(false)
+    .setUnderlyingType(EdmPrimitiveTypeKind.Int16.getFullQualifiedName())
+    .setMembers(
+        Arrays.asList(
+            new CsdlEnumMember().setName("A")
+            .setValue("0"),
+            new CsdlEnumMember().setName("B")
+            .setValue("1"),
+            new CsdlEnumMember().setName("C")
+            .setValue("2"))));
+
+    int32EnumType =
+        new EdmEnumTypeImpl(Mockito.mock(Edm.class),
+            new FullQualifiedName("testNamespace", "testName"), new CsdlEnumType()
+        .setName("MyEnum")
+        .setFlags(false)
+        .setUnderlyingType(EdmPrimitiveTypeKind.Int32.getFullQualifiedName())
+        .setMembers(
+            Arrays
+            .asList(new CsdlEnumMember().setName("A").setValue("0"), new CsdlEnumMember().setName("B")
+                .setValue("1"),
+                new CsdlEnumMember().setName("C").setValue("2"))));
+
+    int32FlagType =
+        new EdmEnumTypeImpl(Mockito.mock(Edm.class),
+            new FullQualifiedName("testNamespace", "testName"), new CsdlEnumType()
+        .setName("MyEnum")
+        .setFlags(true)
+        .setUnderlyingType(EdmPrimitiveTypeKind.Int32.getFullQualifiedName())
+        .setMembers(
+            Arrays
+            .asList(new CsdlEnumMember().setName("A").setValue("2"), new CsdlEnumMember().setName("B")
+                .setValue("4"),
+                new CsdlEnumMember().setName("C").setValue("8"))));
+  }
+
+  @Test
+  public void nameSpace() throws Exception {
+    assertEquals("namespace", instance.getNamespace());
+  }
+
+  @Test
+  public void name() throws Exception {
+    assertEquals("name", instance.getName());
+  }
+
+  @Test
+  public void kind() throws Exception {
+    assertEquals(EdmTypeKind.ENUM, instance.getKind());
+  }
+
+  @Test
+  public void compatibility() {
+    assertTrue(instance.isCompatible(instance));
+    assertTrue(instance.isCompatible(otherInstance));
+    assertFalse(instance.isCompatible(instance.getUnderlyingType()));
+  }
+
+  @Test
+  public void defaultType() throws Exception {
+    assertEquals(Byte.class, instance.getDefaultType());
+    EdmEnumType instance = new EdmEnumTypeImpl(Mockito.mock(Edm.class),
+        new FullQualifiedName("testNamespace", "testName"),
+        new CsdlEnumType()
+            .setName("MyEnum"));
+    assertEquals(Integer.class, instance.getUnderlyingType().getDefaultType());
+  }
+
+  @Test
+  public void members() throws Exception {
+    assertArrayEquals(new String[] { "first", "second" }, instance.getMemberNames().toArray());
+    assertEquals("64", instance.getMember("second").getValue());
+    assertNull(instance.getMember("notExisting"));
+  }
+
+  @Test
+  public void underlyingType() throws Exception {
+    assertEquals(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.SByte), instance.getUnderlyingType());
+  }
+
+  @Test
+  public void validate() throws Exception {
+    assertTrue(instance.validate(null, null, null, null, null, null));
+    assertTrue(instance.validate(null, true, null, null, null, null));
+    assertFalse(instance.validate(null, false, null, null, null, null));
+    assertFalse(instance.validate("", null, null, null, null, null));
+    assertFalse(instance.validate("something", null, null, null, null, null));
+
+    assertTrue(instance.validate("second", null, null, null, null, null));
+    assertTrue(instance.validate("first,second", null, null, null, null, null));
+    assertTrue(instance.validate("64", null, null, null, null, null));
+    assertTrue(instance.validate("1,64", null, null, null, null, null));
+  }
+
+  @Test
+  public void toUriLiteral() throws Exception {
+    assertNull(instance.toUriLiteral(null));
+    assertEquals("namespace.name'first'", instance.toUriLiteral("first"));
+  }
+
+  @Test
+  public void fromUriLiteral() throws Exception {
+    assertNull(instance.fromUriLiteral(null));
+    assertEquals("first", instance.fromUriLiteral("namespace.name'first'"));
+
+    expectErrorInFromUriLiteral(instance, "");
+    expectErrorInFromUriLiteral(instance, "name'first'");
+    expectErrorInFromUriLiteral(instance, "namespace.name'first");
+    expectErrorInFromUriLiteral(instance, "namespace.namespace'first");
+  }
+
+  @Test
+  public void valueToString() throws Exception {
+    assertNull(instance.valueToString(null, null, null, null, null, null));
+    assertNull(instance.valueToString(null, true, null, null, null, null));
+    assertEquals("first", instance.valueToString(1, null, null, null, null, null));
+    assertEquals("first", instance.valueToString((byte) 1, null, null, null, null, null));
+    assertEquals("first", instance.valueToString((short) 1, null, null, null, null, null));
+    assertEquals("second", instance.valueToString(Integer.valueOf(64), null, null, null, null, null));
+    assertEquals("second", instance.valueToString(64L, null, null, null, null, null));
+    assertEquals("first,second", instance.valueToString(65, null, null, null, null, null));
+
+    expectNullErrorInValueToString(instance);
+    expectContentErrorInValueToString(instance, 3);
+    expectTypeErrorInValueToString(instance, 1.0);
+
+    assertEquals("A", int32EnumType.valueToString(0, false, 0, 0, 0, false));
+    assertEquals("B", int32EnumType.valueToString(1, false, 0, 0, 0, false));
+    assertEquals("C", int32EnumType.valueToString(2, false, 0, 0, 0, false));
+
+    assertEquals("A", int16EnumType.valueToString(0, false, 0, 0, 0, false));
+    assertEquals("B", int16EnumType.valueToString(1, false, 0, 0, 0, false));
+    assertEquals("C", int16EnumType.valueToString(2, false, 0, 0, 0, false));
+
+    assertEquals("A", int32FlagType.valueToString(2, false, 0, 0, 0, false));
+    assertEquals("B", int32FlagType.valueToString(4, false, 0, 0, 0, false));
+    assertEquals("C", int32FlagType.valueToString(8, false, 0, 0, 0, false));
+    assertEquals("A,B", int32FlagType.valueToString(0x2 + 0x4, false, 0, 0, 0, false));
+    assertEquals("B,C", int32FlagType.valueToString(0x4 + 0x8, false, 0, 0, 0, false));
+  }
+
+  @Test
+  public void valueOfString() throws Exception {
+    assertNull(instance.valueOfString(null, null, null, null, null, null, Byte.class));
+    assertNull(instance.valueOfString(null, true, null, null, null, null, Byte.class));
+    assertEquals(Short.valueOf((short) 1), instance.valueOfString("1", null, null, null, null, null, Short.class));
+    assertEquals(Integer.valueOf(1), instance.valueOfString("1", null, null, null, null, null, Integer.class));
+    assertEquals(Long.valueOf(64L), instance.valueOfString("64", null, null, null, null, null, Long.class));
+    assertEquals(Long.valueOf(1), instance.valueOfString("first", null, null, null, null, null, Long.class));
+    assertEquals(Byte.valueOf((byte) 65), instance.valueOfString("first,64", null, null, null, null, null, Byte.class));
+    assertEquals(Integer.valueOf(1), instance.valueOfString("1,1,first", null, null, null, null, null, Integer.class));
+
+    assertEquals(Integer.valueOf(1), nonFlagsInstance.valueOfString("1", null, null, null, null, null, Integer.class));
+    expectContentErrorInValueOfString(nonFlagsInstance, "1,64");
+
+    expectNullErrorInValueOfString(instance);
+    expectContentErrorInValueOfString(instance, "2");
+    expectContentErrorInValueOfString(instance, "1,");
+    expectContentErrorInValueOfString(instance, ",1");
+    expectTypeErrorInValueOfString(instance, "1");
+
+    assertEquals(Integer.valueOf(0), int32EnumType.valueOfString("A", null, null, null, null, null, Integer.class));
+    assertEquals(Integer.valueOf(1), int32EnumType.valueOfString("B", null, null, null, null, null, Integer.class));
+    assertEquals(Integer.valueOf(2), int32EnumType.valueOfString("C", null, null, null, null, null, Integer.class));
+
+    assertEquals(Integer.valueOf(0), int16EnumType.valueOfString("A", null, null, null, null, null, Integer.class));
+    assertEquals(Integer.valueOf(1), int16EnumType.valueOfString("B", null, null, null, null, null, Integer.class));
+    assertEquals(Integer.valueOf(2), int16EnumType.valueOfString("C", null, null, null, null, null, Integer.class));
+
+    assertEquals(Integer.valueOf(2), int32FlagType.valueOfString("A", null, null, null, null, null, Integer.class));
+    assertEquals(Integer.valueOf(4), int32FlagType.valueOfString("B", null, null, null, null, null, Integer.class));
+    assertEquals(Integer.valueOf(8), int32FlagType.valueOfString("C", null, null, null, null, null, Integer.class));
+    assertEquals(Integer.valueOf(0x2 + 0x4), int32FlagType.valueOfString("A,B", null, null, null, null, null,
+        Integer.class));
+    assertEquals(Integer.valueOf(0x4 + 0x8), int32FlagType.valueOfString("B,C", null, null, null, null, null,
+        Integer.class));
+    assertEquals(Integer.valueOf(0x2 + 0x4), int32FlagType.valueOfString("B,A", null, null, null, null, null,
+        Integer.class));
+  }
+
+  private void expectErrorInValueToString(final EdmEnumType instance,
+      final Object value, final Boolean isNullable, final Integer maxLength,
+      final Integer precision, final Integer scale, final Boolean isUnicode,
+      final String message) {
+    try {
+      instance.valueToString(value, isNullable, maxLength, precision, scale, isUnicode);
+      fail("Expected exception not thrown");
+    } catch (final EdmPrimitiveTypeException e) {
+      assertNotNull(e.getLocalizedMessage());
+      assertThat(e.getLocalizedMessage(), containsString(message));
+    }
+  }
+
+  private void expectErrorInUnderlyingType(
+      final EdmPrimitiveTypeKind underlyingType,
+      final String message) {
+    try {
+      new EdmEnumTypeImpl(Mockito.mock(Edm.class),
+          new FullQualifiedName("testNamespace", "testName"),
+          new CsdlEnumType()
+              .setName("MyEnum")
+              .setFlags(false)
+              .setUnderlyingType(underlyingType.getFullQualifiedName())
+              .setMembers(
+                  Arrays.asList(
+                      new CsdlEnumMember().setName("A")
+                          .setValue("0"))));
+      fail("Expected exception not thrown");
+    } catch (final EdmException e) {
+      assertNotNull(e.getLocalizedMessage());
+      assertThat(e.getLocalizedMessage(), containsString(message));
+    }
+  }
+
+  @Test
+  public void unsupportedUnderlyingType() throws Exception {
+    // Test some random unsupported types
+    expectErrorInUnderlyingType(EdmPrimitiveTypeKind.Date, "");
+    expectErrorInUnderlyingType(EdmPrimitiveTypeKind.Geography, "");
+    expectErrorInUnderlyingType(EdmPrimitiveTypeKind.Guid, "");
+  }
+
+  @Test
+  public void outOfRangeValueToString() throws Exception {
+    expectErrorInValueToString(int16EnumType, Integer.MAX_VALUE, null, null, null, null, null, "");
+  }
+
+  protected void expectErrorInFromUriLiteral(final EdmPrimitiveType instance, final String value) {
+    try {
+      instance.fromUriLiteral(value);
+      fail("Expected exception not thrown");
+    } catch (final EdmPrimitiveTypeException e) {
+      assertNotNull(e.getLocalizedMessage());
+      assertThat(e.getLocalizedMessage(), containsString("' has illegal content."));
+    }
+  }
+
+  private void expectErrorInValueToString(final EdmPrimitiveType instance,
+      final Object value, final Boolean isNullable, final Integer maxLength,
+      final Integer precision, final Integer scale, final Boolean isUnicode,
+      final String message) {
+    try {
+      instance.valueToString(value, isNullable, maxLength, precision, scale, isUnicode);
+      fail("Expected exception not thrown");
+    } catch (final EdmPrimitiveTypeException e) {
+      assertNotNull(e.getLocalizedMessage());
+      assertThat(e.getLocalizedMessage(), containsString(message));
+    }
+  }
+
+  protected void expectNullErrorInValueToString(final EdmPrimitiveType instance) {
+    expectErrorInValueToString(instance, null, false, null, null, null, null, "The value NULL is not allowed.");
+  }
+
+  protected void expectTypeErrorInValueToString(final EdmPrimitiveType instance, final Object value) {
+    expectErrorInValueToString(instance, value, null, null, null, null, null, "value type");
+  }
+
+  protected void expectContentErrorInValueToString(final EdmPrimitiveType instance, final Object value) {
+    expectErrorInValueToString(instance, value, null, null, null, null, null, "' is not valid.");
+  }
+
+  private void expectErrorInValueOfString(final EdmPrimitiveType instance,
+      final String value, final Boolean isNullable, final Integer maxLength, final Integer precision,
+      final Integer scale, final Boolean isUnicode, final Class<?> returnType,
+      final String message) {
+
+    try {
+      instance.valueOfString(value, isNullable, maxLength, precision, scale, isUnicode, returnType);
+      fail("Expected exception not thrown");
+    } catch (final EdmPrimitiveTypeException e) {
+      assertNotNull(e.getLocalizedMessage());
+      assertThat(e.getLocalizedMessage(), containsString(message));
+    }
+  }
+
+  protected void expectTypeErrorInValueOfString(final EdmPrimitiveType instance, final String value) {
+    expectErrorInValueOfString(instance, value, null, null, null, null, null, Class.class,
+        "The value type class java.lang.Class is not supported.");
+  }
+
+  protected void expectContentErrorInValueOfString(final EdmPrimitiveType instance, final String value) {
+    expectErrorInValueOfString(instance, value, null, null, null, null, null, instance.getDefaultType(),
+        "illegal content");
+  }
+
+  protected void expectNullErrorInValueOfString(final EdmPrimitiveType instance) {
+    expectErrorInValueOfString(instance, null, false, null, null, null, null, instance.getDefaultType(),
+        "The literal 'null' is not allowed.");
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9c1981c4/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImplTest.java
new file mode 100644
index 0000000..c122cb8
--- /dev/null
+++ b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImplTest.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.edm.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+
+import org.apache.olingo.commons.api.edm.EdmException;
+import org.apache.olingo.commons.api.edm.EdmFunction;
+import org.apache.olingo.commons.api.edm.EdmReturnType;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.provider.CsdlFunction;
+import org.apache.olingo.commons.api.edm.provider.CsdlReturnType;
+import org.apache.olingo.commons.core.edm.EdmFunctionImpl;
+import org.apache.olingo.commons.core.edm.EdmProviderImpl;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EdmFunctionImplTest {
+
+  private EdmFunction functionImpl1;
+  private EdmFunction functionImpl2;
+
+  @Before
+  public void setupFunctions() {
+    EdmProviderImpl provider = mock(EdmProviderImpl.class);
+
+    CsdlFunction function1 = new CsdlFunction().setReturnType(
+        new CsdlReturnType().setType(new FullQualifiedName("Edm", "String")));
+    functionImpl1 = new EdmFunctionImpl(provider, new FullQualifiedName("namespace", "name"), function1);
+    CsdlFunction function2 = new CsdlFunction().setComposable(true);
+    functionImpl2 = new EdmFunctionImpl(provider, new FullQualifiedName("namespace", "name"), function2);
+  }
+
+  @Test
+  public void isComposableDefaultFalse() {
+    assertFalse(functionImpl1.isComposable());
+  }
+
+  @Test
+  public void isComposableSetToTrue() {
+    assertTrue(functionImpl2.isComposable());
+  }
+
+  @Test
+  public void existingReturnTypeGetsReturned() {
+    EdmReturnType returnType = functionImpl1.getReturnType();
+    assertNotNull(returnType);
+    assertEquals("String", returnType.getType().getName());
+  }
+
+  @Test(expected = EdmException.class)
+  public void nonExistingReturnTypeResultsInException() {
+    functionImpl2.getReturnType();
+    fail();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/9c1981c4/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImplTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImplTest.java b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImplTest.java
new file mode 100644
index 0000000..2131881
--- /dev/null
+++ b/lib/commons-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmFunctionImportImplTest.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.edm.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmFunction;
+import org.apache.olingo.commons.api.edm.EdmFunctionImport;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.provider.CsdlEdmProvider;
+import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainerInfo;
+import org.apache.olingo.commons.api.edm.provider.CsdlFunction;
+import org.apache.olingo.commons.api.edm.provider.CsdlFunctionImport;
+import org.apache.olingo.commons.api.edm.provider.CsdlParameter;
+import org.apache.olingo.commons.api.edm.provider.CsdlReturnType;
+import org.apache.olingo.commons.core.edm.EdmEntityContainerImpl;
+import org.apache.olingo.commons.core.edm.EdmFunctionImportImpl;
+import org.apache.olingo.commons.core.edm.EdmProviderImpl;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
+import org.junit.Test;
+
+public class EdmFunctionImportImplTest {
+
+  @Test
+  public void functionImport() throws Exception {
+    CsdlEdmProvider provider = mock(CsdlEdmProvider.class);
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
+
+    final FullQualifiedName functionName = new FullQualifiedName("ns", "function");
+    final CsdlFunction functionProvider = new CsdlFunction()
+        .setName(functionName.getName())
+        .setParameters(Collections.<CsdlParameter> emptyList())
+        .setBound(false)
+        .setComposable(false)
+        .setReturnType(new CsdlReturnType().setType(EdmPrimitiveTypeKind.Boolean.getFullQualifiedName()));
+    when(provider.getFunctions(functionName)).thenReturn(Arrays.asList(functionProvider));
+
+    final FullQualifiedName containerName = new FullQualifiedName("ns", "container");
+    final CsdlEntityContainerInfo containerInfo = new CsdlEntityContainerInfo().setContainerName(containerName);
+    when(provider.getEntityContainerInfo(containerName)).thenReturn(containerInfo);
+    final EdmEntityContainer entityContainer = new EdmEntityContainerImpl(edm, provider, containerInfo);
+
+    final String functionImportName = "functionImport";
+    final CsdlFunctionImport functionImportProvider = new CsdlFunctionImport()
+        .setName(functionImportName)
+        .setFunction(functionName)
+        .setIncludeInServiceDocument(true);
+    when(provider.getFunctionImport(containerName, functionImportName)).thenReturn(functionImportProvider);
+
+    final EdmFunctionImport functionImport = new EdmFunctionImportImpl(edm, entityContainer, functionImportProvider);
+    assertEquals(functionImportName, entityContainer.getFunctionImport(functionImportName).getName());
+    assertEquals("functionImport", functionImport.getName());
+    final EdmFunction function = functionImport.getUnboundFunction(Collections.<String> emptyList());
+    assertEquals(functionName.getNamespace(), function.getNamespace());
+    assertEquals(functionName.getName(), function.getName());
+    assertFalse(function.isBound());
+    assertFalse(function.isComposable());
+    assertEquals(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Boolean),
+        function.getReturnType().getType());
+    assertEquals(entityContainer, functionImport.getEntityContainer());
+    assertNull(functionImport.getReturnedEntitySet());
+  }
+}


Mime
View raw message