You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by il...@apache.org on 2014/04/01 16:18:33 UTC

[06/51] [abbrv] git commit: [OLINGO-194] complex and collection literals + URI escape tests

[OLINGO-194] complex and collection literals + URI escape tests


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

Branch: refs/heads/master
Commit: 3e53ac5b7d4069fb0e8566105d75d7e9e1ff2c22
Parents: 7651350
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Wed Mar 26 18:15:16 2014 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Wed Mar 26 18:15:16 2014 +0100

----------------------------------------------------------------------
 .../request/invoke/ODataInvokeRequestImpl.java  |   2 +-
 .../apache/olingo/client/core/uri/URIUtils.java | 129 ++++++++++----
 .../olingo/client/core/uri/URIEscapeTest.java   |  79 +++++++++
 .../client/core/uri/v3/FilterFactoryTest.java   | 167 +++++++++++++++++++
 .../client/core/uri/v3/URIBuilderTest.java      | 131 +++++++++++++++
 .../client/core/uri/v4/FilterFactoryTest.java   |  86 ++++++++++
 .../client/core/uri/v4/URIBuilderTest.java      | 136 +++++++++++++++
 .../client/core/v3/FilterFactoryTest.java       | 167 -------------------
 .../olingo/client/core/v3/URIBuilderTest.java   | 131 ---------------
 .../client/core/v4/FilterFactoryTest.java       |  86 ----------
 .../olingo/client/core/v4/URIBuilderTest.java   | 136 ---------------
 11 files changed, 692 insertions(+), 558 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3e53ac5b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/ODataInvokeRequestImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/ODataInvokeRequestImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/ODataInvokeRequestImpl.java
index ac6d162..9043fe8 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/ODataInvokeRequestImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/ODataInvokeRequestImpl.java
@@ -153,7 +153,7 @@ public class ODataInvokeRequestImpl<T extends ODataInvokeResult>
             throw new IllegalArgumentException("Only primitive values can be passed via GET");
           }
 
-          uriBuilder.addParameter(param.getKey(), param.getValue().toString());
+          uriBuilder.addParameter(param.getKey(), URIUtils.escape(odataClient.getServiceVersion(), param.getValue()));
         }
         try {
           ((HttpRequestBase) this.request).setURI(uriBuilder.build());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3e53ac5b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
index 1e0dd5b..8dce061 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
@@ -27,7 +27,11 @@ import java.net.URI;
 import java.net.URLEncoder;
 import java.sql.Timestamp;
 import java.util.Calendar;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
 import java.util.UUID;
+import java.util.regex.Pattern;
 import javax.xml.datatype.Duration;
 import org.apache.commons.codec.binary.Hex;
 import org.apache.commons.io.IOUtils;
@@ -67,6 +71,8 @@ public final class URIUtils {
    */
   private static final Logger LOG = LoggerFactory.getLogger(URIUtils.class);
 
+  private static final Pattern ENUM_VALUE = Pattern.compile("(.+\\.)?.+'.+'");
+
   private URIUtils() {
     // Empty private constructor for static utility classes
   }
@@ -274,53 +280,102 @@ public final class URIUtils {
                                     Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null), Constants.UTF8));
   }
 
+  private static String quoteString(final String string, final boolean singleQuoteEscape)
+          throws UnsupportedEncodingException {
+
+    final String encoded = URLEncoder.encode(string, Constants.UTF8);
+    return ENUM_VALUE.matcher(string).matches()
+            ? encoded
+            : singleQuoteEscape
+            ? "'" + encoded + "'"
+            : "\"" + encoded + "\"";
+  }
+
   /**
    * Turns primitive values into their respective URI representation.
    *
+   * @param version OData protocol version
    * @param obj primitive value
    * @return URI representation
    */
   public static String escape(final ODataServiceVersion version, final Object obj) {
+    return escape(version, obj, true);
+  }
+
+  private static String escape(final ODataServiceVersion version, final Object obj, final boolean singleQuoteEscape) {
     String value;
 
     try {
-      value = (obj instanceof Boolean)
-              ? BooleanUtils.toStringTrueFalse((Boolean) obj)
-              : (obj instanceof UUID)
-              ? prefix(version, EdmPrimitiveTypeKind.Guid)
-              + obj.toString()
-              + suffix(version, EdmPrimitiveTypeKind.Guid)
-              : (obj instanceof byte[])
-              ? EdmBinary.getInstance().toUriLiteral(Hex.encodeHexString((byte[]) obj))
-              : (obj instanceof Timestamp)
-              ? timestamp(version, (Timestamp) obj)
-              : (obj instanceof Calendar)
-              ? calendar(version, (Calendar) obj)
-              : (obj instanceof Duration)
-              ? duration(version, (Duration) obj)
-              : (obj instanceof BigDecimal)
-              ? EdmDecimal.getInstance().valueToString(obj, null, null,
-                      Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
-              + suffix(version, EdmPrimitiveTypeKind.Decimal)
-              : (obj instanceof Double)
-              ? EdmDouble.getInstance().valueToString(obj, null, null,
-                      Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
-              + suffix(version, EdmPrimitiveTypeKind.Double)
-              : (obj instanceof Float)
-              ? EdmSingle.getInstance().valueToString(obj, null, null,
-                      Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
-              + suffix(version, EdmPrimitiveTypeKind.Single)
-              : (obj instanceof Long)
-              ? EdmInt64.getInstance().valueToString(obj, null, null,
-                      Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
-              + suffix(version, EdmPrimitiveTypeKind.Int64)
-              : (obj instanceof Geospatial)
-              ? URLEncoder.encode(EdmPrimitiveTypeFactory.getInstance(((Geospatial) obj).getEdmPrimitiveTypeKind()).
-                      valueToString(obj, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null),
-                      Constants.UTF8)
-              : (obj instanceof String)
-              ? "'" + URLEncoder.encode((String) obj, Constants.UTF8) + "'"
-              : obj.toString();
+      if (obj == null) {
+        value = Constants.ATTR_NULL;
+      } else if (version == ODataServiceVersion.V40 && obj instanceof Collection) {
+        final StringBuffer buffer = new StringBuffer("[");
+        for (@SuppressWarnings("unchecked")
+                final Iterator<Object> itor = ((Collection<Object>) obj).iterator(); itor.hasNext();) {
+          buffer.append(escape(version, itor.next(), false));
+          if (itor.hasNext()) {
+            buffer.append(',');
+          }
+        }
+        buffer.append(']');
+
+        value = buffer.toString();
+      } else if (version == ODataServiceVersion.V40 && obj instanceof Map) {
+        final StringBuffer buffer = new StringBuffer("{");
+        for (@SuppressWarnings("unchecked")
+                final Iterator<Map.Entry<Object, Object>> itor =
+                ((Map<Object, Object>) obj).entrySet().iterator(); itor.hasNext();) {
+
+          final Map.Entry<Object, Object> entry = itor.next();
+          buffer.append("\"").append(URLEncoder.encode(entry.getKey().toString(), Constants.UTF8)).append("\"");
+          buffer.append(':').append(escape(version, entry.getValue(), false));
+
+          if (itor.hasNext()) {
+            buffer.append(',');
+          }
+        }
+        buffer.append('}');
+
+        value = buffer.toString();
+      } else {
+        value = (obj instanceof Boolean)
+                ? BooleanUtils.toStringTrueFalse((Boolean) obj)
+                : (obj instanceof UUID)
+                ? prefix(version, EdmPrimitiveTypeKind.Guid)
+                + obj.toString()
+                + suffix(version, EdmPrimitiveTypeKind.Guid)
+                : (obj instanceof byte[])
+                ? EdmBinary.getInstance().toUriLiteral(Hex.encodeHexString((byte[]) obj))
+                : (obj instanceof Timestamp)
+                ? timestamp(version, (Timestamp) obj)
+                : (obj instanceof Calendar)
+                ? calendar(version, (Calendar) obj)
+                : (obj instanceof Duration)
+                ? duration(version, (Duration) obj)
+                : (obj instanceof BigDecimal)
+                ? EdmDecimal.getInstance().valueToString(obj, null, null,
+                        Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
+                + suffix(version, EdmPrimitiveTypeKind.Decimal)
+                : (obj instanceof Double)
+                ? EdmDouble.getInstance().valueToString(obj, null, null,
+                        Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
+                + suffix(version, EdmPrimitiveTypeKind.Double)
+                : (obj instanceof Float)
+                ? EdmSingle.getInstance().valueToString(obj, null, null,
+                        Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
+                + suffix(version, EdmPrimitiveTypeKind.Single)
+                : (obj instanceof Long)
+                ? EdmInt64.getInstance().valueToString(obj, null, null,
+                        Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null)
+                + suffix(version, EdmPrimitiveTypeKind.Int64)
+                : (obj instanceof Geospatial)
+                ? URLEncoder.encode(EdmPrimitiveTypeFactory.getInstance(((Geospatial) obj).getEdmPrimitiveTypeKind()).
+                        valueToString(obj, null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null),
+                        Constants.UTF8)
+                : (obj instanceof String)
+                ? quoteString((String) obj, singleQuoteEscape)
+                : obj.toString();
+      }
     } catch (Exception e) {
       LOG.warn("While escaping '{}', using toString()", obj, e);
       value = obj.toString();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3e53ac5b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/URIEscapeTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/URIEscapeTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/URIEscapeTest.java
new file mode 100644
index 0000000..886d1e8
--- /dev/null
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/URIEscapeTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.client.core.uri;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Arrays;
+import java.util.Collections;
+import org.apache.olingo.client.core.edm.EdmEnumTypeImpl;
+import org.apache.olingo.client.core.edm.xml.v4.EnumTypeImpl;
+import org.apache.olingo.commons.api.Constants;
+import org.apache.olingo.commons.api.edm.EdmEnumType;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
+import org.apache.olingo.commons.api.edm.geo.Geospatial;
+import org.apache.olingo.commons.api.edm.geo.Point;
+import org.junit.Test;
+
+public class URIEscapeTest {
+
+  @Test
+  public void _null() {
+    assertEquals("null", URIUtils.escape(ODataServiceVersion.V40, null));
+  }
+
+  @Test
+  public void _boolean() {
+    assertEquals("true", URIUtils.escape(ODataServiceVersion.V40, Boolean.TRUE));
+  }
+
+  @Test
+  public void _enum() throws UnsupportedEncodingException {
+    final EdmEnumType pattern = new EdmEnumTypeImpl(ODataServiceVersion.V40,
+            null, new FullQualifiedName("Sales", "Pattern"), new EnumTypeImpl());
+
+    assertEquals(URLEncoder.encode("Sales.Pattern'Yellow'", Constants.UTF8),
+            URIUtils.escape(ODataServiceVersion.V40, pattern.toUriLiteral("Yellow")));
+  }
+
+  @Test
+  public void geospatial() throws UnsupportedEncodingException {
+    final Point point = new Point(Geospatial.Dimension.GEOGRAPHY, 0);
+    point.setX(142.1);
+    point.setY(64.1);
+
+    assertEquals(URLEncoder.encode("geography'SRID=0;Point(142.1 64.1)'", Constants.UTF8),
+            URIUtils.escape(ODataServiceVersion.V40, point));
+  }
+
+  @Test
+  public void collection() {
+    assertEquals("[\"red\",\"green\"]",
+            URIUtils.escape(ODataServiceVersion.V40, Arrays.asList(new String[] {"red", "green"})));
+  }
+
+  @Test
+  public void complex() {
+    assertEquals("{\"Name\":\"Value\"}",
+            URIUtils.escape(ODataServiceVersion.V40, Collections.singletonMap("Name", "Value")));
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3e53ac5b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/FilterFactoryTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/FilterFactoryTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/FilterFactoryTest.java
new file mode 100644
index 0000000..666edf7
--- /dev/null
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/FilterFactoryTest.java
@@ -0,0 +1,167 @@
+/*
+ * 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.client.core.uri.v3;
+
+import org.apache.olingo.client.api.v3.ODataClient;
+import org.apache.olingo.client.api.uri.URIFilter;
+import org.apache.olingo.client.api.uri.v3.FilterArgFactory;
+import org.apache.olingo.client.api.uri.v3.FilterFactory;
+import org.apache.olingo.client.core.AbstractTest;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class FilterFactoryTest extends AbstractTest {
+
+  @Override
+  protected ODataClient getClient() {
+    return v3Client;
+  }
+
+  private FilterFactory getFilterFactory() {
+    return getClient().getFilterFactory();
+  }
+
+  private FilterArgFactory getFilterArgFactory() {
+    return getFilterFactory().getArgFactory();
+  }
+
+  @Test
+  public void simple() {
+    final URIFilter filter = getFilterFactory().lt("VIN", 16);
+    assertEquals("(VIN lt 16)", filter.build());
+  }
+
+  @Test
+  public void _null() {
+    final URIFilter filter = getFilterFactory().eq(
+            getFilterArgFactory().property("NullValue"), getFilterArgFactory()._null());
+
+    assertEquals("(NullValue eq null)", filter.build());
+  }
+
+  @Test
+  public void and() {
+    final URIFilter filter = getFilterFactory().and(
+            getFilterFactory().lt("VIN", 16),
+            getFilterFactory().gt("VIN", 12));
+
+    assertEquals("((VIN lt 16) and (VIN gt 12))", filter.build());
+  }
+
+  @Test
+  public void not() {
+    final URIFilter filter = getFilterFactory().not(
+            getFilterFactory().or(
+                    getFilterFactory().ge("VIN", 16),
+                    getFilterFactory().le("VIN", 12)));
+
+    assertEquals("not (((VIN ge 16) or (VIN le 12)))", filter.build());
+  }
+
+  @Test
+  public void operator() {
+    URIFilter filter = getFilterFactory().eq(
+            getFilterArgFactory().add(
+                    getFilterArgFactory().property("VIN"),
+                    getFilterArgFactory().literal(1)),
+            getFilterArgFactory().literal(16));
+
+    assertEquals("((VIN add 1) eq 16)", filter.build());
+
+    filter = getFilterFactory().eq(
+            getFilterArgFactory().add(
+                    getFilterArgFactory().literal(1),
+                    getFilterArgFactory().property("VIN")),
+            getFilterArgFactory().literal(16));
+
+    assertEquals("((1 add VIN) eq 16)", filter.build());
+
+    filter = getFilterFactory().eq(
+            getFilterArgFactory().literal(16),
+            getFilterArgFactory().add(
+                    getFilterArgFactory().literal(1),
+                    getFilterArgFactory().property("VIN")));
+
+    assertEquals("(16 eq (1 add VIN))", filter.build());
+  }
+
+  @Test
+  public void function() {
+    final URIFilter filter = getFilterFactory().match(
+            getFilterArgFactory().startswith(
+                    getFilterArgFactory().property("Description"),
+                    getFilterArgFactory().literal("cen")));
+
+    assertEquals("startswith(Description,'cen')", filter.build());
+  }
+
+  @Test
+  public void composed() {
+    final URIFilter filter = getFilterFactory().gt(
+            getFilterArgFactory().length(
+                    getFilterArgFactory().property("Description")),
+            getFilterArgFactory().add(
+                    getFilterArgFactory().property("VIN"),
+                    getFilterArgFactory().literal(10)));
+
+    assertEquals("(length(Description) gt (VIN add 10))", filter.build());
+  }
+
+  @Test
+  public void propertyPath() {
+    URIFilter filter = getFilterFactory().eq(
+            getFilterArgFactory().indexof(
+                    getFilterArgFactory().property("PrimaryContactInfo/HomePhone/PhoneNumber"),
+                    getFilterArgFactory().literal("ODataJClient")),
+            getFilterArgFactory().literal(1));
+
+    assertEquals("(indexof(PrimaryContactInfo/HomePhone/PhoneNumber,'ODataJClient') eq 1)", filter.build());
+
+    filter = getFilterFactory().ne(
+            getFilterArgFactory().indexof(
+                    getFilterArgFactory().property("PrimaryContactInfo/HomePhone/PhoneNumber"),
+                    getFilterArgFactory().literal("lccvussrv")),
+            getFilterArgFactory().literal(-1));
+
+    assertEquals("(indexof(PrimaryContactInfo/HomePhone/PhoneNumber,'lccvussrv') ne -1)", filter.build());
+  }
+
+  @Test
+  public void datetime() {
+    final URIFilter filter = getFilterFactory().eq(
+            getFilterArgFactory().month(
+                    getFilterArgFactory().property("PurchaseDate")),
+            getFilterArgFactory().literal(12));
+
+    assertEquals("(month(PurchaseDate) eq 12)", filter.build());
+  }
+
+  @Test
+  public void isof() {
+    final URIFilter filter = getFilterFactory().match(
+            getFilterArgFactory().isof(
+                    getFilterArgFactory().literal(
+                            "Microsoft.Test.OData.Services.AstoriaDefaultService.SpecialEmployee")));
+
+    assertEquals("isof('Microsoft.Test.OData.Services.AstoriaDefaultService.SpecialEmployee')", filter.build());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3e53ac5b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/URIBuilderTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/URIBuilderTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/URIBuilderTest.java
new file mode 100644
index 0000000..78badef
--- /dev/null
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v3/URIBuilderTest.java
@@ -0,0 +1,131 @@
+/*
+ * 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.client.core.uri.v3;
+
+import static org.junit.Assert.assertEquals;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.olingo.client.api.v3.ODataClient;
+import org.apache.olingo.client.api.uri.v3.URIBuilder;
+import org.apache.olingo.client.core.AbstractTest;
+import org.junit.Test;
+
+public class URIBuilderTest extends AbstractTest {
+
+  private static final String SERVICE_ROOT = "http://host/service";
+
+  @Override
+  protected ODataClient getClient() {
+    return v3Client;
+  }
+
+  @Test
+  public void metadata() throws URISyntaxException {
+    final URI uri = getClient().getURIBuilder(SERVICE_ROOT).appendMetadataSegment().build();
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/$metadata").build(), uri);
+  }
+
+  @Test
+  public void entity() throws URISyntaxException {
+    final URI uri = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("AnEntitySet").
+            appendKeySegment(11).build();
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/AnEntitySet(11)").build(), uri);
+
+    final Map<String, Object> multiKey = new HashMap<String, Object>();
+    multiKey.put("OrderId", -10);
+    multiKey.put("ProductId", -10);
+    URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendEntitySetSegment("OrderLine").appendKeySegment(multiKey).
+            appendPropertySegment("Quantity").appendValueSegment();
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/OrderLine(OrderId=-10,ProductId=-10)/Quantity/$value").build(), uriBuilder.build());
+
+    uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendEntitySetSegment("Customer").appendKeySegment(-10).
+            select("CustomerId", "Name", "Orders").expand("Orders");
+    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Customer(-10)").
+            addParameter("$select", "CustomerId,Name,Orders").addParameter("$expand", "Orders").build(),
+            uriBuilder.build());
+
+    uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendEntitySetSegment("Customer").appendKeySegment(-10).appendLinksSegment("Orders");
+    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Customer(-10)/$links/Orders").build(),
+            uriBuilder.build());
+  }
+
+  @Test
+  public void count() throws URISyntaxException {
+    URI uri = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("Products").count().build();
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Products/$count").build(), uri);
+
+    uri = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("Products").
+            inlineCount(URIBuilder.InlineCount.allpages).build();
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Products").
+            addParameter("$inlinecount", "allpages").build(), uri);
+  }
+
+  @Test
+  public void filter() throws URISyntaxException {
+    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("AnEntitySet").
+            filter(getClient().getFilterFactory().lt("VIN", 16));
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/AnEntitySet").
+            addParameter("$filter", "(VIN lt 16)").build(),
+            uriBuilder.build());
+  }
+
+  @Test
+  public void unboundAction() throws URISyntaxException {
+    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendOperationCallSegment("ProductsByCategoryId",
+                    Collections.<String, Object>singletonMap("categoryId", 2));
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/ProductsByCategoryId(categoryId=2)").build(), uriBuilder.build());
+  }
+
+  @Test
+  public void boundAction() throws URISyntaxException {
+    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendEntitySetSegment("Products").appendOperationCallSegment("MostExpensive", null);
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/Products/MostExpensive").build(), uriBuilder.build());
+  }
+
+  @Test
+  public void derived() throws URISyntaxException {
+    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendEntitySetSegment("Customers").appendNavigationSegment("Model").
+            appendDerivedEntityTypeSegment("Namespace.VipCustomer").appendKeySegment(1);
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/Customers/Model/Namespace.VipCustomer(1)").build(), uriBuilder.build());
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3e53ac5b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v4/FilterFactoryTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v4/FilterFactoryTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v4/FilterFactoryTest.java
new file mode 100644
index 0000000..06a07e6
--- /dev/null
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v4/FilterFactoryTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.client.core.uri.v4;
+
+import org.apache.olingo.client.api.v4.ODataClient;
+import org.apache.olingo.client.api.uri.URIFilter;
+import org.apache.olingo.client.api.uri.v4.FilterArgFactory;
+import org.apache.olingo.client.api.uri.v4.FilterFactory;
+import org.apache.olingo.client.core.AbstractTest;
+import org.apache.olingo.client.core.edm.EdmEnumTypeImpl;
+import org.apache.olingo.client.core.edm.xml.v4.EnumTypeImpl;
+import org.apache.olingo.commons.api.edm.EdmEnumType;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class FilterFactoryTest extends AbstractTest {
+
+  @Override
+  protected ODataClient getClient() {
+    return v4Client;
+  }
+
+  private FilterFactory getFilterFactory() {
+    return getClient().getFilterFactory();
+  }
+
+  private FilterArgFactory getFilterArgFactory() {
+    return getFilterFactory().getArgFactory();
+  }
+
+  @Test
+  public void has() {
+    final EdmEnumType pattern = new EdmEnumTypeImpl(ODataServiceVersion.V40,
+            null, new FullQualifiedName("Sales", "Pattern"), new EnumTypeImpl());
+    final URIFilter filter = getFilterFactory().has(getFilterArgFactory().property("style"), pattern, "Yellow");
+
+    assertEquals("(style has Sales.Pattern'Yellow')", filter.build());
+  }
+
+  @Test
+  public void contains() {
+    final URIFilter filter = getFilterFactory().match(
+            getFilterArgFactory().contains(
+                    getFilterArgFactory().property("CompanyName"), getFilterArgFactory().literal("Alfreds")));
+
+    assertEquals("contains(CompanyName,'Alfreds')", filter.build());
+  }
+
+  @Test
+  public void maxdatetime() {
+    final URIFilter filter = getFilterFactory().eq(
+            getFilterArgFactory().property("EndTime"),
+            getFilterArgFactory().maxdatetime());
+
+    assertEquals("(EndTime eq maxdatetime())", filter.build());
+  }
+
+  @Test
+  public void any() {
+    final URIFilter filter = getFilterFactory().match(
+            getFilterArgFactory().any(getFilterArgFactory().property("Items"),
+                    getFilterFactory().gt("d:d/Quantity", 100)));
+
+    assertEquals("Items/any(d:d/Quantity gt 100)", filter.build());
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3e53ac5b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v4/URIBuilderTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v4/URIBuilderTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v4/URIBuilderTest.java
new file mode 100644
index 0000000..1518cf0
--- /dev/null
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/v4/URIBuilderTest.java
@@ -0,0 +1,136 @@
+/*
+ * 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.client.core.uri.v4;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.apache.olingo.client.api.v4.ODataClient;
+import org.apache.olingo.client.api.uri.v4.URIBuilder;
+import org.apache.olingo.client.core.AbstractTest;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class URIBuilderTest extends AbstractTest {
+
+  private static final String SERVICE_ROOT = "http://host/service";
+
+  @Override
+  protected ODataClient getClient() {
+    return v4Client;
+  }
+
+  @Test
+  public void count() throws URISyntaxException {
+    URI uri = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("Products").count().build();
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Products/$count").build(), uri);
+
+    uri = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("Products").count(true).build();
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Products").
+            addParameter("$count", "true").build(), uri);
+  }
+
+  @Test
+  public void singleton() throws URISyntaxException {
+    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendSingletonSegment("BestProductEverCreated");
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/BestProductEverCreated").build(), uriBuilder.build());
+  }
+
+  @Test
+  public void entityId() throws URISyntaxException {
+    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendEntityIdSegment("Products(0)");
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/$entity").addParameter("$id", "Products(0)").build(), uriBuilder.build());
+  }
+
+  @Test
+  public void boundAction() throws URISyntaxException {
+    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendEntitySetSegment("Categories").appendKeySegment(1).
+            appendNavigationSegment("Products").appendNavigationSegment("Model").
+            appendOperationCallSegment("AllOrders", null);
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/Categories(1)/Products/Model.AllOrders()").build(), uriBuilder.build());
+  }
+
+  @Test
+  public void ref() throws URISyntaxException {
+    URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendEntitySetSegment("Categories").appendKeySegment(1).
+            appendNavigationSegment("Products").appendRefSegment();
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/Categories(1)/Products/$ref").build(), uriBuilder.build());
+
+    uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendEntitySetSegment("Categories").appendKeySegment(1).
+            appendNavigationSegment("Products").appendRefSegment().id("../../Products(0)");
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/Categories(1)/Products/$ref").addParameter("$id", "../../Products(0)").build(),
+            uriBuilder.build());
+  }
+
+  @Test
+  public void derived() throws URISyntaxException {
+    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendEntitySetSegment("Customers").appendNavigationSegment("Model").
+            appendDerivedEntityTypeSegment("VipCustomer").appendKeySegment(1);
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/Customers/Model.VipCustomer(1)").build(), uriBuilder.build());
+  }
+
+  @Test
+  public void crossjoin() throws URISyntaxException {
+    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendCrossjoinSegment("Products", "Sales");
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/$crossjoin(Products,Sales)").build(), uriBuilder.build());
+  }
+
+  @Test
+  public void all() throws URISyntaxException {
+    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).appendAllSegment();
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/$all").build(), uriBuilder.build());
+  }
+
+  @Test
+  public void search() throws URISyntaxException {
+    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
+            appendEntitySetSegment("Products").search("blue OR green");
+
+    assertEquals(new org.apache.http.client.utils.URIBuilder(
+            SERVICE_ROOT + "/Products").addParameter("$search", "blue OR green").build(), uriBuilder.build());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3e53ac5b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/FilterFactoryTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/FilterFactoryTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/FilterFactoryTest.java
deleted file mode 100644
index 9d7e0a3..0000000
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/FilterFactoryTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * 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.client.core.v3;
-
-import org.apache.olingo.client.api.v3.ODataClient;
-import org.apache.olingo.client.api.uri.URIFilter;
-import org.apache.olingo.client.api.uri.v3.FilterArgFactory;
-import org.apache.olingo.client.api.uri.v3.FilterFactory;
-import org.apache.olingo.client.core.AbstractTest;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class FilterFactoryTest extends AbstractTest {
-
-  @Override
-  protected ODataClient getClient() {
-    return v3Client;
-  }
-
-  private FilterFactory getFilterFactory() {
-    return getClient().getFilterFactory();
-  }
-
-  private FilterArgFactory getFilterArgFactory() {
-    return getFilterFactory().getArgFactory();
-  }
-
-  @Test
-  public void simple() {
-    final URIFilter filter = getFilterFactory().lt("VIN", 16);
-    assertEquals("(VIN lt 16)", filter.build());
-  }
-
-  @Test
-  public void _null() {
-    final URIFilter filter = getFilterFactory().eq(
-            getFilterArgFactory().property("NullValue"), getFilterArgFactory()._null());
-
-    assertEquals("(NullValue eq null)", filter.build());
-  }
-
-  @Test
-  public void and() {
-    final URIFilter filter = getFilterFactory().and(
-            getFilterFactory().lt("VIN", 16),
-            getFilterFactory().gt("VIN", 12));
-
-    assertEquals("((VIN lt 16) and (VIN gt 12))", filter.build());
-  }
-
-  @Test
-  public void not() {
-    final URIFilter filter = getFilterFactory().not(
-            getFilterFactory().or(
-                    getFilterFactory().ge("VIN", 16),
-                    getFilterFactory().le("VIN", 12)));
-
-    assertEquals("not (((VIN ge 16) or (VIN le 12)))", filter.build());
-  }
-
-  @Test
-  public void operator() {
-    URIFilter filter = getFilterFactory().eq(
-            getFilterArgFactory().add(
-                    getFilterArgFactory().property("VIN"),
-                    getFilterArgFactory().literal(1)),
-            getFilterArgFactory().literal(16));
-
-    assertEquals("((VIN add 1) eq 16)", filter.build());
-
-    filter = getFilterFactory().eq(
-            getFilterArgFactory().add(
-                    getFilterArgFactory().literal(1),
-                    getFilterArgFactory().property("VIN")),
-            getFilterArgFactory().literal(16));
-
-    assertEquals("((1 add VIN) eq 16)", filter.build());
-
-    filter = getFilterFactory().eq(
-            getFilterArgFactory().literal(16),
-            getFilterArgFactory().add(
-                    getFilterArgFactory().literal(1),
-                    getFilterArgFactory().property("VIN")));
-
-    assertEquals("(16 eq (1 add VIN))", filter.build());
-  }
-
-  @Test
-  public void function() {
-    final URIFilter filter = getFilterFactory().match(
-            getFilterArgFactory().startswith(
-                    getFilterArgFactory().property("Description"),
-                    getFilterArgFactory().literal("cen")));
-
-    assertEquals("startswith(Description,'cen')", filter.build());
-  }
-
-  @Test
-  public void composed() {
-    final URIFilter filter = getFilterFactory().gt(
-            getFilterArgFactory().length(
-                    getFilterArgFactory().property("Description")),
-            getFilterArgFactory().add(
-                    getFilterArgFactory().property("VIN"),
-                    getFilterArgFactory().literal(10)));
-
-    assertEquals("(length(Description) gt (VIN add 10))", filter.build());
-  }
-
-  @Test
-  public void propertyPath() {
-    URIFilter filter = getFilterFactory().eq(
-            getFilterArgFactory().indexof(
-                    getFilterArgFactory().property("PrimaryContactInfo/HomePhone/PhoneNumber"),
-                    getFilterArgFactory().literal("ODataJClient")),
-            getFilterArgFactory().literal(1));
-
-    assertEquals("(indexof(PrimaryContactInfo/HomePhone/PhoneNumber,'ODataJClient') eq 1)", filter.build());
-
-    filter = getFilterFactory().ne(
-            getFilterArgFactory().indexof(
-                    getFilterArgFactory().property("PrimaryContactInfo/HomePhone/PhoneNumber"),
-                    getFilterArgFactory().literal("lccvussrv")),
-            getFilterArgFactory().literal(-1));
-
-    assertEquals("(indexof(PrimaryContactInfo/HomePhone/PhoneNumber,'lccvussrv') ne -1)", filter.build());
-  }
-
-  @Test
-  public void datetime() {
-    final URIFilter filter = getFilterFactory().eq(
-            getFilterArgFactory().month(
-                    getFilterArgFactory().property("PurchaseDate")),
-            getFilterArgFactory().literal(12));
-
-    assertEquals("(month(PurchaseDate) eq 12)", filter.build());
-  }
-
-  @Test
-  public void isof() {
-    final URIFilter filter = getFilterFactory().match(
-            getFilterArgFactory().isof(
-                    getFilterArgFactory().literal(
-                            "Microsoft.Test.OData.Services.AstoriaDefaultService.SpecialEmployee")));
-
-    assertEquals("isof('Microsoft.Test.OData.Services.AstoriaDefaultService.SpecialEmployee')", filter.build());
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3e53ac5b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/URIBuilderTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/URIBuilderTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/URIBuilderTest.java
deleted file mode 100644
index 1838cf8..0000000
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/URIBuilderTest.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * 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.client.core.v3;
-
-import static org.junit.Assert.assertEquals;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.olingo.client.api.v3.ODataClient;
-import org.apache.olingo.client.api.uri.v3.URIBuilder;
-import org.apache.olingo.client.core.AbstractTest;
-import org.junit.Test;
-
-public class URIBuilderTest extends AbstractTest {
-
-  private static final String SERVICE_ROOT = "http://host/service";
-
-  @Override
-  protected ODataClient getClient() {
-    return v3Client;
-  }
-
-  @Test
-  public void metadata() throws URISyntaxException {
-    final URI uri = getClient().getURIBuilder(SERVICE_ROOT).appendMetadataSegment().build();
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/$metadata").build(), uri);
-  }
-
-  @Test
-  public void entity() throws URISyntaxException {
-    final URI uri = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("AnEntitySet").
-            appendKeySegment(11).build();
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/AnEntitySet(11)").build(), uri);
-
-    final Map<String, Object> multiKey = new HashMap<String, Object>();
-    multiKey.put("OrderId", -10);
-    multiKey.put("ProductId", -10);
-    URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendEntitySetSegment("OrderLine").appendKeySegment(multiKey).
-            appendPropertySegment("Quantity").appendValueSegment();
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/OrderLine(OrderId=-10,ProductId=-10)/Quantity/$value").build(), uriBuilder.build());
-
-    uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendEntitySetSegment("Customer").appendKeySegment(-10).
-            select("CustomerId", "Name", "Orders").expand("Orders");
-    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Customer(-10)").
-            addParameter("$select", "CustomerId,Name,Orders").addParameter("$expand", "Orders").build(),
-            uriBuilder.build());
-
-    uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendEntitySetSegment("Customer").appendKeySegment(-10).appendLinksSegment("Orders");
-    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Customer(-10)/$links/Orders").build(),
-            uriBuilder.build());
-  }
-
-  @Test
-  public void count() throws URISyntaxException {
-    URI uri = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("Products").count().build();
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Products/$count").build(), uri);
-
-    uri = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("Products").
-            inlineCount(URIBuilder.InlineCount.allpages).build();
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Products").
-            addParameter("$inlinecount", "allpages").build(), uri);
-  }
-
-  @Test
-  public void filter() throws URISyntaxException {
-    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("AnEntitySet").
-            filter(getClient().getFilterFactory().lt("VIN", 16));
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/AnEntitySet").
-            addParameter("$filter", "(VIN lt 16)").build(),
-            uriBuilder.build());
-  }
-
-  @Test
-  public void unboundAction() throws URISyntaxException {
-    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendOperationCallSegment("ProductsByCategoryId",
-                    Collections.<String, Object>singletonMap("categoryId", 2));
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/ProductsByCategoryId(categoryId=2)").build(), uriBuilder.build());
-  }
-
-  @Test
-  public void boundAction() throws URISyntaxException {
-    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendEntitySetSegment("Products").appendOperationCallSegment("MostExpensive", null);
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/Products/MostExpensive").build(), uriBuilder.build());
-  }
-
-  @Test
-  public void derived() throws URISyntaxException {
-    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendEntitySetSegment("Customers").appendNavigationSegment("Model").
-            appendDerivedEntityTypeSegment("Namespace.VipCustomer").appendKeySegment(1);
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/Customers/Model/Namespace.VipCustomer(1)").build(), uriBuilder.build());
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3e53ac5b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/FilterFactoryTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/FilterFactoryTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/FilterFactoryTest.java
deleted file mode 100644
index fd2a696..0000000
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/FilterFactoryTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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.client.core.v4;
-
-import org.apache.olingo.client.api.v4.ODataClient;
-import org.apache.olingo.client.api.uri.URIFilter;
-import org.apache.olingo.client.api.uri.v4.FilterArgFactory;
-import org.apache.olingo.client.api.uri.v4.FilterFactory;
-import org.apache.olingo.client.core.AbstractTest;
-import org.apache.olingo.client.core.edm.EdmEnumTypeImpl;
-import org.apache.olingo.client.core.edm.xml.v4.EnumTypeImpl;
-import org.apache.olingo.commons.api.edm.EdmEnumType;
-import org.apache.olingo.commons.api.edm.FullQualifiedName;
-import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class FilterFactoryTest extends AbstractTest {
-
-  @Override
-  protected ODataClient getClient() {
-    return v4Client;
-  }
-
-  private FilterFactory getFilterFactory() {
-    return getClient().getFilterFactory();
-  }
-
-  private FilterArgFactory getFilterArgFactory() {
-    return getFilterFactory().getArgFactory();
-  }
-
-  @Test
-  public void has() {
-    final EdmEnumType pattern = new EdmEnumTypeImpl(ODataServiceVersion.V40,
-            null, new FullQualifiedName("Sales", "Pattern"), new EnumTypeImpl());
-    final URIFilter filter = getFilterFactory().has(getFilterArgFactory().property("style"), pattern, "Yellow");
-
-    assertEquals("(style has Sales.Pattern'Yellow')", filter.build());
-  }
-
-  @Test
-  public void contains() {
-    final URIFilter filter = getFilterFactory().match(
-            getFilterArgFactory().contains(
-                    getFilterArgFactory().property("CompanyName"), getFilterArgFactory().literal("Alfreds")));
-
-    assertEquals("contains(CompanyName,'Alfreds')", filter.build());
-  }
-
-  @Test
-  public void maxdatetime() {
-    final URIFilter filter = getFilterFactory().eq(
-            getFilterArgFactory().property("EndTime"),
-            getFilterArgFactory().maxdatetime());
-
-    assertEquals("(EndTime eq maxdatetime())", filter.build());
-  }
-
-  @Test
-  public void any() {
-    final URIFilter filter = getFilterFactory().match(
-            getFilterArgFactory().any(getFilterArgFactory().property("Items"),
-                    getFilterFactory().gt("d:d/Quantity", 100)));
-
-    assertEquals("Items/any(d:d/Quantity gt 100)", filter.build());
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3e53ac5b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/URIBuilderTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/URIBuilderTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/URIBuilderTest.java
deleted file mode 100644
index 868b363..0000000
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/URIBuilderTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.client.core.v4;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.apache.olingo.client.api.v4.ODataClient;
-import org.apache.olingo.client.api.uri.v4.URIBuilder;
-import org.apache.olingo.client.core.AbstractTest;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class URIBuilderTest extends AbstractTest {
-
-  private static final String SERVICE_ROOT = "http://host/service";
-
-  @Override
-  protected ODataClient getClient() {
-    return v4Client;
-  }
-
-  @Test
-  public void count() throws URISyntaxException {
-    URI uri = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("Products").count().build();
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Products/$count").build(), uri);
-
-    uri = getClient().getURIBuilder(SERVICE_ROOT).appendEntitySetSegment("Products").count(true).build();
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(SERVICE_ROOT + "/Products").
-            addParameter("$count", "true").build(), uri);
-  }
-
-  @Test
-  public void singleton() throws URISyntaxException {
-    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendSingletonSegment("BestProductEverCreated");
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/BestProductEverCreated").build(), uriBuilder.build());
-  }
-
-  @Test
-  public void entityId() throws URISyntaxException {
-    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendEntityIdSegment("Products(0)");
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/$entity").addParameter("$id", "Products(0)").build(), uriBuilder.build());
-  }
-
-  @Test
-  public void boundAction() throws URISyntaxException {
-    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendEntitySetSegment("Categories").appendKeySegment(1).
-            appendNavigationSegment("Products").appendNavigationSegment("Model").
-            appendOperationCallSegment("AllOrders", null);
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/Categories(1)/Products/Model.AllOrders()").build(), uriBuilder.build());
-  }
-
-  @Test
-  public void ref() throws URISyntaxException {
-    URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendEntitySetSegment("Categories").appendKeySegment(1).
-            appendNavigationSegment("Products").appendRefSegment();
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/Categories(1)/Products/$ref").build(), uriBuilder.build());
-
-    uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendEntitySetSegment("Categories").appendKeySegment(1).
-            appendNavigationSegment("Products").appendRefSegment().id("../../Products(0)");
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/Categories(1)/Products/$ref").addParameter("$id", "../../Products(0)").build(),
-            uriBuilder.build());
-  }
-
-  @Test
-  public void derived() throws URISyntaxException {
-    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendEntitySetSegment("Customers").appendNavigationSegment("Model").
-            appendDerivedEntityTypeSegment("VipCustomer").appendKeySegment(1);
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/Customers/Model.VipCustomer(1)").build(), uriBuilder.build());
-  }
-
-  @Test
-  public void crossjoin() throws URISyntaxException {
-    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendCrossjoinSegment("Products", "Sales");
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/$crossjoin(Products,Sales)").build(), uriBuilder.build());
-  }
-
-  @Test
-  public void all() throws URISyntaxException {
-    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).appendAllSegment();
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/$all").build(), uriBuilder.build());
-  }
-
-  @Test
-  public void search() throws URISyntaxException {
-    final URIBuilder uriBuilder = getClient().getURIBuilder(SERVICE_ROOT).
-            appendEntitySetSegment("Products").search("blue OR green");
-
-    assertEquals(new org.apache.http.client.utils.URIBuilder(
-            SERVICE_ROOT + "/Products").addParameter("$search", "blue OR green").build(), uriBuilder.build());
-  }
-
-}