From 72fcaa1a54a3607ee2b94f66414677ab6f9c8e92 Mon Sep 17 00:00:00 2001 From: Klaus Straubinger Date: Thu, 29 Sep 2016 16:25:33 +0200 Subject: [PATCH] [OLINGO-1028] stricter multiplicity tests in expression parser + clean-up Signed-off-by: Christian Amend --- .../core/uri/parser/ExpressionParser.java | 59 +- .../parser/UriParserSemanticException.java | 3 +- .../queryoption/expression/MemberImpl.java | 14 +- .../server-core-exceptions-i18n.properties | 1 + .../core/uri/parser/ExpandParserTest.java | 561 ++ .../core/uri/parser/ExpressionParserTest.java | 2389 +++++++ .../uri/parser/ResourcePathParserTest.java | 2100 ++++++ .../core/uri/parser/SearchParserTest.java | 187 + .../core/uri/parser/SelectParserTest.java | 177 + .../core/uri/parser/TestFullResourcePath.java | 6003 ----------------- .../core/uri/parser/TestUriParserImpl.java | 1047 --- .../server/core/uri/parser/UriParserTest.java | 843 +++ .../core/uri/testutil/ResourceValidator.java | 223 +- 13 files changed, 6389 insertions(+), 7218 deletions(-) create mode 100644 lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ExpandParserTest.java create mode 100644 lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java create mode 100644 lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ResourcePathParserTest.java create mode 100644 lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/SearchParserTest.java create mode 100644 lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/SelectParserTest.java delete mode 100644 lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/TestFullResourcePath.java delete mode 100644 lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/TestUriParserImpl.java create mode 100644 lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/UriParserTest.java diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java index 23fd8a404..7a3409596 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java @@ -180,15 +180,19 @@ public class ExpressionParser { this.crossjoinEntitySetNames = crossjoinEntitySetNames; this.aliases = aliases; - return parseExpression(); + final Expression expression = parseExpression(); + checkNoCollection(expression); + return expression; } private Expression parseExpression() throws UriParserException, UriValidationException { Expression left = parseAnd(); while (tokenizer.next(TokenKind.OrOperator)) { - final Expression right = parseAnd(); checkType(left, EdmPrimitiveTypeKind.Boolean); + checkNoCollection(left); + final Expression right = parseAnd(); checkType(right, EdmPrimitiveTypeKind.Boolean); + checkNoCollection(right); left = new BinaryImpl(left, BinaryOperatorKind.OR, right, odata.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Boolean)); } @@ -198,9 +202,11 @@ public class ExpressionParser { private Expression parseAnd() throws UriParserException, UriValidationException { Expression left = parseExprEquality(); while (tokenizer.next(TokenKind.AndOperator)) { - final Expression right = parseExprEquality(); checkType(left, EdmPrimitiveTypeKind.Boolean); + checkNoCollection(left); + final Expression right = parseExprEquality(); checkType(right, EdmPrimitiveTypeKind.Boolean); + checkNoCollection(right); left = new BinaryImpl(left, BinaryOperatorKind.AND, right, odata.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Boolean)); } @@ -285,8 +291,8 @@ public class ExpressionParser { TokenKind.MulOperator, TokenKind.DivOperator, TokenKind.ModOperator); // Null for everything other than MUL or DIV or MOD while (operatorTokenKind != null) { - final Expression right = parseExprUnary(); checkNumericType(left); + final Expression right = parseExprUnary(); checkNumericType(right); left = new BinaryImpl(left, tokenToBinaryOperator.get(operatorTokenKind), right, odata.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Double)); @@ -306,6 +312,7 @@ public class ExpressionParser { } else if (tokenizer.next(TokenKind.NotOperator)) { final Expression expression = parseExprPrimary(); checkType(expression, EdmPrimitiveTypeKind.Boolean); + checkNoCollection(expression); return new UnaryImpl(UnaryOperatorKind.NOT, expression, getType(expression)); } else if (tokenizer.next(TokenKind.CastMethod)) { return parseIsOfOrCastMethod(MethodKind.CAST); @@ -443,6 +450,7 @@ public class ExpressionParser { case TRIM: final Expression stringParameter = parseExpression(); checkType(stringParameter, EdmPrimitiveTypeKind.String); + checkNoCollection(stringParameter); parameters.add(stringParameter); break; case YEAR: @@ -450,6 +458,7 @@ public class ExpressionParser { case DAY: final Expression dateParameter = parseExpression(); checkType(dateParameter, EdmPrimitiveTypeKind.Date, EdmPrimitiveTypeKind.DateTimeOffset); + checkNoCollection(dateParameter); parameters.add(dateParameter); break; case HOUR: @@ -458,6 +467,7 @@ public class ExpressionParser { case FRACTIONALSECONDS: final Expression timeParameter = parseExpression(); checkType(timeParameter, EdmPrimitiveTypeKind.TimeOfDay, EdmPrimitiveTypeKind.DateTimeOffset); + checkNoCollection(timeParameter); parameters.add(timeParameter); break; case DATE: @@ -465,11 +475,13 @@ public class ExpressionParser { case TOTALOFFSETMINUTES: final Expression dateTimeParameter = parseExpression(); checkType(dateTimeParameter, EdmPrimitiveTypeKind.DateTimeOffset); + checkNoCollection(dateTimeParameter); parameters.add(dateTimeParameter); break; case TOTALSECONDS: final Expression durationParameter = parseExpression(); checkType(durationParameter, EdmPrimitiveTypeKind.Duration); + checkNoCollection(durationParameter); parameters.add(durationParameter); break; case ROUND: @@ -478,12 +490,14 @@ public class ExpressionParser { final Expression decimalParameter = parseExpression(); checkType(decimalParameter, EdmPrimitiveTypeKind.Decimal, EdmPrimitiveTypeKind.Single, EdmPrimitiveTypeKind.Double); + checkNoCollection(decimalParameter); parameters.add(decimalParameter); break; case GEOLENGTH: final Expression geoParameter = parseExpression(); checkType(geoParameter, EdmPrimitiveTypeKind.GeographyLineString, EdmPrimitiveTypeKind.GeometryLineString); + checkNoCollection(geoParameter); parameters.add(geoParameter); break; @@ -495,30 +509,36 @@ public class ExpressionParser { case CONCAT: final Expression stringParameter1 = parseExpression(); checkType(stringParameter1, EdmPrimitiveTypeKind.String); + checkNoCollection(stringParameter1); parameters.add(stringParameter1); ParserHelper.requireNext(tokenizer, TokenKind.COMMA); final Expression stringParameter2 = parseExpression(); checkType(stringParameter2, EdmPrimitiveTypeKind.String); + checkNoCollection(stringParameter2); parameters.add(stringParameter2); break; case GEODISTANCE: final Expression geoParameter1 = parseExpression(); checkType(geoParameter1, EdmPrimitiveTypeKind.GeographyPoint, EdmPrimitiveTypeKind.GeometryPoint); + checkNoCollection(geoParameter1); parameters.add(geoParameter1); ParserHelper.requireNext(tokenizer, TokenKind.COMMA); final Expression geoParameter2 = parseExpression(); checkType(geoParameter2, EdmPrimitiveTypeKind.GeographyPoint, EdmPrimitiveTypeKind.GeometryPoint); + checkNoCollection(geoParameter2); parameters.add(geoParameter2); break; case GEOINTERSECTS: final Expression geoPointParameter = parseExpression(); checkType(geoPointParameter, EdmPrimitiveTypeKind.GeographyPoint, EdmPrimitiveTypeKind.GeometryPoint); + checkNoCollection(geoPointParameter); parameters.add(geoPointParameter); ParserHelper.requireNext(tokenizer, TokenKind.COMMA); final Expression geoPolygonParameter = parseExpression(); checkType(geoPolygonParameter, EdmPrimitiveTypeKind.GeographyPolygon, EdmPrimitiveTypeKind.GeometryPolygon); + checkNoCollection(geoPolygonParameter); parameters.add(geoPolygonParameter); break; @@ -526,6 +546,7 @@ public class ExpressionParser { case SUBSTRING: final Expression parameterFirst = parseExpression(); checkType(parameterFirst, EdmPrimitiveTypeKind.String); + checkNoCollection(parameterFirst); parameters.add(parameterFirst); ParserHelper.requireNext(tokenizer, TokenKind.COMMA); final Expression parameterSecond = parseExpression(); @@ -905,8 +926,9 @@ public class ExpressionParser { } else if (tokenizer.next(TokenKind.ALL)) { uriInfo.addResourcePart(parseLambdaRest(TokenKind.ALL, lastResource)); } else if (tokenizer.next(TokenKind.QualifiedName)) { - final FullQualifiedName fullQualifiedName = new FullQualifiedName(tokenizer.getText()); - parseBoundFunction(fullQualifiedName, uriInfo, lastResource); + parseBoundFunction(new FullQualifiedName(tokenizer.getText()), uriInfo, lastResource); + } else { + throw new UriParserSyntaxException("Unexpected token.", UriParserSyntaxException.MessageKeys.SYNTAX); } } @@ -1071,13 +1093,22 @@ public class ExpressionParser { } } + private void checkNoCollection(final Expression expression) throws UriParserException { + if (expression instanceof Member && ((Member) expression).isCollection()) { + throw new UriParserSemanticException("Collection not allowed.", + UriParserSemanticException.MessageKeys.COLLECTION_NOT_ALLOWED); + } + } + protected void checkIntegerType(final Expression expression) throws UriParserException { + checkNoCollection(expression); checkType(expression, EdmPrimitiveTypeKind.Int64, EdmPrimitiveTypeKind.Int32, EdmPrimitiveTypeKind.Int16, EdmPrimitiveTypeKind.Byte, EdmPrimitiveTypeKind.SByte); } protected void checkNumericType(final Expression expression) throws UriParserException { + checkNoCollection(expression); checkType(expression, EdmPrimitiveTypeKind.Int64, EdmPrimitiveTypeKind.Int32, EdmPrimitiveTypeKind.Int16, EdmPrimitiveTypeKind.Byte, EdmPrimitiveTypeKind.SByte, @@ -1085,6 +1116,9 @@ public class ExpressionParser { } private void checkEqualityTypes(final Expression left, final Expression right) throws UriParserException { + checkNoCollection(left); + checkNoCollection(right); + final EdmType leftType = getType(left); final EdmType rightType = getType(right); if (leftType == null || rightType == null || leftType.equals(rightType)) { @@ -1141,11 +1175,10 @@ public class ExpressionParser { } private void checkRelationTypes(final Expression left, final Expression right) throws UriParserException { + checkNoCollection(left); + checkNoCollection(right); final EdmType leftType = getType(left); final EdmType rightType = getType(right); - if (leftType == null || rightType == null) { - return; - } checkType(left, EdmPrimitiveTypeKind.Int16, EdmPrimitiveTypeKind.Int32, EdmPrimitiveTypeKind.Int64, EdmPrimitiveTypeKind.Byte, EdmPrimitiveTypeKind.SByte, @@ -1160,6 +1193,9 @@ public class ExpressionParser { EdmPrimitiveTypeKind.Boolean, EdmPrimitiveTypeKind.Guid, EdmPrimitiveTypeKind.String, EdmPrimitiveTypeKind.Date, EdmPrimitiveTypeKind.TimeOfDay, EdmPrimitiveTypeKind.DateTimeOffset, EdmPrimitiveTypeKind.Duration); + if (leftType == null || rightType == null) { + return; + } if (!(((EdmPrimitiveType) leftType).isCompatible((EdmPrimitiveType) rightType) || ((EdmPrimitiveType) rightType).isCompatible((EdmPrimitiveType) leftType))) { throw new UriParserSemanticException("Incompatible types.", @@ -1171,11 +1207,10 @@ public class ExpressionParser { private EdmType getAddSubTypeAndCheckLeftAndRight(final Expression left, final Expression right, final boolean isSub) throws UriParserException { + checkNoCollection(left); + checkNoCollection(right); final EdmType leftType = getType(left); final EdmType rightType = getType(right); - if (leftType == null || rightType == null) { - return null; - } if (isType(leftType, EdmPrimitiveTypeKind.Int16, EdmPrimitiveTypeKind.Int32, EdmPrimitiveTypeKind.Int64, EdmPrimitiveTypeKind.Byte, EdmPrimitiveTypeKind.SByte, diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParserSemanticException.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParserSemanticException.java index f2c4634e0..8260af712 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParserSemanticException.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParserSemanticException.java @@ -74,7 +74,8 @@ public class UriParserSemanticException extends UriParserException { /** parameter: expression */ ONLY_FOR_PRIMITIVE_TYPES, /** parameter: function name */ - FUNCTION_MUST_USE_COLLECTIONS; + FUNCTION_MUST_USE_COLLECTIONS, + COLLECTION_NOT_ALLOWED; @Override public String getKey() { diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/MemberImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/MemberImpl.java index 330656535..4a6723187 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/MemberImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/MemberImpl.java @@ -21,6 +21,8 @@ package org.apache.olingo.server.core.uri.queryoption.expression; import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.uri.UriInfoResource; +import org.apache.olingo.server.api.uri.UriResource; +import org.apache.olingo.server.api.uri.UriResourcePartTyped; import org.apache.olingo.server.api.uri.queryoption.expression.ExpressionVisitException; import org.apache.olingo.server.api.uri.queryoption.expression.ExpressionVisitor; import org.apache.olingo.server.api.uri.queryoption.expression.Member; @@ -85,14 +87,10 @@ public class MemberImpl implements Member { @Override public boolean isCollection() { UriInfoImpl uriInfo = (UriInfoImpl) path; - UriResourceImpl lastResourcePart = (UriResourceImpl) uriInfo.getLastResourcePart(); - if (lastResourcePart instanceof UriResourceTypedImpl) { - UriResourceTypedImpl lastTyped = (UriResourceTypedImpl) lastResourcePart; - return lastTyped.isCollection(); - } else if (lastResourcePart instanceof UriResourceActionImpl) { - return ((UriResourceActionImpl) lastResourcePart).isCollection(); - } - return false; + UriResource lastResourcePart = uriInfo.getLastResourcePart(); + return lastResourcePart instanceof UriResourcePartTyped ? + ((UriResourcePartTyped) lastResourcePart).isCollection() : + false; } @Override diff --git a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties index 831fe37d8..5768565d4 100644 --- a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties +++ b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties @@ -76,6 +76,7 @@ UriParserSemanticException.NOT_A_MEDIA_RESOURCE=The resource '%1$s' is not a med UriParserSemanticException.IS_PROPERTY=The identifier '%1$s' is already used as a property. UriParserSemanticException.ONLY_FOR_PRIMITIVE_TYPES='%1$s' is only allowed for primitive-type expressions. UriParserSemanticException.FUNCTION_MUST_USE_COLLECTIONS=Only bound functions with collections of structural types as binding parameter and as return type are allowed; '%1$s' is not such a function. +UriParserSemanticException.COLLECTION_NOT_ALLOWED=A collection expression is not allowed. UriValidationException.UNSUPPORTED_QUERY_OPTION=The query option '%1$s' is not supported. UriValidationException.UNSUPPORTED_URI_KIND=The URI kind '%1$s' is not supported. diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ExpandParserTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ExpandParserTest.java new file mode 100644 index 000000000..ebc4cc6e2 --- /dev/null +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ExpandParserTest.java @@ -0,0 +1,561 @@ +/* + * 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.uri.parser; + +import java.util.Collections; + +import org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.edmx.EdmxReference; +import org.apache.olingo.server.api.OData; +import org.apache.olingo.server.api.uri.UriInfoKind; +import org.apache.olingo.server.core.uri.parser.UriParserSemanticException.MessageKeys; +import org.apache.olingo.server.core.uri.testutil.TestUriValidator; +import org.apache.olingo.server.tecsvc.provider.ComplexTypeProvider; +import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; +import org.apache.olingo.server.tecsvc.provider.EntityTypeProvider; +import org.apache.olingo.server.tecsvc.provider.PropertyProvider; +import org.junit.Test; + +/** Tests of the parts of the URI parser that parse the sytem query option $expand. */ +public class ExpandParserTest { + + private static final Edm edm = OData.newInstance().createServiceMetadata( + new EdmTechProvider(), Collections. emptyList()).getEdm(); + + private final TestUriValidator testUri = new TestUriValidator().setEdm(edm); + + @Test + public void expandStar() throws Exception { + testUri.run("ESKeyNav(1)", "$expand=*") + .isKind(UriInfoKind.resource).goExpand() + .first() + .isSegmentStar(); + + testUri.run("ESKeyNav(1)", "$expand=*/$ref") + .isKind(UriInfoKind.resource).goExpand() + .first() + .isSegmentStar() + .isSegmentRef(); + + testUri.run("ESKeyNav(1)", "$expand=*/$ref,NavPropertyETKeyNavMany") + .isKind(UriInfoKind.resource).goExpand() + .first() + .isSegmentStar().isSegmentRef() + .next() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); + + testUri.run("ESKeyNav(1)", "$expand=*($levels=3)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .isSegmentStar() + .isLevelText("3"); + + testUri.run("ESKeyNav(1)", "$expand=*($levels=max)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .isSegmentStar() + .isLevelText("max"); + } + + @Test + public void expandNavigationRef() throws Exception { + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .n().isRef(); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavOne/$ref") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .isType(EntityTypeProvider.nameETKeyNav, false) + .n().isRef(); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($filter=PropertyInt16 eq 1)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .n().isRef() + .goUpExpandValidator().goFilter().is("< eq <1>>"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($orderby=PropertyInt16)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .n().isRef() + .goUpExpandValidator() + .isSortOrder(0, false) + .goOrder(0).goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($skip=1)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .n().isRef() + .goUpExpandValidator() + .isSkipText("1"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($top=2)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .n().isRef() + .goUpExpandValidator() + .isTopText("2"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($count=true)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .n().isRef() + .goUpExpandValidator() + .isInlineCountText("true"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($skip=1;$top=3)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .n().isRef() + .goUpExpandValidator() + .isSkipText("1") + .isTopText("3"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($skip=1%3b$top=3)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .n().isRef() + .goUpExpandValidator() + .isSkipText("1") + .isTopText("3"); + } + + @Test + public void expandNavigationCount() throws Exception { + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$count") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .n().isCount(); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavOne/$count") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .isType(EntityTypeProvider.nameETKeyNav, false) + .n().isCount(); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$count($filter=PropertyInt16 gt 1)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .n().isCount() + .goUpExpandValidator() + .goFilter().is("< gt <1>>"); + } + + @Test + public void expandNavigationOptions() throws Exception { + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($filter=PropertyInt16 eq 1)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator().goFilter().is("< eq <1>>"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($orderby=PropertyInt16)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator() + .isSortOrder(0, false) + .goOrder(0).goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($skip=1)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator() + .isSkipText("1"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($top=2)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator() + .isTopText("2"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($count=true)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator() + .isInlineCountText("true"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($select=PropertyString)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator() + .goSelectItem(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($expand=NavPropertyETTwoKeyNavOne)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator() + .goExpand() + .goPath().first() + .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($expand=NavPropertyETKeyNavMany)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator() + .goExpand() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavOne($levels=5)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .isType(EntityTypeProvider.nameETKeyNav, false) + .goUpExpandValidator() + .isLevelText("5"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($select=PropertyString)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator() + .goSelectItem(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavOne($levels=max)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .isType(EntityTypeProvider.nameETKeyNav, false) + .goUpExpandValidator() + .isLevelText("max"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($skip=1;$top=2)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator() + .isSkipText("1") + .isTopText("2"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($skip=1%3b$top=2)") + .isKind(UriInfoKind.resource).goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator() + .isSkipText("1") + .isTopText("2"); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($search=Country AND Western)") + .isKind(UriInfoKind.resource).goExpand() + .first().goPath().first().isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .goUpExpandValidator() + .isSearchSerialized("{'Country' AND 'Western'}"); + + testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='Hugo')", "$expand=NavPropertyETKeyNavMany") + .isKind(UriInfoKind.resource).goPath() + .first() + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'Hugo'") + .goUpUriValidator().goExpand() + .first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav, true); + } + + @Test + public void expandTypeCasts() throws Exception { + testUri.run("ESTwoKeyNav", "$expand=olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETKeyNavMany") + .isKind(UriInfoKind.resource) + .goExpand().first() + .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); + + testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='Hugo')", + "$expand=olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETKeyNavMany") + .isKind(UriInfoKind.resource).goPath().first() + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'Hugo'") + .goUpUriValidator().goExpand().first() + .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) + .goPath().first() + .isType(EntityTypeProvider.nameETKeyNav) + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); + + testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')", + "$expand=olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETTwoKeyNavMany") + .isKind(UriInfoKind.resource).goPath().first() + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .goUpUriValidator().goExpand().first() + .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) + .goPath().first() + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true); + + testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')", + "$expand=olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETTwoBaseTwoKeyNav") + .isKind(UriInfoKind.resource).goPath().first() + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .goUpUriValidator().goExpand().first() + .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) + .goPath().first() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBaseTwoKeyNav); + + testUri.run("ESTwoKeyNav", "$expand=olingo.odata.test1.ETBaseTwoKeyNav/PropertyCompNav/NavPropertyETTwoKeyNavOne") + .isKind(UriInfoKind.resource) + .goExpand().first() + .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) + .goPath().first() + .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false) + .n() + .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); + + testUri.run("ESTwoKeyNav", "$expand=olingo.odata.test1.ETBaseTwoKeyNav/PropertyCompNav/*") + .isKind(UriInfoKind.resource) + .goExpand().first() + .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) + .isSegmentStar() + .goPath().first().isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false); + + testUri.run("ESTwoKeyNav", "$expand=olingo.odata.test1.ETBaseTwoKeyNav/PropertyCompNav" + + "/olingo.odata.test1.CTTwoBasePrimCompNav/NavPropertyETTwoKeyNavOne") + .isKind(UriInfoKind.resource) + .goExpand().first() + .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) + .goPath().first() + .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false) + .isTypeFilter(ComplexTypeProvider.nameCTTwoBasePrimCompNav) + .n() + .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); + + testUri.run("ESKeyNav", "$expand=NavPropertyETTwoKeyNavMany/Namespace1_Alias.ETBaseTwoKeyNav" + + "($expand=NavPropertyETBaseTwoKeyNavOne)") + .isKind(UriInfoKind.resource) + .goExpand().goPath().first() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .goUpExpandValidator() + // go to the expand options of the current expand + .goExpand() + .goPath().first() + .isNavProperty("NavPropertyETBaseTwoKeyNavOne", EntityTypeProvider.nameETBaseTwoKeyNav, false); + + testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref,NavPropertyETTwoKeyNavMany($skip=2;$top=1)") + .isKind(UriInfoKind.resource) + .goExpand().first() + .goPath() + .first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .n().isRef() + .goUpExpandValidator() + .next() + .goPath() + .first().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .goUpExpandValidator() + .isSkipText("2") + .isTopText("1"); + + testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')", "$expand=olingo.odata.test1.ETBaseTwoKeyNav" + + "/NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETTwoBaseTwoKeyNav($select=PropertyString)") + .isKind(UriInfoKind.resource).goPath() + .first() + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .goUpUriValidator().goExpand().first() + .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) + .goPath().first() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBaseTwoKeyNav) + .goUpExpandValidator() + .goSelectItem(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testUri.run("ESKeyNav", "$expand=NavPropertyETKeyNavOne($expand=NavPropertyETKeyNavMany(" + + "$expand=NavPropertyETKeyNavOne))") + .isKind(UriInfoKind.resource) + .goExpand().first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .isType(EntityTypeProvider.nameETKeyNav) + .goUpExpandValidator() + .goExpand().first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) + .isType(EntityTypeProvider.nameETKeyNav) + .goUpExpandValidator() + .goExpand().first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .isType(EntityTypeProvider.nameETKeyNav); + + testUri.run("ESKeyNav", "$expand=NavPropertyETKeyNavOne($select=PropertyInt16)") + .isKind(UriInfoKind.resource) + .goExpand().first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .isType(EntityTypeProvider.nameETKeyNav) + .goUpExpandValidator() + .goSelectItem(0).isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testUri.run("ESKeyNav", "$expand=NavPropertyETKeyNavOne($select=PropertyCompNav/PropertyInt16)") + .isKind(UriInfoKind.resource) + .goExpand().first() + .goPath().first() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .isType(EntityTypeProvider.nameETKeyNav) + .goUpExpandValidator() + .goSelectItem(0) + .first().isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTNavFiveProp, false) + .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testUri.runEx("ESKeyNav", "$expand=undefined") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + testUri.runEx("ESTwoKeyNav", "$expand=PropertyCompNav/undefined") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + testUri.runEx("ESTwoKeyNav", "$expand=PropertyCompNav/*+") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + } + + @Test + public void duplicatedSystemQueryOptionsInExpand() throws Exception { + testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($select=PropertyInt16;$select=PropertyInt16)") + .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); + + testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($filter=true;$filter=true)") + .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); + + testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($orderby=PropertyInt16;$orderby=PropertyInt16)") + .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); + + testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($levels=2;$levels=3)") + .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); + + testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($expand=*;$expand=*)") + .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); + + testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($count=true;$count=true)") + .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); + + testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($top=1;$top=1)") + .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); + + testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($skip=2;$skip=2)") + .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); + + testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($search=Test;$search=Test)") + .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); + } + + @Test + public void simpleKeyInExpandSystemQueryOption() throws Exception { + testUri.runEx("ESAllPrim(0)", "$expand=NavPropertyETTwoPrimMany(-365)($filter=PropertyString eq 'Test String1')") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + } + + @Test + public void compoundKeyInExpandSystemQueryOption() throws Exception { + testUri.runEx("ESAllPrim(0)", "$expand=NavPropertyETTwoPrimMany(PropertyInt16=1,PropertyString=2)" + + "($filter=PropertyString eq 'Test String1')") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + } + + @Test + public void keyPredicatesInExpandFilter() throws Exception { + testUri.run("ESKeyNav(0)", "$expand=NavPropertyETTwoKeyNavMany($filter=NavPropertyETTwoKeyNavMany" + + "(PropertyInt16=1,PropertyString='2')/PropertyInt16 eq 1)").goExpand() + .first().goPath().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .goUpExpandValidator().goFilter() + .is("< eq <1>>"); + } + + @Test + public void keyPredicatesInDoubleExpandedFilter() throws Exception { + testUri.run("ESKeyNav(0)", "$expand=NavPropertyETTwoKeyNavMany($expand=NavPropertyETTwoKeyNavMany" + + "($filter=NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='2')/PropertyInt16 eq 1))") + .goExpand() + .first().goPath().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .goUpExpandValidator().goExpand() + .first().goPath().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .goUpExpandValidator().goFilter() + .is("< eq <1>>"); + } +} diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java new file mode 100644 index 000000000..c2677541e --- /dev/null +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java @@ -0,0 +1,2389 @@ +/* + * 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.uri.parser; + +import java.util.Arrays; +import java.util.Collections; + +import org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; +import org.apache.olingo.commons.api.edmx.EdmxReference; +import org.apache.olingo.server.api.OData; +import org.apache.olingo.server.api.uri.UriResourceKind; +import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind; +import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind; +import org.apache.olingo.server.core.uri.parser.UriParserSemanticException.MessageKeys; +import org.apache.olingo.server.core.uri.testutil.FilterValidator; +import org.apache.olingo.server.core.uri.validator.UriValidationException; +import org.apache.olingo.server.tecsvc.provider.ComplexTypeProvider; +import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; +import org.apache.olingo.server.tecsvc.provider.EntityTypeProvider; +import org.apache.olingo.server.tecsvc.provider.EnumTypeProvider; +import org.apache.olingo.server.tecsvc.provider.PropertyProvider; +import org.apache.olingo.server.tecsvc.provider.TypeDefinitionProvider; +import org.junit.Test; + +/** Tests of the parts of the URI parser that parse the sytem query options $filter and $orderby. */ +public class ExpressionParserTest { + + private static final OData oData = OData.newInstance(); + private static final Edm edm = oData.createServiceMetadata( + new EdmTechProvider(), Collections. emptyList()).getEdm(); + + private final FilterValidator testFilter = new FilterValidator().setEdm(edm); + + @Test + public void filter() throws Exception { + testFilter.runOnETAllPrim("PropertyBoolean") + .is("") + .isType(PropertyProvider.nameBoolean); + + testFilter.runOnETTwoKeyNav("PropertyComp/PropertyInt16 gt 0") + .is("< gt <0>>") + .left().isType(PropertyProvider.nameInt16); + + testFilter.runOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyDate ne null") + .is("< ne >") + .left().isType(PropertyProvider.nameDate); + + testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne eq null") + .is("< eq >") + .left().isType(EntityTypeProvider.nameETTwoKeyNav); + + testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyString eq ''") + .is("< eq <''>>") + .left().isType(PropertyProvider.nameString); + + testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComp eq null") + .is("< eq >") + .left().isType(ComplexTypeProvider.nameCTPrimComp); + + testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComp/PropertyComp eq null") + .is("< eq >") + .left().isType(ComplexTypeProvider.nameCTAllPrim); + + testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComp/PropertyInt16 eq 1") + .is("< eq <1>>") + .left().isType(PropertyProvider.nameInt16) + .root().right().isLiteral("1"); + + testFilter.runOnETTwoKeyNav("NavPropertyETKeyNavMany(1)/NavPropertyETTwoKeyNavMany(PropertyString='2')/" + + "PropertyString eq 'SomeString'") + .is("< eq <'SomeString'>>") + .left() + .isType(PropertyProvider.nameString) + .isMember().goPath() + .first() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicateRef(0, "PropertyInt16", "PropertyInt16") + .isKeyPredicate(1, "PropertyString", "'2'") + .n() + .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .goUpFilterValidator() + .root().right(); + + testFilter.runOnETTwoKeyNav("olingo.odata.test1.ETBaseTwoKeyNav/PropertyDate eq 2013-11-12") + .is("< eq <2013-11-12>>") + .left() + .isType(PropertyProvider.nameDate) + .isMember().isMemberStartType(EntityTypeProvider.nameETBaseTwoKeyNav).goPath() + .first().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) + .goUpFilterValidator() + .root().right() + .isLiteral("2013-11-12"); + + testFilter.runOnCTTwoPrim("olingo.odata.test1.CTBase/AdditionalPropString eq 'SomeString'") + .is("< eq <'SomeString'>>") + .left() + .isType(PropertyProvider.nameString) + .isMember().isMemberStartType(ComplexTypeProvider.nameCTBase).goPath() + .first().isPrimitiveProperty("AdditionalPropString", PropertyProvider.nameString, false) + .goUpFilterValidator() + .root().right() + .isLiteral("'SomeString'"); + + testFilter + .runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/olingo.odata.test1.ETBaseTwoKeyNav/PropertyDate eq 2013-11-12") + .is("< eq <2013-11-12>>") + .left() + .isType(PropertyProvider.nameDate) + .root().right() + .isLiteral("2013-11-12"); + + testFilter + .runOnETTwoKeyNav("PropertyCompTwoPrim/olingo.odata.test1.CTTwoBase/AdditionalPropString eq 'SomeString'") + .is("< eq <'SomeString'>>") + .left() + .isType(PropertyProvider.nameString) + .root().right() + .isLiteral("'SomeString'"); + + testFilter.runOnETTwoKeyNavEx("invalid").isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + testFilter.runOnETTwoKeyNavEx("PropertyComp").isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); + testFilter.runOnETTwoKeyNavEx("PropertyComp/invalid").isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + testFilter.runOnETTwoKeyNavEx("CollPropertyComp/") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testFilter.runOnETTwoKeyNavEx("concat('a','b')/invalid").isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); + testFilter.runOnETTwoKeyNavEx("PropertyComp/concat('a','b')") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + testFilter.runOnETTwoKeyNavEx("PropertyComp/PropertyInt16 eq '1'") + .isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); + testFilter.runOnETTwoKeyNavEx("PropertyComp/PropertyComp/PropertyDate eq 1") + .isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); + testFilter.runOnETTwoKeyNavEx("PropertyComp/PropertyComp/PropertyString eq 1") + .isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); + testFilter.runOnETTwoKeyNavEx("PropertyComp/PropertyInt64 eq 1") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + testFilter.runOnETTwoKeyNavEx("NavPropertyETKeyNavMany/PropertyInt16 gt 42") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testFilter.runOnETTwoKeyNavEx("NavPropertyETKeyNavMany/NavPropertyETTwoKeyNavOne eq null") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testFilter.runOnETTwoKeyNavEx("NavPropertyETKeyNavMany ne null").isExSemantic(MessageKeys.COLLECTION_NOT_ALLOWED); + testFilter.runOnETTwoKeyNavEx("CollPropertyString eq 'SomeString'") + .isExSemantic(MessageKeys.COLLECTION_NOT_ALLOWED); + testFilter.runOnETTwoKeyNavEx("NavPropertyETKeyNavMany").isExSemantic(MessageKeys.COLLECTION_NOT_ALLOWED); + testFilter.runOnETTwoKeyNavEx("olingo.odata.test1.ETBaseTwoKeyNav/PropertyDate") + .isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); + testFilter.runUriEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString='2')", + "$filter=olingo.odata.test1.CTBase/AdditionalPropString") + .isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); + } + + @Test + public void filterUnaryOperators() throws Exception { + testFilter.runOnETAllPrim("not PropertyBoolean").is(">"); + testFilter.runOnETAllPrim("-PropertyInt16 eq PropertyInt16").is("<<- > eq >"); + } + + @Test + public void filterBinaryOperators() throws Exception { + testFilter.runOnETAllPrim("PropertySByte eq PropertySByte") + .is("< eq >") + .isBinary(BinaryOperatorKind.EQ) + .left().isType(PropertyProvider.nameSByte) + .root().right().isType(PropertyProvider.nameSByte); + + testFilter.runOnETAllPrim("PropertySByte ne PropertySByte") + .is("< ne >") + .isBinary(BinaryOperatorKind.NE) + .left().isType(PropertyProvider.nameSByte) + .root().right().isType(PropertyProvider.nameSByte); + + testFilter.runOnETAllPrim("PropertySByte add PropertySByte gt 0") + .is("<< add > gt <0>>") + .left().left().isType(PropertyProvider.nameSByte) + .root().left().right().isType(PropertyProvider.nameSByte); + + testFilter.runOnETAllPrim("PropertyByte add PropertyByte gt 0") + .is("<< add > gt <0>>") + .left().left().isType(PropertyProvider.nameByte) + .root().left().right().isType(PropertyProvider.nameByte); + testFilter.runOnETAllPrim("PropertyInt16 add PropertyInt16 gt 0") + .is("<< add > gt <0>>") + .left().left().isType(PropertyProvider.nameInt16) + .root().left().right().isType(PropertyProvider.nameInt16); + testFilter.runOnETAllPrim("PropertyInt32 add PropertyInt32 gt 0") + .is("<< add > gt <0>>") + .left().left().isType(PropertyProvider.nameInt32) + .root().left().right().isType(PropertyProvider.nameInt32); + testFilter.runOnETAllPrim("PropertyInt64 add PropertyInt64 gt 0") + .is("<< add > gt <0>>") + .left().left().isType(PropertyProvider.nameInt64) + .root().left().right().isType(PropertyProvider.nameInt64); + testFilter.runOnETAllPrim("PropertySingle add PropertySingle gt 0") + .is("<< add > gt <0>>") + .left().left().isType(PropertyProvider.nameSingle) + .root().left().right().isType(PropertyProvider.nameSingle); + testFilter.runOnETAllPrim("PropertyDouble add PropertyDouble gt 0") + .is("<< add > gt <0>>") + .left().left().isType(PropertyProvider.nameDouble) + .root().left().right().isType(PropertyProvider.nameDouble); + testFilter.runOnETAllPrim("PropertyDecimal add PropertyDecimal gt 0") + .is("<< add > gt <0>>") + .left().left().isType(PropertyProvider.nameDecimal) + .root().left().right().isType(PropertyProvider.nameDecimal); + testFilter.runOnETAllPrim("PropertySByte add PropertyDecimal gt 0") + .is("<< add > gt <0>>") + .left().left().isType(PropertyProvider.nameSByte) + .root().left().right().isType(PropertyProvider.nameDecimal); + testFilter.runOnETAllPrim("PropertySByte add PropertyInt32 gt 0") + .is("<< add > gt <0>>") + .left().left().isType(PropertyProvider.nameSByte) + .root().left().right().isType(PropertyProvider.nameInt32); + testFilter.runOnETAllPrim("PropertySByte add PropertyInt64 gt 0") + .is("<< add > gt <0>>") + .left().left().isType(PropertyProvider.nameSByte) + .root().left().right().isType(PropertyProvider.nameInt64); + testFilter.runOnETAllPrim("PropertyDateTimeOffset add PropertyDuration ne null") + .is("<< add > ne >") + .left().left().isType(PropertyProvider.nameDateTimeOffset) + .root().left().right().isType(PropertyProvider.nameDuration); + testFilter.runOnETAllPrim("PropertyDuration add PropertyDuration ne null") + .is("<< add > ne >") + .left().left().isType(PropertyProvider.nameDuration) + .root().left().right().isType(PropertyProvider.nameDuration); + testFilter.runOnETAllPrim("PropertyDate add PropertyDuration ne null") + .is("<< add > ne >") + .left().left().isType(PropertyProvider.nameDate) + .root().left().right().isType(PropertyProvider.nameDuration); + testFilter.runOnETAllPrim("PropertySByte sub PropertySByte gt 0") + .is("<< sub > gt <0>>") + .left().left().isType(PropertyProvider.nameSByte) + .root().left().right().isType(PropertyProvider.nameSByte); + testFilter.runOnETAllPrim("PropertyByte sub PropertyByte gt 0") + .is("<< sub > gt <0>>") + .left().left().isType(PropertyProvider.nameByte) + .root().left().right().isType(PropertyProvider.nameByte); + testFilter.runOnETAllPrim("PropertyInt16 sub PropertyInt16 gt 0") + .is("<< sub > gt <0>>") + .left().left().isType(PropertyProvider.nameInt16) + .root().left().right().isType(PropertyProvider.nameInt16); + testFilter.runOnETAllPrim("PropertyInt32 sub PropertyInt32 gt 0") + .is("<< sub > gt <0>>") + .left().left().isType(PropertyProvider.nameInt32) + .root().left().right().isType(PropertyProvider.nameInt32); + testFilter.runOnETAllPrim("PropertyInt64 sub PropertyInt64 gt 0") + .is("<< sub > gt <0>>") + .left().left().isType(PropertyProvider.nameInt64) + .root().left().right().isType(PropertyProvider.nameInt64); + testFilter.runOnETAllPrim("PropertySingle sub PropertySingle gt 0") + .is("<< sub > gt <0>>") + .left().left().isType(PropertyProvider.nameSingle) + .root().left().right().isType(PropertyProvider.nameSingle); + testFilter.runOnETAllPrim("PropertyDouble sub PropertyDouble gt 0") + .is("<< sub > gt <0>>") + .left().left().isType(PropertyProvider.nameDouble) + .root().left().right().isType(PropertyProvider.nameDouble); + testFilter.runOnETAllPrim("PropertyDecimal sub PropertyDecimal gt 0") + .is("<< sub > gt <0>>") + .left().left().isType(PropertyProvider.nameDecimal) + .root().left().right().isType(PropertyProvider.nameDecimal); + testFilter.runOnETAllPrim("PropertyDecimal sub PropertyInt32 gt 0") + .is("<< sub > gt <0>>") + .left().left().isType(PropertyProvider.nameDecimal) + .root().left().right().isType(PropertyProvider.nameInt32); + testFilter.runOnETAllPrim("PropertyDecimal sub PropertyInt64 gt 0") + .is("<< sub > gt <0>>") + .left().left().isType(PropertyProvider.nameDecimal) + .root().left().right().isType(PropertyProvider.nameInt64); + testFilter.runOnETAllPrim("PropertyDecimal sub PropertyByte gt 0") + .is("<< sub > gt <0>>") + .left().left().isType(PropertyProvider.nameDecimal) + .root().left().right().isType(PropertyProvider.nameByte); + testFilter.runOnETAllPrim("PropertyDateTimeOffset sub PropertyDuration ne null") + .is("<< sub > ne >") + .left().left().isType(PropertyProvider.nameDateTimeOffset) + .root().left().right().isType(PropertyProvider.nameDuration); + testFilter.runOnETAllPrim("PropertyDuration sub PropertyDuration ne null") + .is("<< sub > ne >") + .left().left().isType(PropertyProvider.nameDuration) + .root().left().right().isType(PropertyProvider.nameDuration); + testFilter.runOnETAllPrim("PropertyDateTimeOffset sub PropertyDateTimeOffset ne null") + .is("<< sub > ne >") + .left().left().isType(PropertyProvider.nameDateTimeOffset) + .root().left().right().isType(PropertyProvider.nameDateTimeOffset); + testFilter.runOnETAllPrim("PropertyDate sub PropertyDuration ne null") + .is("<< sub > ne >") + .left().left().isType(PropertyProvider.nameDate) + .root().left().right().isType(PropertyProvider.nameDuration); + testFilter.runOnETAllPrim("PropertyDate sub PropertyDate ne null") + .is("<< sub > ne >") + .left().left().isType(PropertyProvider.nameDate) + .root().left().right().isType(PropertyProvider.nameDate); + testFilter.runOnETAllPrim("PropertySByte mul PropertySByte gt 0") + .is("<< mul > gt <0>>") + .left().left().isType(PropertyProvider.nameSByte) + .root().left().right().isType(PropertyProvider.nameSByte); + testFilter.runOnETAllPrim("PropertyByte mul PropertyByte gt 0") + .is("<< mul > gt <0>>") + .left().left().isType(PropertyProvider.nameByte) + .root().left().right().isType(PropertyProvider.nameByte); + testFilter.runOnETAllPrim("PropertyInt16 mul PropertyInt16 gt 0") + .is("<< mul > gt <0>>") + .left().left().isType(PropertyProvider.nameInt16) + .root().left().right().isType(PropertyProvider.nameInt16); + testFilter.runOnETAllPrim("PropertyInt32 mul PropertyInt32 gt 0") + .is("<< mul > gt <0>>") + .left().left().isType(PropertyProvider.nameInt32) + .root().left().right().isType(PropertyProvider.nameInt32); + testFilter.runOnETAllPrim("PropertyInt64 mul PropertyInt64 gt 0") + .is("<< mul > gt <0>>") + .left().left().isType(PropertyProvider.nameInt64) + .root().left().right().isType(PropertyProvider.nameInt64); + testFilter.runOnETAllPrim("PropertySingle mul PropertySingle gt 0") + .is("<< mul > gt <0>>") + .left().left().isType(PropertyProvider.nameSingle) + .root().left().right().isType(PropertyProvider.nameSingle); + testFilter.runOnETAllPrim("PropertyDouble mul PropertyDouble gt 0") + .is("<< mul > gt <0>>") + .left().left().isType(PropertyProvider.nameDouble) + .root().left().right().isType(PropertyProvider.nameDouble); + testFilter.runOnETAllPrim("PropertyDecimal mul PropertyDecimal gt 0") + .is("<< mul > gt <0>>") + .left().left().isType(PropertyProvider.nameDecimal) + .root().left().right().isType(PropertyProvider.nameDecimal); + testFilter.runOnETAllPrim("PropertyInt64 mul PropertyInt32 gt 0") + .is("<< mul > gt <0>>") + .left().left().isType(PropertyProvider.nameInt64) + .root().left().right().isType(PropertyProvider.nameInt32); + testFilter.runOnETAllPrim("PropertyInt64 mul PropertySByte gt 0") + .is("<< mul > gt <0>>") + .left().left().isType(PropertyProvider.nameInt64) + .root().left().right().isType(PropertyProvider.nameSByte); + testFilter.runOnETAllPrim("PropertyInt64 mul PropertyDecimal gt 0") + .is("<< mul > gt <0>>") + .left().left().isType(PropertyProvider.nameInt64) + .root().left().right().isType(PropertyProvider.nameDecimal); + testFilter.runOnETAllPrim("PropertySByte div PropertySByte gt 0") + .is("<< div > gt <0>>") + .left().left().isType(PropertyProvider.nameSByte) + .root().left().right().isType(PropertyProvider.nameSByte); + testFilter.runOnETAllPrim("PropertyByte div PropertyByte gt 0") + .is("<< div > gt <0>>") + .left().left().isType(PropertyProvider.nameByte) + .root().left().right().isType(PropertyProvider.nameByte); + testFilter.runOnETAllPrim("PropertyInt16 div PropertyInt16 gt 0") + .is("<< div > gt <0>>") + .left().left().isType(PropertyProvider.nameInt16) + .root().left().right().isType(PropertyProvider.nameInt16); + testFilter.runOnETAllPrim("PropertyInt32 div PropertyInt32 gt 0") + .is("<< div > gt <0>>") + .left().left().isType(PropertyProvider.nameInt32) + .root().left().right().isType(PropertyProvider.nameInt32); + testFilter.runOnETAllPrim("PropertyInt64 div PropertyInt64 gt 0") + .is("<< div > gt <0>>") + .left().left().isType(PropertyProvider.nameInt64) + .root().left().right().isType(PropertyProvider.nameInt64); + testFilter.runOnETAllPrim("PropertySingle div PropertySingle gt 0") + .is("<< div > gt <0>>") + .left().left().isType(PropertyProvider.nameSingle) + .root().left().right().isType(PropertyProvider.nameSingle); + testFilter.runOnETAllPrim("PropertyDouble div PropertyDouble gt 0") + .is("<< div > gt <0>>") + .left().left().isType(PropertyProvider.nameDouble) + .root().left().right().isType(PropertyProvider.nameDouble); + testFilter.runOnETAllPrim("PropertyDecimal div PropertyDecimal gt 0") + .is("<< div > gt <0>>") + .left().left().isType(PropertyProvider.nameDecimal) + .root().left().right().isType(PropertyProvider.nameDecimal); + testFilter.runOnETAllPrim("PropertyByte div PropertyInt32 gt 0") + .is("<< div > gt <0>>") + .left().left().isType(PropertyProvider.nameByte) + .root().left().right().isType(PropertyProvider.nameInt32); + testFilter.runOnETAllPrim("PropertyByte div PropertyDecimal gt 0") + .is("<< div > gt <0>>") + .left().left().isType(PropertyProvider.nameByte) + .root().left().right().isType(PropertyProvider.nameDecimal); + testFilter.runOnETAllPrim("PropertyByte div PropertySByte gt 0") + .is("<< div > gt <0>>") + .left().left().isType(PropertyProvider.nameByte) + .root().left().right().isType(PropertyProvider.nameSByte); + + testFilter.runOnETAllPrim("PropertyByte div 0 gt 0") + .is("<< div <0>> gt <0>>"); + + testFilter.runOnETAllPrim("0 div 0 gt 0") + .is("<<<0> div <0>> gt <0>>"); + + testFilter.runOnETAllPrim("PropertySByte mod PropertySByte gt 0") + .is("<< mod > gt <0>>") + .left().left().isType(PropertyProvider.nameSByte) + .root().left().right().isType(PropertyProvider.nameSByte); + testFilter.runOnETAllPrim("PropertyByte mod PropertyByte gt 0") + .is("<< mod > gt <0>>") + .left().left().isType(PropertyProvider.nameByte) + .root().left().right().isType(PropertyProvider.nameByte); + testFilter.runOnETAllPrim("PropertyInt16 mod PropertyInt16 gt 0") + .is("<< mod > gt <0>>") + .left().left().isType(PropertyProvider.nameInt16) + .root().left().right().isType(PropertyProvider.nameInt16); + testFilter.runOnETAllPrim("PropertyInt32 mod PropertyInt32 gt 0") + .is("<< mod > gt <0>>") + .left().left().isType(PropertyProvider.nameInt32) + .root().left().right().isType(PropertyProvider.nameInt32); + testFilter.runOnETAllPrim("PropertyInt64 mod PropertyInt64 gt 0") + .is("<< mod > gt <0>>") + .left().left().isType(PropertyProvider.nameInt64) + .root().left().right().isType(PropertyProvider.nameInt64); + testFilter.runOnETAllPrim("PropertySingle mod PropertySingle gt 0") + .is("<< mod > gt <0>>") + .left().left().isType(PropertyProvider.nameSingle) + .root().left().right().isType(PropertyProvider.nameSingle); + testFilter.runOnETAllPrim("PropertyDouble mod PropertyDouble gt 0") + .is("<< mod > gt <0>>") + .left().left().isType(PropertyProvider.nameDouble) + .root().left().right().isType(PropertyProvider.nameDouble); + testFilter.runOnETAllPrim("PropertyDecimal mod PropertyDecimal gt 0") + .is("<< mod > gt <0>>") + .left().left().isType(PropertyProvider.nameDecimal) + .root().left().right().isType(PropertyProvider.nameDecimal); + + testFilter.runOnETAllPrim("PropertyDecimal ge PropertyDecimal") + .is("< ge >") + .isBinary(BinaryOperatorKind.GE) + .left().isType(PropertyProvider.nameDecimal) + .root().right().isType(PropertyProvider.nameDecimal); + testFilter.runOnETAllPrim("PropertyDecimal lt PropertyDecimal") + .is("< lt >") + .isBinary(BinaryOperatorKind.LT) + .left().isType(PropertyProvider.nameDecimal) + .root().right().isType(PropertyProvider.nameDecimal); + testFilter.runOnETAllPrim("PropertyDecimal le PropertyDecimal") + .is("< le >") + .isBinary(BinaryOperatorKind.LE) + .left().isType(PropertyProvider.nameDecimal) + .root().right().isType(PropertyProvider.nameDecimal); + + // Numeric promotion: Double is considered the widest type. + testFilter.runOnETAllPrim("PropertyDecimal ne NaN") + .right().isLiteral("NaN").isType(PropertyProvider.nameDouble); + testFilter.runOnETAllPrim("PropertyDecimal gt -INF") + .right().isLiteral("-INF").isType(PropertyProvider.nameDouble); + testFilter.runOnETAllPrim("PropertyDecimal lt INF") + .right().isLiteral("INF").isType(PropertyProvider.nameDouble); + + testFilter.runOnETAllPrim("PropertyInt16 gt null") + .left().isType(PropertyProvider.nameInt16); + + testFilter.runOnETKeyNavEx("binary'Yw==' gt null").isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); + testFilter.runOnETKeyNavEx("NavPropertyETKeyNavOne gt null").isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); + testFilter.runOnETKeyNavEx("NavPropertyETKeyNavMany gt null").isExSemantic(MessageKeys.COLLECTION_NOT_ALLOWED); + } + + @Test + public void filterProperties() throws Exception { + testFilter.runOnETAllPrim("PropertyBoolean eq true") + .is("< eq >") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyBoolean", PropertyProvider.nameBoolean, false) + .goUpFilterValidator() + .root().right().isLiteral("true"); + + testFilter.runOnETAllPrim("PropertyDecimal eq 1.25") + .is("< eq <1.25>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyDecimal", PropertyProvider.nameDecimal, false) + .goUpFilterValidator() + .root().right().isLiteral("1.25"); + + testFilter.runOnETAllPrim("PropertyDouble eq 1.5") + .is("< eq <1.5>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyDouble", PropertyProvider.nameDouble, false) + .goUpFilterValidator() + .root().right().isLiteral("1.5"); + + testFilter.runOnETAllPrim("PropertySingle eq 1.5") + .is("< eq <1.5>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertySingle", PropertyProvider.nameSingle, false) + .goUpFilterValidator() + .root().right().isLiteral("1.5"); + + testFilter.runOnETAllPrim("PropertySByte eq -128") + .is("< eq <-128>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertySByte", PropertyProvider.nameSByte, false) + .goUpFilterValidator() + .root().right().isLiteral("-128"); + + testFilter.runOnETAllPrim("PropertyByte eq 255") + .is("< eq <255>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyByte", PropertyProvider.nameByte, false) + .goUpFilterValidator() + .root().right().isLiteral("255"); + + testFilter.runOnETAllPrim("PropertyInt16 eq 32767") + .is("< eq <32767>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .goUpFilterValidator() + .root().right().isLiteral("32767"); + + testFilter.runOnETAllPrim("PropertyInt32 eq 2147483647") + .is("< eq <2147483647>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyInt32", PropertyProvider.nameInt32, false) + .goUpFilterValidator() + .root().right().isLiteral("2147483647"); + + testFilter.runOnETAllPrim("PropertyInt64 eq 9223372036854775807") + .is("< eq <9223372036854775807>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyInt64", PropertyProvider.nameInt64, false) + .goUpFilterValidator() + .root().right().isLiteral("9223372036854775807"); + + testFilter.runOnETAllPrim("PropertyDate eq 2013-09-25") + .is("< eq <2013-09-25>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) + .goUpFilterValidator() + .root().right().isLiteral("2013-09-25"); + + testFilter.runOnETAllPrim("PropertyDateTimeOffset eq 2013-09-25T12:34:56.123456789012-10:24") + .is("< eq <2013-09-25T12:34:56.123456789012-10:24>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath() + .isPrimitiveProperty("PropertyDateTimeOffset", PropertyProvider.nameDateTimeOffset, false) + .goUpFilterValidator() + .root().right().isLiteral("2013-09-25T12:34:56.123456789012-10:24"); + + testFilter.runOnETAllPrim("PropertyDuration eq duration'P10DT5H34M21.123456789012S'") + .is("< eq >") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyDuration", PropertyProvider.nameDuration, false) + .goUpFilterValidator() + .root().right().isLiteral("duration'P10DT5H34M21.123456789012S'"); + + testFilter.runOnETAllPrim("PropertyGuid eq 005056A5-09B1-1ED3-89BD-FB81372CCB33") + .is("< eq <005056A5-09B1-1ED3-89BD-FB81372CCB33>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyGuid", PropertyProvider.nameGuid, false) + .goUpFilterValidator() + .root().right().isLiteral("005056A5-09B1-1ED3-89BD-FB81372CCB33"); + + testFilter.runOnETAllPrim("PropertyString eq 'somestring'") + .is("< eq <'somestring'>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .goUpFilterValidator() + .root().right().isLiteral("'somestring'"); + + testFilter.runOnETAllPrim("PropertyTimeOfDay eq 12:34:55.12345678901") + .is("< eq <12:34:55.12345678901>>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) + .goUpFilterValidator() + .root().right().isLiteral("12:34:55.12345678901"); + + testFilter.runOnETMixEnumDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String1'") + .is("< eq >>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); + + testFilter.runOnETMixEnumDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String2'") + .is("< eq >>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String2")); + + testFilter.runOnETMixEnumDefCollComp( + "PropertyCompMixedEnumDef/PropertyEnumString eq olingo.odata.test1.ENString'String3'") + .is("< eq >>") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath() + .first().isComplexProperty("PropertyCompMixedEnumDef", ComplexTypeProvider.nameCTMixEnumDef, false) + .n().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String3")); + + testFilter + .runOnETMixEnumDefCollComp( + "PropertyCompMixedEnumDef/PropertyEnumString eq " + + "PropertyCompMixedEnumDef/PropertyEnumString") + .is("< eq " + + ">") + .isBinary(BinaryOperatorKind.EQ) + .root().left().goPath() + .first().isComplexProperty("PropertyCompMixedEnumDef", ComplexTypeProvider.nameCTMixEnumDef, false) + .n().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .root().right().goPath() + .first().isComplexProperty("PropertyCompMixedEnumDef", ComplexTypeProvider.nameCTMixEnumDef, false) + .n().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false); + + testFilter.runOnETAllPrim("PropertyByte mod 0 gt 0") + .is("<< mod <0>> gt <0>>"); + + testFilter.runOnETKeyNavEx("CollPropertyComp/PropertyInt16 le 0") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + } + + @Test + public void filterFunctions() throws Exception { + testFilter.runOnETAllPrim( + "olingo.odata.test1.UFCRTETTwoKeyNavParamCTTwoPrim(ParameterCTTwoPrim=@ParamAlias) eq null" + + "&@ParamAlias={}") + .is("< eq >") + .left().goPath() + .first() + .isFunction("UFCRTETTwoKeyNavParamCTTwoPrim") + .isParameterAlias(0, "ParameterCTTwoPrim", "@ParamAlias"); + + testFilter.runOnETTwoKeyNav("PropertyComp/olingo.odata.test1.BFCCTPrimCompRTETTwoKeyNavParam" + + "(ParameterString=PropertyComp/PropertyComp/PropertyString)/PropertyString eq 'SomeString'") + .is("< eq <'SomeString'>>") + .root().left().goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isFunction("BFCCTPrimCompRTETTwoKeyNavParam") + .goParameter(0).isMember() + .goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .goUpFilterValidator().goUpToResourceValidator() + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETTwoKeyNav("PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESTwoKeyNav()" + + "(PropertyInt16=1,PropertyString='2')/PropertyString eq 'SomeString'") + .is("< eq <'SomeString'>>") + .root().left().goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isFunction("BFCCTPrimCompRTESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETTwoKeyNav("PropertyComp/olingo.odata.test1.BFCCTPrimCompRTETTwoKeyNavParam" + + "(ParameterString='1')/PropertyString eq 'SomeString'") + .is("< eq <'SomeString'>>") + .root().left().goPath() + .first() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isFunction("BFCCTPrimCompRTETTwoKeyNavParam") + .isParameter(0, "ParameterString", "'1'") + .n() + .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavMany/olingo.odata.test1.BFCESTwoKeyNavRTString()" + + " eq 'SomeString'") + .is("< eq <'SomeString'>>") + .root().left().goPath() + .first() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .n().isFunction("BFCESTwoKeyNavRTString"); + + testFilter.runOnETKeyNav("$it/olingo.odata.test1.BFCETKeyNavRTETKeyNav()/PropertyString eq 'SomeString'") + .is("<<$it/BFCETKeyNavRTETKeyNav/PropertyString> eq <'SomeString'>>") + .root().left().goPath() + .first().isIt() + .n().isFunction("BFCETKeyNavRTETKeyNav") + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETTwoKeyNav("olingo.odata.test1.BFCESTwoKeyNavRTCTTwoPrim()/PropertyString eq 'SomeString'") + .is("< eq <'SomeString'>>") + .root().left().goPath() + .first().isFunction("BFCESTwoKeyNavRTCTTwoPrim") + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/olingo.odata.test1.BFCETTwoKeyNavRTETTwoKeyNav()" + + "/PropertyComp/PropertyComp/PropertyString eq 'Walldorf'") + .is("< " + + "eq <'Walldorf'>>") + .root().left().goPath() + .first().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .n().isFunction("BFCETTwoKeyNavRTETTwoKeyNav") + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETTwoKeyNav("PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESTwoKeyNav()" + + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=2,PropertyString='3')/PropertyString eq 'SomeString'") + .is("< " + + "eq <'SomeString'>>") + .root().left().goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isFunction("BFCCTPrimCompRTESTwoKeyNav") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'") + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETTwoKeyNavSingle("$it/olingo.odata.test1.BFCETTwoKeyNavRTCTTwoPrim()/olingo.odata.test1.CTBase" + + "/PropertyString eq 'SomeString'") + .is("<<$it/BFCETTwoKeyNavRTCTTwoPrim/olingo.odata.test1.CTBase/PropertyString> eq <'SomeString'>>") + .root().left().goPath() + .first() + .isIt() + .n() + .isFunction("BFCETTwoKeyNavRTCTTwoPrim") + .isTypeFilterOnEntry(ComplexTypeProvider.nameCTBase) + .n() + .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETTwoKeyNav("olingo.odata.test1.UFCRTETTwoKeyNavParam(ParameterInt16=1)/PropertyInt16 eq 2") + .is("< eq <2>>") + .root().left().goPath() + .first() + .isFunction("UFCRTETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testFilter.runOnETTwoKeyNav("olingo.odata.test1.UFCRTETTwoKeyNavParam(ParameterInt16=@Param1Alias)" + + "/PropertyInt16 eq 2" + + "&@Param1Alias=1") + .root().left().goPath() + .first() + .isFunction("UFCRTETTwoKeyNavParam") + .isParameterAlias(0, "ParameterInt16", "@Param1Alias") + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testFilter.runOnETTwoKeyNav("olingo.odata.test1.UFCRTETTwoKeyNavParam(ParameterInt16=1)" + + "/PropertyComp/PropertyComp/PropertyString eq 'SomeString'") + .root().left().goPath() + .first() + .isFunction("UFCRTETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n() + .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETTwoKeyNav("olingo.odata.test1.UFCRTETTwoKeyNavParam(ParameterInt16=PropertyInt16)" + + "/PropertyComp/PropertyComp/PropertyString eq 'SomeString'") + .root().left().goPath() + .first() + .isFunction("UFCRTETTwoKeyNavParam") + .goParameter(0) + .isMember().goPath().first().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .goUpFilterValidator().goUpToResourceValidator() + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETTwoKeyNavEx("olingo.odata.test1.UFCRTETTwoKeyNavParam(ParameterInt16=@alias)") + .isExValidation(UriValidationException.MessageKeys.MISSING_ALIAS); + } + + @Test + public void methods() throws Exception { + testFilter.runOnETKeyNav("indexof(PropertyString,'47') eq 5") + .is("<,<'47'>)> eq <5>>") + .left() + .isMethod(MethodKind.INDEXOF, 2) + .isParameterText(0, "") + .isParameterText(1, "<'47'>"); + + testFilter.runOnETKeyNav("tolower(PropertyString) eq 'foo'") + .is("<)> eq <'foo'>>") + .left() + .isMethod(MethodKind.TOLOWER, 1) + .isParameterText(0, ""); + + testFilter.runOnETKeyNav("toupper(PropertyString) eq 'FOO'") + .is("<)> eq <'FOO'>>") + .left() + .isMethod(MethodKind.TOUPPER, 1) + .isParameterText(0, ""); + + testFilter.runOnETKeyNav("trim(PropertyString) eq 'fooba'") + .is("<)> eq <'fooba'>>") + .left() + .isMethod(MethodKind.TRIM, 1) + .isParameterText(0, ""); + + testFilter.runOnETKeyNav("substring(PropertyString,4) eq 'foo'") + .is("<,<4>)> eq <'foo'>>") + .left() + .isMethod(MethodKind.SUBSTRING, 2) + .isParameterText(0, "") + .isParameterText(1, "<4>"); + + testFilter.runOnETKeyNav("substring(PropertyString,4) eq 'foo'") + .is("<,<4>)> eq <'foo'>>") + .left() + .isMethod(MethodKind.SUBSTRING, 2) + .isParameterText(0, "") + .isParameterText(1, "<4>"); + + testFilter.runOnETKeyNav("substring(PropertyString,2,4) eq 'foo'") + .is("<,<2>,<4>)> eq <'foo'>>") + .left() + .isMethod(MethodKind.SUBSTRING, 3) + .isParameterText(0, "") + .isParameterText(1, "<2>") + .isParameterText(2, "<4>"); + + testFilter.runOnETKeyNav("concat(PropertyString,PropertyCompTwoPrim/PropertyString) eq 'foo'") + .is("<,)> eq <'foo'>>") + .left() + .isMethod(MethodKind.CONCAT, 2) + .isParameterText(0, "") + .isParameterText(1, ""); + + testFilter.runOnETKeyNav("concat(PropertyString,'bar') eq 'foobar'") + .is("<,<'bar'>)> eq <'foobar'>>") + .left() + .isMethod(MethodKind.CONCAT, 2) + .isParameterText(0, "") + .isParameterText(1, "<'bar'>"); + + testFilter.runOnETKeyNav("concat(PropertyString,'bar') eq 'foobar'") + .is("<,<'bar'>)> eq <'foobar'>>") + .left() + .isMethod(MethodKind.CONCAT, 2) + .isParameterText(0, "") + .isParameterText(1, "<'bar'>"); + + testFilter.runOnETKeyNav("length(PropertyString) eq 32") + .is("<)> eq <32>>") + .left() + .isMethod(MethodKind.LENGTH, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("year(PropertyDate) eq 2013") + .is("<)> eq <2013>>") + .left() + .isMethod(MethodKind.YEAR, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("year(2013-09-25) eq 2013") + .is("<)> eq <2013>>") + .left() + .isMethod(MethodKind.YEAR, 1) + .isParameterText(0, "<2013-09-25>"); + + testFilter.runOnETAllPrim("year(PropertyDateTimeOffset) eq 2013") + .is("<)> eq <2013>>") + .left() + .isMethod(MethodKind.YEAR, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("year(2013-09-25T12:34:56.123456789012-10:24) eq 2013") + .is("<)> eq <2013>>") + .left() + .isMethod(MethodKind.YEAR, 1) + .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); + + testFilter.runOnETAllPrim("month(PropertyDate) eq 9") + .is("<)> eq <9>>") + .left() + .isMethod(MethodKind.MONTH, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("month(2013-09-25) eq 9") + .is("<)> eq <9>>") + .left() + .isMethod(MethodKind.MONTH, 1) + .isParameterText(0, "<2013-09-25>"); + + testFilter.runOnETAllPrim("month(PropertyDateTimeOffset) eq 9") + .is("<)> eq <9>>") + .left() + .isMethod(MethodKind.MONTH, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("month(2013-09-25T12:34:56.123456789012-10:24) eq 9") + .is("<)> eq <9>>") + .left() + .isMethod(MethodKind.MONTH, 1) + .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); + + testFilter.runOnETAllPrim("day(PropertyDate) eq 25") + .is("<)> eq <25>>") + .left() + .isMethod(MethodKind.DAY, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("day(2013-09-25) eq 25") + .is("<)> eq <25>>") + .left() + .isMethod(MethodKind.DAY, 1) + .isParameterText(0, "<2013-09-25>"); + + testFilter.runOnETAllPrim("day(PropertyDateTimeOffset) eq 25") + .is("<)> eq <25>>") + .left() + .isMethod(MethodKind.DAY, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("day(2013-09-25T12:34:56.123456789012-10:24) eq 25") + .is("<)> eq <25>>") + .left() + .isMethod(MethodKind.DAY, 1) + .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); + + testFilter.runOnETAllPrim("hour(PropertyDateTimeOffset) eq 2") + .is("<)> eq <2>>") + .left() + .isMethod(MethodKind.HOUR, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("hour(PropertyDateTimeOffset) eq 2") + .is("<)> eq <2>>") + .left() + .isMethod(MethodKind.HOUR, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("hour(2013-09-25T12:34:56.123456789012-10:24) eq 2") + .is("<)> eq <2>>") + .left() + .isMethod(MethodKind.HOUR, 1) + .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); + + testFilter.runOnETAllPrim("hour(PropertyTimeOfDay) eq 2") + .is("<)> eq <2>>") + .left() + .isMethod(MethodKind.HOUR, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("hour(12:34:55.123456789012) eq 12") + .is("<)> eq <12>>") + .left() + .isMethod(MethodKind.HOUR, 1) + .isParameterText(0, "<12:34:55.123456789012>"); + + testFilter.runOnETAllPrim("minute(PropertyDateTimeOffset) eq 34") + .is("<)> eq <34>>") + .left() + .isMethod(MethodKind.MINUTE, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("minute(2013-09-25T12:34:56.123456789012-10:24) eq 34") + .is("<)> eq <34>>") + .left() + .isMethod(MethodKind.MINUTE, 1) + .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); + + testFilter.runOnETAllPrim("minute(PropertyTimeOfDay) eq 34") + .is("<)> eq <34>>") + .left() + .isMethod(MethodKind.MINUTE, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("minute(12:34:55.123456789012) eq 34") + .is("<)> eq <34>>") + .left() + .isMethod(MethodKind.MINUTE, 1) + .isParameterText(0, "<12:34:55.123456789012>"); + + testFilter.runOnETAllPrim("second(PropertyDateTimeOffset) eq 56") + .is("<)> eq <56>>") + .left() + .isMethod(MethodKind.SECOND, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("second(2013-09-25T12:34:56.123456789012-10:24) eq 56") + .is("<)> eq <56>>") + .left() + .isMethod(MethodKind.SECOND, 1) + .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); + + testFilter.runOnETAllPrim("second(PropertyTimeOfDay) eq 56") + .is("<)> eq <56>>") + .left() + .isMethod(MethodKind.SECOND, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("second(12:34:55.123456789012) eq 56") + .is("<)> eq <56>>") + .left() + .isMethod(MethodKind.SECOND, 1) + .isParameterText(0, "<12:34:55.123456789012>"); + + testFilter.runOnETAllPrim("fractionalseconds(PropertyDateTimeOffset) eq 123456789012") + .is("<)> eq <123456789012>>") + .left() + .isMethod(MethodKind.FRACTIONALSECONDS, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("fractionalseconds(2013-09-25T12:34:56.123456789012-10:24) eq 123456789012") + .is("<)> eq <123456789012>>") + .left() + .isMethod(MethodKind.FRACTIONALSECONDS, 1) + .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); + + testFilter.runOnETAllPrim("fractionalseconds(PropertyTimeOfDay) eq 123456789012") + .is("<)> eq <123456789012>>") + .left() + .isMethod(MethodKind.FRACTIONALSECONDS, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("fractionalseconds(12:34:55.123456789012) eq 123456789012") + .is("<)> eq <123456789012>>") + .left() + .isMethod(MethodKind.FRACTIONALSECONDS, 1) + .isParameterText(0, "<12:34:55.123456789012>"); + + testFilter.runOnETAllPrim("totalseconds(PropertyDuration) eq 4711") + .is("<)> eq <4711>>") + .left() + .isMethod(MethodKind.TOTALSECONDS, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("totalseconds(duration'P10DT5H34M21.123456789012S') eq 4711") + .is("<)> eq <4711>>") + .left() + .isMethod(MethodKind.TOTALSECONDS, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("date(PropertyDateTimeOffset) eq 2013-09-25") + .is("<)> eq <2013-09-25>>") + .left() + .isMethod(MethodKind.DATE, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("date(2013-09-25T12:34:56.123456789012-10:24) eq 2013-09-25") + .is("<)> eq <2013-09-25>>") + .left() + .isMethod(MethodKind.DATE, 1) + .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); + + testFilter.runOnETAllPrim("time(PropertyDateTimeOffset) eq 12:34:55.123456789012") + .is("<)> eq <12:34:55.123456789012>>") + .left() + .isMethod(MethodKind.TIME, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("time(2013-09-25T12:34:56.123456789012-10:24) eq 12:34:55.123456789012") + .is("<)> eq <12:34:55.123456789012>>") + .left() + .isMethod(MethodKind.TIME, 1) + .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); + + testFilter.runOnETAllPrim("round(PropertyDouble) eq 17") + .is("<)> eq <17>>") + .left() + .isMethod(MethodKind.ROUND, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("round(17.45e1) eq 17") + .is("<)> eq <17>>") + .left() + .isMethod(MethodKind.ROUND, 1) + .isParameterText(0, "<17.45e1>"); + + testFilter.runOnETAllPrim("round(PropertyDecimal) eq 17") + .is("<)> eq <17>>") + .left() + .isMethod(MethodKind.ROUND, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("round(17.45) eq 17") + .is("<)> eq <17>>") + .left() + .isMethod(MethodKind.ROUND, 1) + .isParameterText(0, "<17.45>"); + + testFilter.runOnETAllPrim("floor(PropertyDouble) eq 17") + .is("<)> eq <17>>") + .left() + .isMethod(MethodKind.FLOOR, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("floor(17.45e1) eq 17") + .is("<)> eq <17>>") + .left() + .isMethod(MethodKind.FLOOR, 1) + .isParameterText(0, "<17.45e1>"); + + testFilter.runOnETAllPrim("floor(PropertyDecimal) eq 17") + .is("<)> eq <17>>") + .left() + .isMethod(MethodKind.FLOOR, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("floor(17.45) eq 17") + .is("<)> eq <17>>") + .left() + .isMethod(MethodKind.FLOOR, 1) + .isParameterText(0, "<17.45>"); + + testFilter.runOnETAllPrim("ceiling(PropertyDouble) eq 18") + .is("<)> eq <18>>") + .left() + .isMethod(MethodKind.CEILING, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("ceiling(17.55e1) eq 18") + .is("<)> eq <18>>") + .left() + .isMethod(MethodKind.CEILING, 1) + .isParameterText(0, "<17.55e1>"); + + testFilter.runOnETAllPrim("ceiling(PropertyDecimal) eq 18") + .is("<)> eq <18>>") + .left() + .isMethod(MethodKind.CEILING, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("ceiling(17.55) eq 18") + .is("<)> eq <18>>") + .left() + .isMethod(MethodKind.CEILING, 1) + .isParameterText(0, "<17.55>"); + + testFilter.runOnETAllPrim("totaloffsetminutes(PropertyDateTimeOffset) eq 4711") + .is("<)> eq <4711>>") + .left() + .isMethod(MethodKind.TOTALOFFSETMINUTES, 1) + .isParameterText(0, ""); + + testFilter.runOnETAllPrim("totaloffsetminutes(2013-09-25T12:34:56.123456789012-10:24) eq 4711") + .is("<)> eq <4711>>") + .left() + .isMethod(MethodKind.TOTALOFFSETMINUTES, 1) + .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); + + testFilter.runOnETAllPrim("mindatetime() ne null") + .is("< ne >") + .left().isMethod(MethodKind.MINDATETIME, 0); + + testFilter.runOnETAllPrim("mindatetime() eq 2013-09-25T12:34:56.123456789012-10:24") + .is("< eq <2013-09-25T12:34:56.123456789012-10:24>>") + .left() + .isMethod(MethodKind.MINDATETIME, 0); + + testFilter.runOnETAllPrim("maxdatetime() ne null") + .is("< ne >") + .left().isMethod(MethodKind.MAXDATETIME, 0); + + testFilter.runOnETAllPrim("maxdatetime() eq 2013-09-25T12:34:56.123456789012-10:24") + .is("< eq <2013-09-25T12:34:56.123456789012-10:24>>") + .left() + .isMethod(MethodKind.MAXDATETIME, 0); + + testFilter.runOnETAllPrim("now() ne null") + .is("< ne >") + .left().isMethod(MethodKind.NOW, 0); + + testFilter.runOnETAllPrim("now() eq 2013-09-25T12:34:56.123456789012-10:24") + .is("< eq <2013-09-25T12:34:56.123456789012-10:24>>") + .left() + .isMethod(MethodKind.NOW, 0); + + testFilter.runOnETTwoKeyNav("$it/PropertyString eq 'SomeString'") + .is("<<$it/PropertyString> eq <'SomeString'>>") + .left() + .goPath() + .first().isUriPathInfoKind(UriResourceKind.it) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnCTTwoPrim("$it/PropertyString eq 'SomeString'") + .is("<<$it/PropertyString> eq <'SomeString'>>") + .left() + .goPath() + .first().isUriPathInfoKind(UriResourceKind.it) + .isType(ComplexTypeProvider.nameCTTwoPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnString("$it eq 'Walldorf'") + .is("<<$it> eq <'Walldorf'>>") + .left() + .goPath() + .first().isUriPathInfoKind(UriResourceKind.it) + .isType(PropertyProvider.nameString, false); + + testFilter.runOnString("endswith($it,'company.com')") + .is(",<'company.com'>)>") + .isMethod(MethodKind.ENDSWITH, 2) + .isParameterText(0, "<$it>") + .isParameterText(1, "<'company.com'>") + .goParameter(0) + .goPath() + .first().isUriPathInfoKind(UriResourceKind.it) + .isType(PropertyProvider.nameString, false); + + testFilter.runOnString("endswith($it,'company.com') eq false") + .is("<,<'company.com'>)> eq >") + .left() + .isMethod(MethodKind.ENDSWITH, 2) + .isParameterText(0, "<$it>") + .isParameterText(1, "<'company.com'>") + .goParameter(0) + .goPath() + .first().isUriPathInfoKind(UriResourceKind.it) + .isType(PropertyProvider.nameString, false); + + testFilter.runOnETTwoKeyNav("endswith(PropertyComp/PropertyComp/PropertyString,'dorf')") + .is(",<'dorf'>)>") + .isMethod(MethodKind.ENDSWITH, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() + .root().goParameter(1).isLiteral("'dorf'"); + + testFilter.runOnETTwoKeyNav("endswith(PropertyComp/PropertyComp/PropertyString,'dorf') eq true") + .is("<,<'dorf'>)> eq >") + .isBinary(BinaryOperatorKind.EQ) + .left().isMethod(MethodKind.ENDSWITH, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() + .root().left().goParameter(1).isLiteral("'dorf'"); + + testFilter.runOnETTwoKeyNav("endswith('Walldorf','dorf')") + .is(",<'dorf'>)>") + .isMethod(MethodKind.ENDSWITH, 2) + .goParameter(0).isLiteral("'Walldorf'") + .root().goParameter(1).isLiteral("'dorf'"); + + testFilter.runOnETTwoKeyNav("endswith('Walldorf','dorf') eq true") + .is("<,<'dorf'>)> eq >") + .isBinary(BinaryOperatorKind.EQ) + .left().isMethod(MethodKind.ENDSWITH, 2) + .goParameter(0).isLiteral("'Walldorf'") + .root().left().goParameter(1).isLiteral("'dorf'"); + + testFilter.runOnETKeyNav("startswith(PropertyCompAllPrim/PropertyString,'Wall')") + .is(",<'Wall'>)>") + .isMethod(MethodKind.STARTSWITH, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyCompAllPrim", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() + .root().goParameter(1).isLiteral("'Wall'"); + + testFilter.runOnETKeyNav("startswith(PropertyCompAllPrim/PropertyString,'Wall') eq true") + .is("<,<'Wall'>)> eq >") + .isBinary(BinaryOperatorKind.EQ) + .left().isMethod(MethodKind.STARTSWITH, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyCompAllPrim", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() + .root().left().goParameter(1).isLiteral("'Wall'"); + + testFilter.runOnETKeyNav("startswith('Walldorf','Wall')") + .is(",<'Wall'>)>") + .isMethod(MethodKind.STARTSWITH, 2) + .goParameter(0).isLiteral("'Walldorf'") + .root().goParameter(1).isLiteral("'Wall'"); + + testFilter.runOnETKeyNav("startswith('Walldorf','Wall') eq true") + .is("<,<'Wall'>)> eq >") + .isBinary(BinaryOperatorKind.EQ) + .left().isMethod(MethodKind.STARTSWITH, 2) + .goParameter(0).isLiteral("'Walldorf'") + .root().left().goParameter(1).isLiteral("'Wall'"); + + testFilter.runOnETTwoKeyNav("contains(PropertyComp/PropertyComp/PropertyString,'Wall')") + .is(",<'Wall'>)>") + .isMethod(MethodKind.CONTAINS, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() + .root().goParameter(1).isLiteral("'Wall'"); + + testFilter.runOnETTwoKeyNav("contains(PropertyComp/PropertyComp/PropertyString,'Wall') eq true") + .is("<,<'Wall'>)> eq >") + .isBinary(BinaryOperatorKind.EQ) + .left().isMethod(MethodKind.CONTAINS, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() + .root().left().goParameter(1).isLiteral("'Wall'"); + + testFilter.runOnETTwoKeyNav("contains('Walldorf','Wall')") + .is(",<'Wall'>)>") + .isMethod(MethodKind.CONTAINS, 2) + .goParameter(0).isLiteral("'Walldorf'") + .root().goParameter(1).isLiteral("'Wall'"); + + testFilter.runOnETTwoKeyNav("contains('Walldorf','Wall') eq true") + .is("<,<'Wall'>)> eq >") + .isBinary(BinaryOperatorKind.EQ) + .left().isMethod(MethodKind.CONTAINS, 2) + .goParameter(0).isLiteral("'Walldorf'") + .root().left().goParameter(1).isLiteral("'Wall'"); + + testFilter.runOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyInt16 eq " + + "$root/ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyInt16") + .is("< eq <$root/ESTwoKeyNav/PropertyInt16>>") + .root().left() + .goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .goUpFilterValidator() + .root().right() + .goPath() + .first().isUriPathInfoKind(UriResourceKind.root) + .n().isEntitySet("ESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testFilter.runOnETTwoKeyNavEx("startswith(CollPropertyString,'wrong')") + .isExSemantic(MessageKeys.COLLECTION_NOT_ALLOWED); + } + + @Test + public void castMethod() throws Exception { + testFilter.runOnETKeyNav("cast(olingo.odata.test1.ETBaseTwoKeyNav) ne null") + .is("<)> ne >") + .left() + .isMethod(MethodKind.CAST, 1) + .isParameterText(0, "") + .goParameter(0).isTypedLiteral(EntityTypeProvider.nameETBaseTwoKeyNav); + + testFilter.runOnETKeyNav("cast(PropertyCompTwoPrim,olingo.odata.test1.CTBase) ne null") + .is("<,)> ne >") + .left() + .isMethod(MethodKind.CAST, 2) + .isParameterText(0, "") + .isParameterText(1, "") + .goParameter(0).goPath().first() + .isComplexProperty("PropertyCompTwoPrim", ComplexTypeProvider.nameCTTwoPrim, false) + .goUpFilterValidator() + .root().left() + .goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTBase); + + testFilter.runOnETKeyNav("cast($it,olingo.odata.test1.CTBase) ne null") + .is("<,)> ne >") + .left() + .isMethod(MethodKind.CAST, 2) + .isParameterText(0, "<$it>") + .isParameterText(1, "") + .goParameter(0).goPath().first() + .isIt().isType(EntityTypeProvider.nameETKeyNav, false) + .goUpFilterValidator() + .root().left() + .goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTBase); + + testFilter.runOnETKeyNav("concat(PropertyString,cast(PropertyCompAllPrim/PropertyInt16,Edm.String)) ne ''") + .is("<,,)>)> ne <''>>") + .left() + .isMethod(MethodKind.CONCAT, 2) + .isParameterText(0, "") + .isParameterText(1, ",)>") + .goParameter(1) + .isMethod(MethodKind.CAST, 2) + .isParameterText(0, "") + .isParameterText(1, ""); + + testFilter.runOnETKeyNav("cast($it,olingo.odata.test1.CTBase) eq cast($it,olingo.odata.test1.CTBase)") + .is("<,)> eq ,)>>") + .left() + .isMethod(MethodKind.CAST, 2) + .isParameterText(0, "<$it>") + .isParameterText(1, "") + .goParameter(0).goPath().first() + .isIt().isType(EntityTypeProvider.nameETKeyNav, false) + .goUpFilterValidator() + .root().left() + .goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTBase) + .root().right() + .isMethod(MethodKind.CAST, 2) + .isParameterText(0, "<$it>") + .isParameterText(1, "") + .goParameter(0).goPath().first() + .isIt().isType(EntityTypeProvider.nameETKeyNav, false) + .goUpFilterValidator() + .root().right() + .goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTBase); + + testFilter.runOnInt32("cast(Edm.Int32) gt 0") + .is("<)> gt <0>>") + .left() + .isMethod(MethodKind.CAST, 1) + .goParameter(0).isTypedLiteral(PropertyProvider.nameInt32); + + testFilter.runOnDateTimeOffset("cast(Edm.DateTimeOffset) ne null") + .is("<)> ne >") + .left() + .isMethod(MethodKind.CAST, 1) + .goParameter(0).isTypedLiteral(PropertyProvider.nameDateTimeOffset); + + testFilter.runOnDuration("cast(Edm.Duration) ne null") + .is("<)> ne >") + .left() + .isMethod(MethodKind.CAST, 1) + .goParameter(0).isTypedLiteral(PropertyProvider.nameDuration); + + testFilter.runOnTimeOfDay("cast(Edm.TimeOfDay) ne null") + .is("<)> ne >") + .left() + .isMethod(MethodKind.CAST, 1) + .goParameter(0).isTypedLiteral(PropertyProvider.nameTimeOfDay); + + testFilter.runOnETKeyNav("cast(CollPropertyInt16,Edm.Int32) ne null") + .is("<,)> ne >") + .left() + .isMethod(MethodKind.CAST, 2) + .goParameter(0).goPath().first() + .isPrimitiveProperty("CollPropertyInt16", PropertyProvider.nameInt16, true) + .goUpFilterValidator().root().left() + .goParameter(1).isTypedLiteral(PropertyProvider.nameInt32); + + testFilter.runOnETTwoKeyNav( + "cast(PropertyComp/PropertyComp/PropertyDateTimeOffset,Edm.DateTimeOffset) ne null") + .is("<,)> ne >") + .left() + .isMethod(MethodKind.CAST, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyDateTimeOffset", PropertyProvider.nameDateTimeOffset, false) + .goUpFilterValidator().root().left() + .goParameter(1).isTypedLiteral(PropertyProvider.nameDateTimeOffset); + + testFilter.runOnETTwoKeyNav("cast(PropertyComp/PropertyComp/PropertyDuration,Edm.Duration) ne null") + .is("<,)> ne >") + .left() + .isMethod(MethodKind.CAST, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyDuration", PropertyProvider.nameDuration, false) + .goUpFilterValidator().root().left() + .goParameter(1).isTypedLiteral(PropertyProvider.nameDuration); + + testFilter.runOnETTwoKeyNav("cast(PropertyComp/PropertyComp/PropertyTimeOfDay,Edm.TimeOfDay) ne null") + .is("<,)> ne >") + .left() + .isMethod(MethodKind.CAST, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) + .goUpFilterValidator().root().left() + .goParameter(1).isTypedLiteral(PropertyProvider.nameTimeOfDay); + + testFilter.runOnETKeyNav("cast(PropertyCompAllPrim,olingo.odata.test1.CTTwoPrim) ne null") + .is("<,)> ne >") + .left() + .isMethod(MethodKind.CAST, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyCompAllPrim", ComplexTypeProvider.nameCTAllPrim, false) + .goUpFilterValidator().root().left() + .goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoPrim); + + testFilter.runOnETKeyNav("cast(NavPropertyETKeyNavOne,olingo.odata.test1.ETKeyPrimNav) ne null") + .is("<,)> ne >") + .left() + .isMethod(MethodKind.CAST, 2) + .goParameter(0).goPath() + .first().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .goUpFilterValidator().root().left() + .goParameter(1).isTypedLiteral(EntityTypeProvider.nameETKeyPrimNav); + + testFilter.runOnETAllPrim( + "olingo.odata.test1.UFCRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString='1') ne null") + .left() + .goPath() + .isFunction("UFCRTCTTwoPrimTwoParam") + .isParameter(0, "ParameterInt16", "1") + .isParameter(1, "ParameterString", "'1'"); + + testFilter.runOnETKeyNavEx("cast(NavPropertyETKeyPrimNavOne,olingo.odata.test1.ETKeyNav)") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + } + + @Test + public void lambdaFunctions() throws Exception { + + testFilter.runOnETTwoKeyNav("CollPropertyComp/all(l:true)") + .is(">>"); + + testFilter.runOnETTwoKeyNav("CollPropertyComp/all(x:x/PropertyInt16 eq 2)") + .is(" eq <2>>>>"); + + testFilter.runOnETTwoKeyNav("CollPropertyComp/any(l:true)") + .is(">>"); + testFilter.runOnETTwoKeyNav("CollPropertyComp/any()") + .is(">"); + + testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavMany/any(d:d/PropertyString eq 'SomeString')") + .is(" eq <'SomeString'>>>>") + .root().goPath() + .first().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .n().isUriPathInfoKind(UriResourceKind.lambdaAny) + .goLambdaExpression() + .isBinary(BinaryOperatorKind.EQ) + .left().goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavMany/any()") + .is(">"); + + testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavOne/CollPropertyString/any(d:d eq 'SomeString')") + .is(" eq <'SomeString'>>>>") + .root().goPath() + .first().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .n().isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) + .n().isUriPathInfoKind(UriResourceKind.lambdaAny) + .goLambdaExpression() + .isBinary(BinaryOperatorKind.EQ) + .left().goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(PropertyProvider.nameString, false); + + testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavOne/olingo.odata.test1.BFCETTwoKeyNavRTESTwoKeyNav()" + + "/any(d:d/PropertyComp/PropertyInt16 eq 6)") + .is(" eq <6>>>>") + .root().goPath() + .first().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .n().isFunction("BFCETTwoKeyNavRTESTwoKeyNav") + .n().isUriPathInfoKind(UriResourceKind.lambdaAny) + .goLambdaExpression() + .isBinary(BinaryOperatorKind.EQ) + .left().goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavMany/any(d:d/PropertyInt16 eq 1 or " + + "d/CollPropertyString/any(e:e eq 'SomeString'))") + .is(" eq <1>>" + + " or eq <'SomeString'>>>>>>>") + .root().goPath() + .first().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .n().isUriPathInfoKind(UriResourceKind.lambdaAny) + .goLambdaExpression() + .root().isBinary(BinaryOperatorKind.OR) + .root().left() + .isBinary(BinaryOperatorKind.EQ) + .left() + .goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .goUpFilterValidator() + .root().right() + .goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n().isUriPathInfoKind(UriResourceKind.primitiveProperty) + .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) + .n().isUriPathInfoKind(UriResourceKind.lambdaAny) + .goLambdaExpression() + .root().left().goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(PropertyProvider.nameString, false); + + testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavMany/any(d:d/PropertyInt16 eq 1 or " + + "d/CollPropertyString/any(e:e eq 'SomeString'))") + .is(" eq <1>> or " + + " eq <'SomeString'>>>>>>>") + .root().goPath() + .first().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .n().isUriPathInfoKind(UriResourceKind.lambdaAny) + .goLambdaExpression() + .root().isBinary(BinaryOperatorKind.OR) + .root().left() + .isBinary(BinaryOperatorKind.EQ) + .left() + .goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .goUpFilterValidator() + .root().right() + .goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n().isType(PropertyProvider.nameString, true) + .n().isUriPathInfoKind(UriResourceKind.lambdaAny) + .goLambdaExpression() + .root().left().goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(PropertyProvider.nameString, false); + + testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavMany/any(d:d/PropertyString eq 'SomeString' and " + + "d/CollPropertyString/any(e:e eq d/PropertyString))") + .is(" eq <'SomeString'>> and " + + " eq >>>>>>") + .root().goPath() + .first().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .n().isUriPathInfoKind(UriResourceKind.lambdaAny) + .goLambdaExpression() + .root().isBinary(BinaryOperatorKind.AND) + .root().left() + .isBinary(BinaryOperatorKind.EQ) + .left() + .goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .goUpFilterValidator() + .root().right() + .goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n().isType(PropertyProvider.nameString, true) + .n().isUriPathInfoKind(UriResourceKind.lambdaAny) + .goLambdaExpression() + .root().left().goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .isType(PropertyProvider.nameString, false) + .goUpFilterValidator() + .root().right().goPath() + .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOnETKeyNavEx("any()") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + testFilter.runOnETKeyNavEx("any(d:d/PropertyInt16 eq 1)") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + } + + @Test + public void isOfMethod() throws Exception { + testFilter.runOnETKeyNav("isof(olingo.odata.test1.ETTwoKeyNav)") + .is(")>") + .root() + .isMethod(MethodKind.ISOF, 1) + .goParameter(0).isTypedLiteral(EntityTypeProvider.nameETTwoKeyNav); + + testFilter.runOnETKeyNav("isof(olingo.odata.test1.ETBaseTwoKeyNav) eq true") + .is("<)> eq >") + .root().isBinary(BinaryOperatorKind.EQ) + .left() + .isMethod(MethodKind.ISOF, 1) + .goParameter(0).isTypedLiteral(EntityTypeProvider.nameETBaseTwoKeyNav); + + testFilter + .runOnETKeyNav("isof(olingo.odata.test1.ETBaseTwoKeyNav) eq true and PropertyCompNav/PropertyInt16 eq 1") + .is("<<)> eq > and < eq <1>>>") + .root().isBinary(BinaryOperatorKind.AND) + .left().isBinary(BinaryOperatorKind.EQ) + .left().isMethod(MethodKind.ISOF, 1) + .goParameter(0).isTypedLiteral(EntityTypeProvider.nameETBaseTwoKeyNav); + + testFilter.runOnETKeyNav("isof(NavPropertyETKeyNavOne,olingo.odata.test1.ETKeyNav) eq true") + .is("<,)> eq >") + .root().isBinary(BinaryOperatorKind.EQ) + .left().isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .goUpFilterValidator() + .root().left().goParameter(1).isTypedLiteral(EntityTypeProvider.nameETKeyNav); + + testFilter.runOnETKeyNav("isof(PropertyCompTwoPrim,olingo.odata.test1.CTTwoPrim)") + .is(",)>") + .root().isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath().isComplexProperty("PropertyCompTwoPrim", ComplexTypeProvider.nameCTTwoPrim, false) + .goUpFilterValidator() + .root().goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoPrim); + + testFilter.runOnETKeyNav("isof(PropertyCompTwoPrim,olingo.odata.test1.CTTwoBase)") + .is(",)>") + .root().isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath().isComplexProperty("PropertyCompTwoPrim", ComplexTypeProvider.nameCTTwoPrim, false) + .goUpFilterValidator() + .root().goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoBase); + + testFilter.runOnETKeyNav("isof(PropertyCompTwoPrim,olingo.odata.test1.CTTwoPrim) eq true") + .is("<,)> eq >") + .root().left().isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath().isComplexProperty("PropertyCompTwoPrim", ComplexTypeProvider.nameCTTwoPrim, false) + .goUpFilterValidator() + .root().left().goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoPrim); + + testFilter.runOnETKeyNav("isof($it,olingo.odata.test1.CTTwoPrim)") + .is(",)>") + .root() + .isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath().isIt().goUpFilterValidator() + .root().goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoPrim); + + testFilter.runOnETKeyNav("isof($it,olingo.odata.test1.CTTwoBase) eq false") + .is("<,)> eq >") + .isBinary(BinaryOperatorKind.EQ) + .root().left() + .isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath().isIt().goUpFilterValidator() + .root().left().goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoBase); + + testFilter.runOnETKeyNav("isof(PropertyCompNav/PropertyInt16,Edm.Int32)") + .is(",)>") + .root() + .isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTNavFiveProp, false) + .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .goUpFilterValidator() + .root().goParameter(1).isTypedLiteral(PropertyProvider.nameInt32); + + testFilter.runOnETTwoKeyNav("isof(PropertyComp/PropertyComp/PropertyDateTimeOffset,Edm.DateTimeOffset)") + .is(",)>") + .root() + .isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyDateTimeOffset", PropertyProvider.nameDateTimeOffset, false) + .goUpFilterValidator() + .root().goParameter(1).isTypedLiteral(PropertyProvider.nameDateTimeOffset); + + testFilter.runOnETTwoKeyNav("isof(PropertyComp/PropertyComp/PropertyTimeOfDay,Edm.TimeOfDay)") + .is(",)>") + .root() + .isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) + .goUpFilterValidator() + .root().goParameter(1).isTypedLiteral(PropertyProvider.nameTimeOfDay); + + testFilter.runOnETTwoKeyNav("isof(PropertyComp/PropertyComp/PropertyDuration,Edm.Duration)") + .is(",)>") + .root() + .isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyDuration", PropertyProvider.nameDuration, false) + .goUpFilterValidator() + .root().goParameter(1).isTypedLiteral(PropertyProvider.nameDuration); + + testFilter.runOnETTwoKeyNav("isof(PropertyComp/PropertyComp/PropertyString,Edm.String)") + .is(",)>") + .root() + .isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .goUpFilterValidator() + .root().goParameter(1).isTypedLiteral(PropertyProvider.nameString); + + testFilter.runOnETTwoKeyNav("isof(PropertyComp/PropertyComp/PropertyString,Edm.Guid)") + .is(",)>") + .root() + .isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .goUpFilterValidator() + .root().goParameter(1).isTypedLiteral(PropertyProvider.nameGuid); + + testFilter.runOnETMixEnumDefCollComp("isof(PropertyEnumString,Namespace1_Alias.ENString)") + .isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath() + .first().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .root().goParameter(1).isTypedLiteral(EnumTypeProvider.nameENString); + + testFilter.runOnETMixEnumDefCollComp("isof(PropertyDefString,Namespace1_Alias.TDString)") + .isMethod(MethodKind.ISOF, 2) + .goParameter(0).goPath() + .first().isPrimitiveProperty("PropertyDefString", TypeDefinitionProvider.nameTDString, false) + .goUpFilterValidator() + .root().goParameter(1).isTypedLiteral(TypeDefinitionProvider.nameTDString); + } + + @Test + public void has() throws Exception { + + testFilter.runOnETMixEnumDefCollComp("PropertyEnumString has olingo.odata.test1.ENString'String1'") + .is("< has >>") + .isBinary(BinaryOperatorKind.HAS) + .root().left().goPath().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); + + testFilter.runOnETMixEnumDefCollComp( + "PropertyCompMixedEnumDef/PropertyEnumString has olingo.odata.test1.ENString'String2'") + .is("< has >>") + .isBinary(BinaryOperatorKind.HAS) + .root().left().goPath() + .first().isComplexProperty("PropertyCompMixedEnumDef", ComplexTypeProvider.nameCTMixEnumDef, false) + .n().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String2")); + + testFilter + .runOnETMixEnumDefCollComp( + "PropertyCompMixedEnumDef/PropertyEnumString has olingo.odata.test1.ENString'String2' eq true") + .is("<< has " + + ">> eq >") + .isBinary(BinaryOperatorKind.EQ) + .root().left() + .isBinary(BinaryOperatorKind.HAS) + .root().left().left().goPath() + .first().isComplexProperty("PropertyCompMixedEnumDef", ComplexTypeProvider.nameCTMixEnumDef, false) + .n().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .root().left().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String2")); + + testFilter.runOnETMixEnumDefCollComp("PropertyEnumString has olingo.odata.test1.ENString'String3'") + .is("< has >>") + .isBinary(BinaryOperatorKind.HAS) + .root().left().goPath() + .first().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String3")); + + testFilter.runOnETMixEnumDefCollComp("PropertyEnumString has olingo.odata.test1.ENString'String1,String3'") + .is("< has >>") + .isBinary(BinaryOperatorKind.HAS) + .root().left().goPath() + .first().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1", "String3")); + + testFilter.runUriEx("ESMixEnumDefCollComp", "$filter=PropertyEnumString has null") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testFilter.runUriEx("ESMixEnumDefCollComp", "$filter=PropertyEnumString has ENString'String1'") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testFilter.runUriEx("ESMixEnumDefCollComp", "$filter=PropertyEnumString has wrongNamespace.ENString'String1'") + .isExSemantic(MessageKeys.UNKNOWN_TYPE); + testFilter.runUriEx("ESMixEnumDefCollComp", "$filter=PropertyEnumString has olingo.odata.test1.Wrong'String1'") + .isExSemantic(MessageKeys.UNKNOWN_TYPE); + } + + @Test + public void orderby() throws Exception { + testFilter.runOrderByOnETTwoKeyNav("PropertyString") + .isSortOrder(0, false) + .goOrder(0).goPath() + .first().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOrderByOnETTwoKeyNav("PropertyComp") + .isSortOrder(0, false) + .goOrder(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false); + + testFilter.runOrderByOnETTwoKeyNav("PropertyComp/PropertyComp") + .isSortOrder(0, false) + .goOrder(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false); + + testFilter.runOrderByOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyDate") + .isSortOrder(0, false) + .goOrder(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false); + + testFilter.runOrderByOnETTwoKeyNav("olingo.odata.test1.UFCRTETAllPrimTwoParam(" + + "ParameterString=@ParamStringAlias,ParameterInt16=@ParamInt16Alias)/PropertyString eq 'SomeString'" + + "&@ParamStringAlias='1'&@ParamInt16Alias=1") + .isSortOrder(0, false) + .goOrder(0).isBinary(BinaryOperatorKind.EQ).left().goPath() + .first().isFunction("UFCRTETAllPrimTwoParam").goUpFilterValidator() + .goOrder(0).right().isLiteral("'SomeString'"); + + testFilter.runOrderByOnETTwoKeyNav("olingo.odata.test1.UFCRTETAllPrimTwoParam(" + + "ParameterString=@ParamStringAlias,ParameterInt16=@ParamInt16Alias)/PropertyString eq 'SomeString' asc" + + "&@ParamStringAlias='1'&@ParamInt16Alias=1") + .isSortOrder(0, false) + .goOrder(0).isBinary(BinaryOperatorKind.EQ).left().goPath() + .first().isFunction("UFCRTETAllPrimTwoParam").goUpFilterValidator() + .goOrder(0).right().isLiteral("'SomeString'"); + + testFilter.runOrderByOnETTwoKeyNav("olingo.odata.test1.UFCRTETAllPrimTwoParam(" + + "ParameterString=@ParamStringAlias,ParameterInt16=@ParamInt16Alias)/PropertyString eq 'SomeString' desc" + + "&@ParamStringAlias='1'&@ParamInt16Alias=1") + .isSortOrder(0, true) + .goOrder(0).isBinary(BinaryOperatorKind.EQ).left().goPath() + .first().isFunction("UFCRTETAllPrimTwoParam").goUpFilterValidator() + .goOrder(0).right().isLiteral("'SomeString'"); + + testFilter.runOrderByOnETTwoKeyNav("olingo.odata.test1.UFCRTETAllPrimTwoParam(" + + "ParameterString=@ParamStringAlias,ParameterInt16=@ParamInt16Alias)/PropertyString eq 'SomeString' desc," + + "PropertyString eq '1'" + + "&@ParamStringAlias='1'&@ParamInt16Alias=1") + .isSortOrder(0, true) + .goOrder(0).isBinary(BinaryOperatorKind.EQ).left().goPath() + .first().isFunction("UFCRTETAllPrimTwoParam").goUpFilterValidator() + .goOrder(0).right().isLiteral("'SomeString'") + .isSortOrder(1, false) + .goOrder(1).isBinary(BinaryOperatorKind.EQ).left().goPath() + .first().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() + .goOrder(1).right().isLiteral("'1'"); + + testFilter.runOrderByOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyDate eq " + + "$root/ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyComp/PropertyComp/PropertyDate") + .isSortOrder(0, false) + .goOrder(0).isBinary(BinaryOperatorKind.EQ).left().goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) + .goUpFilterValidator() + .goOrder(0).right().goPath() + .first().isUriPathInfoKind(UriResourceKind.root) + .n().isEntitySet("ESTwoKeyNav") + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false); + + testFilter.runOrderByOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyDate eq 2013-11-12 desc," + + "PropertyString eq 'SomeString' desc") + .isSortOrder(0, true) + .goOrder(0).isBinary(BinaryOperatorKind.EQ) + .left().goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false).goUpFilterValidator() + .goOrder(0).right().isLiteral("2013-11-12") + .isSortOrder(1, true) + .goOrder(1).left().goPath().first().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .goUpFilterValidator() + .goOrder(1).right().isLiteral("'SomeString'"); + + testFilter.runOrderByOnETTwoKeyNav("PropertyComp desc,PropertyComp/PropertyInt16 eq 1") + .isSortOrder(0, true) + .goOrder(0).goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .goUpFilterValidator() + .isSortOrder(1, false) + .goOrder(1).isBinary(BinaryOperatorKind.EQ) + .left().goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false).goUpFilterValidator() + .goOrder(1).right().isLiteral("1"); + + testFilter.runOrderByOnETTwoKeyNav("NavPropertyETKeyNavOne") + .isSortOrder(0, false).goOrder(0).goPath() + .first().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false); + + testFilter.runOrderByOnETTwoKeyNav("NavPropertyETKeyNavOne/PropertyString") + .isSortOrder(0, false).goOrder(0).goPath() + .first().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOrderByOnETTwoKeyNav("NavPropertyETKeyNavOne/PropertyCompNav") + .isSortOrder(0, false).goOrder(0).goPath() + .first().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .n().isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTNavFiveProp, false); + + testFilter.runOrderByOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyInt16 eq 1") + .isSortOrder(0, false).goOrder(0).left().goPath() + .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testFilter.runOrderByOnETTwoKeyNav("NavPropertyETKeyNavMany(1)/NavPropertyETTwoKeyNavMany(PropertyString='2')" + + "/PropertyString eq 'SomeString'") + .isSortOrder(0, false).goOrder(0).left().goPath() + .first().isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .n().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOrderByOnETTwoKeyNav("NavPropertyETKeyNavMany(1)/NavPropertyETTwoKeyNavMany(PropertyString='2')" + + "/PropertyString eq 'SomeString1' desc,PropertyString eq 'SomeString2' asc") + .isSortOrder(0, true).goOrder(0).left().goPath() + .first().isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .n().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() + .isSortOrder(1, false).goOrder(1).left().goPath() + .first().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testFilter.runOrderByOnETAllPrim("PropertyBoolean eq true") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyBoolean", PropertyProvider.nameBoolean, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("true"); + + testFilter.runOrderByOnETAllPrim("PropertyBoolean eq true desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyBoolean", PropertyProvider.nameBoolean, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("true"); + + testFilter.runOrderByOnETAllPrim("PropertyDouble eq 3.5E+38") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDouble", PropertyProvider.nameDouble, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("3.5E+38"); + + testFilter.runOrderByOnETAllPrim("PropertyDouble eq 3.5E+38 desc").isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDouble", PropertyProvider.nameDouble, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("3.5E+38"); + + testFilter.runOrderByOnETAllPrim("PropertySingle eq 1.5") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertySingle", PropertyProvider.nameSingle, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("1.5"); + + testFilter.runOrderByOnETAllPrim("PropertySingle eq 1.5 desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertySingle", PropertyProvider.nameSingle, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("1.5"); + + testFilter.runOrderByOnETAllPrim("PropertySByte eq -128") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertySByte", PropertyProvider.nameSByte, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("-128"); + + testFilter.runOrderByOnETAllPrim("PropertySByte eq -128 desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertySByte", PropertyProvider.nameSByte, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("-128"); + + testFilter.runOrderByOnETAllPrim("PropertyByte eq 255") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyByte", PropertyProvider.nameByte, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("255"); + + testFilter.runOrderByOnETAllPrim("PropertyByte eq 255 desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyByte", PropertyProvider.nameByte, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("255"); + + testFilter.runOrderByOnETAllPrim("PropertyInt16 eq 32767") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("32767"); + + testFilter.runOrderByOnETAllPrim("PropertyInt16 eq 32767 desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("32767"); + + testFilter.runOrderByOnETAllPrim("PropertyInt32 eq 2147483647") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt32", PropertyProvider.nameInt32, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("2147483647"); + + testFilter.runOrderByOnETAllPrim("PropertyInt32 eq 2147483647 desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt32", PropertyProvider.nameInt32, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("2147483647"); + + testFilter.runOrderByOnETAllPrim("PropertyInt64 eq 9223372036854775807") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt64", PropertyProvider.nameInt64, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("9223372036854775807"); + + testFilter.runOrderByOnETAllPrim("PropertyInt64 eq 9223372036854775807 desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt64", PropertyProvider.nameInt64, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("9223372036854775807"); + + testFilter.runOrderByOnETAllPrim("PropertyBinary eq binary'VGVzdA=='") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyBinary", PropertyProvider.nameBinary, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("binary'VGVzdA=='"); + + testFilter.runOrderByOnETAllPrim("PropertyBinary eq binary'VGVzdA==' desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyBinary", PropertyProvider.nameBinary, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("binary'VGVzdA=='"); + + testFilter.runOrderByOnETAllPrim("PropertyDate eq 2013-09-25") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("2013-09-25"); + + testFilter.runOrderByOnETAllPrim("PropertyDate eq 2013-09-25 desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("2013-09-25"); + + testFilter.runOrderByOnETAllPrim("PropertyDateTimeOffset eq 2013-09-25T12:34:56.123456789012-10:24") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDateTimeOffset", PropertyProvider.nameDateTimeOffset, + false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("2013-09-25T12:34:56.123456789012-10:24"); + + testFilter.runOrderByOnETAllPrim("PropertyDateTimeOffset eq 2013-09-25T12:34:56.123456789012-10:24 desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDateTimeOffset", PropertyProvider.nameDateTimeOffset, + false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("2013-09-25T12:34:56.123456789012-10:24"); + + testFilter.runOrderByOnETAllPrim("PropertyDuration eq duration'P10DT5H34M21.123456789012S'") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDuration", PropertyProvider.nameDuration, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("duration'P10DT5H34M21.123456789012S'"); + + testFilter.runOrderByOnETAllPrim("PropertyDuration eq duration'P10DT5H34M21.123456789012S' desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDuration", PropertyProvider.nameDuration, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("duration'P10DT5H34M21.123456789012S'"); + + testFilter.runOrderByOnETAllPrim("PropertyGuid eq 005056A5-09B1-1ED3-89BD-FB81372CCB33") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyGuid", PropertyProvider.nameGuid, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("005056A5-09B1-1ED3-89BD-FB81372CCB33"); + + testFilter.runOrderByOnETAllPrim("PropertyGuid eq 005056A5-09B1-1ED3-89BD-FB81372CCB33 desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyGuid", PropertyProvider.nameGuid, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("005056A5-09B1-1ED3-89BD-FB81372CCB33"); + + testFilter.runOrderByOnETAllPrim("PropertyString eq 'somestring'") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("'somestring'"); + + testFilter.runOrderByOnETAllPrim("PropertyString eq 'somestring' desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("'somestring'"); + + testFilter.runOrderByOnETAllPrim("PropertyTimeOfDay eq 12:34:55.123456789012") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("12:34:55.123456789012"); + + testFilter.runOrderByOnETAllPrim("PropertyTimeOfDay eq 12:34:55.123456789012 desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) + .goUpFilterValidator() + .goOrder(0).right().isLiteral("12:34:55.123456789012"); + + testFilter.runOrderByOnETMixEnumDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String1'") + .isSortOrder(0, false) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .goOrder(0).right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); + + testFilter.runOrderByOnETMixEnumDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String1' desc") + .isSortOrder(0, true) + .goOrder(0).left().goPath().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpFilterValidator() + .goOrder(0).right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); + + testFilter.runOrderByOnETTwoKeyNavEx("PropertyInt16 1") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + testFilter.runOrderByOnETTwoKeyNavEx("PropertyInt16, PropertyInt32 PropertyDuration") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testFilter.runOrderByOnETTwoKeyNavEx("PropertyInt16 PropertyInt32, PropertyDuration desc") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + testFilter.runOrderByOnETTwoKeyNavEx("PropertyInt16 asc, PropertyInt32 PropertyDuration desc") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testFilter.runOrderByOnETTwoKeyNavEx("PropertyInt16 asc desc") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + testFilter.runOrderByOnETTwoKeyNavEx("undefined") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + testFilter.runOrderByOnETTwoKeyNavEx("PropertyComp/undefined") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + } + + @Test + public void filterLiteralTypes() throws Exception { + testFilter.runOnETAllPrim("-1000 eq 42") + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral("-1000").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16)) + .root() + .right().isLiteral("42").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.SByte)); + + testFilter.runOnETAllPrim("127 eq 128") + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral("127").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.SByte)) + .root() + .right().isLiteral("128").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Byte)); + + testFilter.runOnETAllPrim("null eq 42.1") + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral("null").isLiteralType(null) + .root() + .right().isLiteral("42.1").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Decimal)); + + testFilter.runOnETAllPrim("15.6E300 eq 3.4E37") + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral("15.6E300") + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Double)) + .root() + .right().isLiteral("3.4E37").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Double)); + + testFilter.runOnETAllPrim("15.55555555555555555555555555555555555555555555 eq -12345678901234567890") + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral("15.55555555555555555555555555555555555555555555") + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Decimal)) + .root() + .right().isLiteral("-12345678901234567890") + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Decimal)); + + testFilter.runOnETAllPrim("duration'PT1H2S' eq duration'PT3602S'") + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral("duration'PT1H2S'") + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Duration)) + .root() + .right().isLiteral("duration'PT3602S'") + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Duration)); + + testFilter.runOnETAllPrim("2013-11-02 ne 2012-12-03") + .isBinary(BinaryOperatorKind.NE) + .left().isLiteral("2013-11-02").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Date)) + .root() + .right().isLiteral("2012-12-03").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Date)); + + testFilter.runOnETAllPrim("null eq 2012-12-03T07:16:23Z") + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral("null") + .isLiteralType(null) + .root() + .right().isLiteral("2012-12-03T07:16:23Z") + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.DateTimeOffset)); + + testFilter.runOnETAllPrim("07:59:59.999 eq null") + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral("07:59:59.999") + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.TimeOfDay)) + .root() + .right().isLiteral("null").isLiteralType(null); + + testFilter.runOnETAllPrim("null eq 01234567-89ab-cdef-0123-456789abcdef") + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral("null").isLiteralType(null) + .root() + .right().isLiteral("01234567-89ab-cdef-0123-456789abcdef") + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Guid)); + + testFilter.runOnETAllPrim("binary'VGVzdA==' eq null") + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral("binary'VGVzdA=='").isLiteralType( + oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Binary)) + .root() + .right().isLiteral("null").isLiteralType(null); + + testFilter.runOnETAllPrim(Short.MIN_VALUE + " eq " + Short.MAX_VALUE) + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral(Short.toString(Short.MIN_VALUE)) + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16)) + .root() + .right().isLiteral(Short.toString(Short.MAX_VALUE)) + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16)); + + testFilter.runOnETAllPrim(Integer.MIN_VALUE + " eq " + Integer.MAX_VALUE) + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral(Integer.toString(Integer.MIN_VALUE)) + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int32)) + .root() + .right().isLiteral(Integer.toString(Integer.MAX_VALUE)) + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int32)); + + testFilter.runOnETAllPrim(Long.MIN_VALUE + " eq " + Long.MAX_VALUE) + .isBinary(BinaryOperatorKind.EQ) + .left().isLiteral(Long.toString(Long.MIN_VALUE)) + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int64)) + .root() + .right().isLiteral(Long.toString(Long.MAX_VALUE)) + .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int64)); + } + + @Test + public void filterComplexMixedPriority() throws Exception { + testFilter.runOnETAllPrim("PropertyBoolean or true and false") + .is("< or < and >>"); + testFilter.runOnETAllPrim("PropertyBoolean or true and PropertyInt64 eq PropertyByte") + .is("< or < and < eq >>>"); + testFilter.runOnETAllPrim("PropertyBoolean or PropertyInt32 eq PropertyInt64 and true") + .is("< or << eq > and >>"); + testFilter.runOnETAllPrim("PropertyBoolean or PropertyInt32 eq PropertyInt64 and PropertyByte eq PropertySByte") + .is("< or << eq > " + + "and < eq >>>"); + testFilter.runOnETAllPrim("PropertyInt16 eq PropertyInt32 or PropertyBoolean and true") + .is("<< eq > or < and >>"); + testFilter.runOnETAllPrim("PropertyInt16 eq PropertyInt32 or PropertyBoolean and PropertyByte eq PropertySByte") + .is("<< eq > " + + "or < and < eq >>>"); + testFilter.runOnETAllPrim("PropertyInt16 eq PropertyInt32 or PropertyInt64 eq PropertyByte and PropertyBoolean") + .is("<< eq > " + + "or << eq > and >>"); + testFilter.runOnETAllPrim("PropertyInt16 eq PropertyInt32 or PropertyInt64 eq PropertyByte " + + "and PropertySByte eq PropertyDecimal") + .is("<< eq > or << eq > " + + "and < eq >>>"); + } + + @Test + public void filterSimpleSameBinaryBinaryBinaryPriority() throws Exception { + testFilter.runOnETAllPrim("1 add 2 add 3 add 4 ge 0").isCompr("<<<< <1> add <2>> add <3>> add <4>> ge <0>>"); + testFilter.runOnETAllPrim("1 add 2 add 3 div 4 ge 0").isCompr("<<< <1> add <2>> add <<3> div <4>>> ge <0>>"); + testFilter.runOnETAllPrim("1 add 2 div 3 add 4 ge 0").isCompr("<<< <1> add <<2> div <3>>> add <4>> ge <0>>"); + testFilter.runOnETAllPrim("1 add 2 div 3 div 4 ge 0").isCompr("<< <1> add <<<2> div <3>> div <4>>> ge <0>>"); + testFilter.runOnETAllPrim("1 div 2 add 3 add 4 ge 0").isCompr("<<<< <1> div <2>> add <3>> add <4>> ge <0>>"); + testFilter.runOnETAllPrim("1 div 2 add 3 div 4 ge 0").isCompr("<<< <1> div <2>> add <<3> div <4>>> ge <0>>"); + testFilter.runOnETAllPrim("1 div 2 div 3 add 4 ge 0").isCompr("<<<< <1> div <2>> div <3>> add <4>> ge <0>>"); + testFilter.runOnETAllPrim("1 div 2 div 3 div 4 ge 0").isCompr("<<<< <1> div <2>> div <3>> div <4>> ge <0>>"); + } + + @Test + public void filterSystemQueryOptionManyWithKeyAny() throws Exception { + testFilter.runUriEx("ESAllPrim", "$filter=NavPropertyETTwoPrimMany(1)/any(d:d/PropertyInt16 eq 0)") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + } + + @Test + public void filterSystemQueryOptionManyWithKeyAll() throws Exception { + testFilter.runUriEx("ESAllPrim", "$filter=NavPropertyETTwoPrimMany(1)/all(d:d/PropertyInt16 eq 0)") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + } + + @Test + public void filterOnCountAndRef() throws Exception { + testFilter.runUri("ESKeyNav/$count", "$filter=PropertyInt16 ge 0") + .isBinary(BinaryOperatorKind.GE) + .left().goPath().first().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .goUpFilterValidator().root().right().isLiteral("0"); + + testFilter.runUri("ESKeyNav/$ref", "$filter=PropertyInt16 ge 0") + .isBinary(BinaryOperatorKind.GE) + .left().goPath().first().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .goUpFilterValidator().root().right().isLiteral("0"); + } + + @Test + public void keyPredicatesInExpressions() throws Exception { + testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavMany(PropertyString='1',PropertyInt16=1)" + + "/PropertyInt16 eq 1"); + + testFilter.runOnETTwoKeyNavEx("NavPropertyETTwoKeyNavMany(Prop='22',P=2)/PropertyInt16 eq 0") + .isExValidation(UriValidationException.MessageKeys.INVALID_KEY_PROPERTY); + } + + @Test + public void geo() throws Exception { + testFilter.runOnETAllPrim("geo.distance(geometry'SRID=0;Point(0 0)',geometry'SRID=0;Point(1 1)') lt 1.5") + .left().isMethod(MethodKind.GEODISTANCE, 2) + .goParameter(0).isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.GeometryPoint)) + .root().left() + .goParameter(1).isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.GeometryPoint)); + testFilter.runOnETAllPrim("geo.length(geometry'SRID=0;LineString(0 0,1 1)') lt 1.5") + .left().isMethod(MethodKind.GEOLENGTH, 1) + .goParameter(0).isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.GeometryLineString)); + testFilter.runOnETAllPrim("geo.intersects(geometry'SRID=0;Point(0 0)',null)") + .isMethod(MethodKind.GEOINTERSECTS, 2) + .goParameter(0).isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.GeometryPoint)); + } +} diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ResourcePathParserTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ResourcePathParserTest.java new file mode 100644 index 000000000..7be4e7959 --- /dev/null +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ResourcePathParserTest.java @@ -0,0 +1,2100 @@ +/* + * 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.uri.parser; + +import java.util.Collections; + +import org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.edmx.EdmxReference; +import org.apache.olingo.server.api.OData; +import org.apache.olingo.server.api.uri.UriResourceKind; +import org.apache.olingo.server.core.uri.parser.UriParserSemanticException.MessageKeys; +import org.apache.olingo.server.core.uri.testutil.ResourceValidator; +import org.apache.olingo.server.core.uri.testutil.TestUriValidator; +import org.apache.olingo.server.core.uri.validator.UriValidationException; +import org.apache.olingo.server.tecsvc.provider.ActionProvider; +import org.apache.olingo.server.tecsvc.provider.ComplexTypeProvider; +import org.apache.olingo.server.tecsvc.provider.ContainerProvider; +import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; +import org.apache.olingo.server.tecsvc.provider.EntityTypeProvider; +import org.apache.olingo.server.tecsvc.provider.EnumTypeProvider; +import org.apache.olingo.server.tecsvc.provider.PropertyProvider; +import org.apache.olingo.server.tecsvc.provider.TypeDefinitionProvider; +import org.junit.Test; + +/** Tests of the parts of the URI parser that parse the resource path without query options. */ +public class ResourcePathParserTest { + + private static final Edm edm = OData.newInstance().createServiceMetadata( + new EdmTechProvider(), Collections. emptyList()).getEdm(); + + private final TestUriValidator testUri = new TestUriValidator().setEdm(edm); + private final ResourceValidator testRes = new ResourceValidator().setEdm(edm); + + @Test + public void esName() throws Exception { + testRes.run("ESAllPrim") + .isEntitySet("ESAllPrim") + .isType(EntityTypeProvider.nameETAllPrim, true); + + testRes.run("ESAllPrim/$count") + .isEntitySet("ESAllPrim") + .isType(EntityTypeProvider.nameETAllPrim, true) + .n() + .isCount(); + } + + @Test + public void esNameError() { + testUri.runEx("ESAllPrim/$count/$ref").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("ESAllPrim/$ref/$count").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("ESAllPrim/$ref/invalid").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("ESAllPrim/$count/invalid").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("ESAllPrim/PropertyString").isExSemantic(MessageKeys.PROPERTY_AFTER_COLLECTION); + testUri.runEx("ESAllPrim(1)/whatever").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("ESAllPrim('1')").isExSemantic(MessageKeys.INVALID_KEY_VALUE); + testUri.runEx("ESAllPrim(PropertyInt16)").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testUri.runEx("ESAllPrim(PropertyInt16=)").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testUri.runEx("ESAllPrim(PropertyInt16=1,Invalid='1')").isExSemantic(MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES); + + testUri.runEx("ESBase/olingo.odata.test1.ETBase/PropertyInt16") + .isExSemantic(MessageKeys.PROPERTY_AFTER_COLLECTION); + + testUri.runEx("ETBaseTwoKeyTwoPrim/olingo.odata.test1.ETBaseTwoKeyTwoPrim" + + "/olingo.odata.test1.ETTwoBaseTwoKeyTwoPrim") + .isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); + + testUri.runEx("ETBaseTwoKeyTwoPrim/olingo.odata.test1.ETBaseTwoKeyTwoPrim(1)/olingo.odata.test1.ETAllKey") + .isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); + + testUri.runEx("ETBaseTwoKeyTwoPrim(1)/olingo.odata.test1.ETBaseTwoKeyTwoPrim('1')/olingo.odata.test1.ETAllKey") + .isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); + + testUri.runEx("ETBaseTwoKeyTwoPrim(1)/olingo.odata.test1.ETBaseTwoKeyTwoPrim" + + "/olingo.odata.test1.ETTwoBaseTwoKeyTwoPrim") + .isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); + + testUri.runEx("ETBaseTwoKeyTwoPrim/olingo.odata.test1.ETBaseTwoKeyTwoPrim" + + "/olingo.odata.test1.ETTwoBaseTwoKeyTwoPrim(1)") + .isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); + + testUri.runEx("ETBaseTwoKeyTwoPrim/olingo.odata.test1.ETAllKey").isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); + testUri.runEx("ETBaseTwoKeyTwoPrim()").isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); + testUri.runEx("ESAllNullable(1)/CollPropertyString/$value").isExSemantic(MessageKeys.ONLY_FOR_TYPED_PARTS); + + testUri.runEx("ETMixPrimCollComp(1)/ComplexProperty/$value").isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); + } + + @Test + public void esNameCast() throws Exception { + testRes.run("ESTwoPrim/olingo.odata.test1.ETBase") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim, true) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBase); + + testRes.run("ESTwoPrim/olingo.odata.test1.ETBase(-32768)/olingo.odata.test1.ETTwoBase") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim, false) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBase) + .isKeyPredicate(0, "PropertyInt16", "-32768") + .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBase); + + testRes.run("ESTwoPrim/olingo.odata.test1.ETTwoBase(-32768)") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim, false) + .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase) + .isKeyPredicate(0, "PropertyInt16", "-32768"); + + testRes.run("ESTwoPrim/Namespace1_Alias.ETTwoBase(-32768)") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim, false) + .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase) + .isKeyPredicate(0, "PropertyInt16", "-32768"); + + testRes.run("ESTwoPrim/Namespace1_Alias.ETTwoBase(PropertyInt16=-32768)") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim, false) + .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase) + .isKeyPredicate(0, "PropertyInt16", "-32768"); + + testUri.runEx("ESAllPrim/namespace.Invalid").isExSemantic(MessageKeys.UNKNOWN_TYPE); + } + + @Test + public void esNamePpSpCast() throws Exception { + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav/PropertyDate") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false); + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" + + "/PropertyComp/PropertyInt16") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testRes.run("ESTwoPrim/Namespace1_Alias.ETBase(PropertyInt16=1)/AdditionalPropertyString_5") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBase) + .isTypeFilterOnEntry(null) + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isPrimitiveProperty("AdditionalPropertyString_5", PropertyProvider.nameString, false); + } + + @Test + public void esNameKey() throws Exception { + testRes.run("ESKeyNav(1)") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1"); + + testRes.run("ESCollAllPrim(PropertyInt16=1)") + .isEntitySet("ESCollAllPrim"); + + testRes.run("ESTwoKeyTwoPrim(PropertyInt16=1,PropertyString='ABC')") + .isEntitySet("ESTwoKeyTwoPrim") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'ABC'"); + + testRes.run("ESFourKeyAlias(PropertyInt16=1,KeyAlias1=2,KeyAlias2='3',KeyAlias3='4')") + .isEntitySet("ESFourKeyAlias") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "KeyAlias1", "2") + .isKeyPredicate(2, "KeyAlias2", "'3'") + .isKeyPredicate(3, "KeyAlias3", "'4'"); + + testUri.runEx("ESTwoPrim('wrong')").isExSemantic(MessageKeys.INVALID_KEY_VALUE); + testUri.runEx("ESTwoPrim(PropertyInt16='wrong')").isExSemantic(MessageKeys.INVALID_KEY_VALUE); + } + + @Test + public void esNameParaKeys() throws Exception { + testRes.run("ESAllKey(PropertyString='O''Neil',PropertyBoolean=true,PropertyByte=255," + + "PropertySByte=-128,PropertyInt16=-32768,PropertyInt32=-2147483648," + + "PropertyInt64=-9223372036854775808,PropertyDecimal=1,PropertyDate=2013-09-25," + + "PropertyDateTimeOffset=2002-10-10T12:00:00-05:00," + + "PropertyDuration=duration'P50903316DT2H25M4S'," + + "PropertyGuid=12345678-1234-1234-1234-123456789012," + + "PropertyTimeOfDay=12:34:55)") + .isEntitySet("ESAllKey") + .isKeyPredicate(0, "PropertyString", "'O''Neil'") + .isKeyPredicate(1, "PropertyBoolean", "true") + .isKeyPredicate(2, "PropertyByte", "255") + .isKeyPredicate(3, "PropertySByte", "-128") + .isKeyPredicate(4, "PropertyInt16", "-32768") + .isKeyPredicate(5, "PropertyInt32", "-2147483648") + .isKeyPredicate(6, "PropertyInt64", "-9223372036854775808") + .isKeyPredicate(7, "PropertyDecimal", "1") + .isKeyPredicate(8, "PropertyDate", "2013-09-25") + .isKeyPredicate(9, "PropertyDateTimeOffset", "2002-10-10T12:00:00-05:00") + .isKeyPredicate(10, "PropertyDuration", "duration'P50903316DT2H25M4S'") + .isKeyPredicate(11, "PropertyGuid", "12345678-1234-1234-1234-123456789012") + .isKeyPredicate(12, "PropertyTimeOfDay", "12:34:55"); + } + + @Test + public void esNameKeyCast() throws Exception { + testRes.run("ESTwoPrim(1)/olingo.odata.test1.ETBase") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim) + .isKeyPredicate(0, "PropertyInt16", "1") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBase); + + testRes.run("ESTwoPrim(1)/olingo.odata.test1.ETTwoBase") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim) + .isKeyPredicate(0, "PropertyInt16", "1") + .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBase); + + testRes.run("ESTwoPrim/olingo.odata.test1.ETBase(1)") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim) + .isKeyPredicate(0, "PropertyInt16", "1") + .isTypeFilterOnCollection(EntityTypeProvider.nameETBase); + + testRes.run("ESTwoPrim/olingo.odata.test1.ETTwoBase(1)") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim) + .isKeyPredicate(0, "PropertyInt16", "1") + .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase); + + testRes.run("ESTwoPrim/olingo.odata.test1.ETBase(1)/olingo.odata.test1.ETTwoBase") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim) + .isKeyPredicate(0, "PropertyInt16", "1") + .isTypeFilterOnCollection(EntityTypeProvider.nameETBase); + + testRes.run("ESTwoPrim/olingo.odata.test1.ETTwoBase") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim) + .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase); + + // Keys cannot be specified twice. + testUri.runEx("ESTwoPrim(1)/olingo.odata.test1.ETBase(1)") + .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); + testUri.runEx("ESTwoPrim/olingo.odata.test1.ETBase(1)/olingo.odata.test1.ETTwoBase(1)") + .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); + + testUri.runEx("ESAllPrim(0)/namespace.Invalid").isExSemantic(MessageKeys.UNKNOWN_TYPE); + testUri.runEx("ESBase/olingo.odata.test1.ETTwoPrim(1)").isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER); + } + + @Test + public void esNameParaKeysCast() throws Exception { + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=1,PropertyString='2')") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'"); + + testRes.run("ESTwoPrim(PropertyInt16=1)/olingo.odata.test1.ETBase/AdditionalPropertyString_5") + .isEntitySet("ESTwoPrim") + .isType(EntityTypeProvider.nameETTwoPrim) + .isTypeFilterOnCollection(null) + .isTypeFilterOnEntry(EntityTypeProvider.nameETBase) + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isPrimitiveProperty("AdditionalPropertyString_5", PropertyProvider.nameString, false); + } + + @Test + public void esNamePpCp() throws Exception { + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyComp") + .isEntitySet("ESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false); + + testRes.run("ESCompAllPrim(1)/PropertyComp/PropertyString") + .isEntitySet("ESCompAllPrim").isKeyPredicate(0, "PropertyInt16", "1") + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyComp/PropertyComp") + .isEntitySet("ESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false); + + testRes.run("ESMixEnumDefCollComp(PropertyEnumString=olingo.odata.test1.ENString'String1'," + + "PropertyDefString='key1')/PropertyEnumString") + .isEntitySet("ESMixEnumDefCollComp") + .isKeyPredicate(0, "PropertyEnumString", "olingo.odata.test1.ENString'String1'") + .isKeyPredicate(1, "PropertyDefString", "'key1'") + .n() + .isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false); + + testRes.run("ESMixEnumDefCollComp(PropertyEnumString=olingo.odata.test1.ENString'String1'," + + "PropertyDefString='key1')/PropertyDefString") + .isEntitySet("ESMixEnumDefCollComp") + .isKeyPredicate(0, "PropertyEnumString", "olingo.odata.test1.ENString'String1'") + .isKeyPredicate(1, "PropertyDefString", "'key1'") + .n() + .isPrimitiveProperty("PropertyDefString", TypeDefinitionProvider.nameTDString, false); + } + + @Test + public void esNamePpCpColl() throws Exception { + testRes.run("ESMixPrimCollComp(5)/CollPropertyComp") + .isEntitySet("ESMixPrimCollComp") + .isKeyPredicate(0, "PropertyInt16", "5") + .n() + .isComplexProperty("CollPropertyComp", ComplexTypeProvider.nameCTTwoPrim, true); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/CollPropertyComp") + .isEntitySet("ESKeyNav") + .n().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .n().isComplexProperty("CollPropertyComp", ComplexTypeProvider.nameCTPrimComp, true); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/CollPropertyComp/$count") + .isEntitySet("ESKeyNav") + .n().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .n().isComplexProperty("CollPropertyComp", ComplexTypeProvider.nameCTPrimComp, true) + .n().isCount(); + + testRes.run("ESMixEnumDefCollComp(PropertyEnumString=olingo.odata.test1.ENString'String1'," + + "PropertyDefString='key1')/CollPropertyEnumString") + .isEntitySet("ESMixEnumDefCollComp") + .isKeyPredicate(0, "PropertyEnumString", "olingo.odata.test1.ENString'String1'") + .isKeyPredicate(1, "PropertyDefString", "'key1'") + .n() + .isPrimitiveProperty("CollPropertyEnumString", EnumTypeProvider.nameENString, true); + + testRes.run("ESMixEnumDefCollComp(PropertyEnumString=olingo.odata.test1.ENString'String1'," + + "PropertyDefString='key1')/CollPropertyDefString") + .isEntitySet("ESMixEnumDefCollComp") + .isKeyPredicate(0, "PropertyEnumString", "olingo.odata.test1.ENString'String1'") + .isKeyPredicate(1, "PropertyDefString", "'key1'") + .n() + .isPrimitiveProperty("CollPropertyDefString", TypeDefinitionProvider.nameTDString, true); + } + + @Test + public void esNamePpCpCast() throws Exception { + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav/PropertyComp") + .isEntitySet("ESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false); + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" + + "/PropertyComp/PropertyComp") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false); + + testRes + .run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" + + "/PropertyCompTwoPrim/olingo.odata.test1.CTBase") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isComplexProperty("PropertyCompTwoPrim", ComplexTypeProvider.nameCTTwoPrim, false) + .isTypeFilter(ComplexTypeProvider.nameCTBase); + + testRes + .run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" + + "/PropertyCompTwoPrim/olingo.odata.test1.CTTwoBase") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isComplexProperty("PropertyCompTwoPrim", ComplexTypeProvider.nameCTTwoPrim, false) + .isTypeFilter(ComplexTypeProvider.nameCTTwoBase); + } + + @Test + public void esNamePpNp() throws Exception { + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne") + .isEntitySet("ESKeyNav").isKeyPredicate(0, "PropertyInt16", "1") + .n().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany") + .isEntitySet("ESKeyNav").isKeyPredicate(0, "PropertyInt16", "1") + .n().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true); + + testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(2)") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2"); + + testRes.run("ESKeyNav(PropertyInt16=1)/NavPropertyETKeyNavMany(PropertyInt16=2)") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2"); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/PropertyString") + .isEntitySet("ESKeyNav").isKeyPredicate(0, "PropertyInt16", "1") + .n().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(2)/PropertyInt16") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')" + + "/NavPropertyETKeyNavMany(1)") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'1'") + .n().isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1"); + + testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(2)/PropertyCompNav") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .n() + .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTNavFiveProp, false); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/NavPropertyETKeyNavOne") + .isEntitySet("ESKeyNav").isKeyPredicate(0, "PropertyInt16", "1") + .n().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .n().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false); + + testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(2)/NavPropertyETKeyNavOne") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .n() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')" + + "/NavPropertyETKeyNavMany(4)") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'") + .n() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "4"); + + testRes.run("ESKeyNav(1)/PropertyCompNav/NavPropertyETTwoKeyNavOne") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n().isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTNavFiveProp, false) + .n().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='(3)')" + + "/PropertyComp/PropertyComp/PropertyInt16") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'(3)'") + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany/$count") + .isEntitySet("ESKeyNav").isKeyPredicate(0, "PropertyInt16", "1") + .n().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .n().isCount(); + + testRes.run("ESKeyNav(1)/NavPropertyETMediaMany(2)/$value") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETMediaMany", EntityTypeProvider.nameETMedia, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .n() + .isValue(); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')" + + "/NavPropertyETKeyNavOne/PropertyString") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'1'") + .n().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')" + + "/NavPropertyETKeyNavMany(1)/PropertyString") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'1'") + .n().isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')" + + "/NavPropertyETKeyNavOne/NavPropertyETMediaOne/$value") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'") + .n() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .n() + .isNavProperty("NavPropertyETMediaOne", EntityTypeProvider.nameETMedia, false) + .n() + .isValue(); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')" + + "/NavPropertyETKeyNavOne/$ref") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'") + .n() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .n() + .isRef(); + } + + @Test + public void esNamePpNpCast() throws Exception { + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" + + "/NavPropertyETKeyNavMany") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" + + "/NavPropertyETKeyNavMany(3)") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "3"); + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" + + "/NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETTwoBaseTwoKeyNav(PropertyInt16=3,PropertyString='4')") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "3") + .isKeyPredicate(1, "PropertyString", "'4'") + .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBaseTwoKeyNav); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')" + + "/NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=4,PropertyString='5')" + + "/olingo.odata.test1.ETTwoBaseTwoKeyNav/NavPropertyETBaseTwoKeyNavMany") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "4") + .isKeyPredicate(1, "PropertyString", "'5'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav) + .n() + .isNavProperty("NavPropertyETBaseTwoKeyNavMany", EntityTypeProvider.nameETBaseTwoKeyNav, true); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/" + + "NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=4,PropertyString='5')/" + + "NavPropertyETKeyNavMany") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "4") + .isKeyPredicate(1, "PropertyString", "'5'") + .n() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); + } + + @Test + public void navigationWithMoreThanOneKey() throws Exception { + testUri.runEx("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='2')" + + "(PropertyInt16=1,PropertyString='2')") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + } + + @Test + public void referentialConstraints() throws Exception { + // checks for using referential constraints to fill missing keys + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany('2')") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicateRef(0, "PropertyInt16", "PropertyInt16") + .isKeyPredicate(1, "PropertyString", "'2'"); + + testRes.run("ESKeyNav(PropertyInt16=1)/NavPropertyETTwoKeyNavMany(PropertyString='2')") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicateRef(0, "PropertyInt16", "PropertyInt16") + .isKeyPredicate(1, "PropertyString", "'2'"); + } + + @Test + public void esNamePpSp() throws Exception { + testRes.run("ESAllPrim(1)/PropertyByte") + .isEntitySet("ESAllPrim") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isPrimitiveProperty("PropertyByte", PropertyProvider.nameByte, false); + + testRes.run("ESAllPrim(1)/PropertyByte/$value") + .isEntitySet("ESAllPrim") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isPrimitiveProperty("PropertyByte", PropertyProvider.nameByte, false) + .n() + .isValue(); + + testRes.run("ESMixPrimCollComp(1)/PropertyComp/PropertyString") + .isEntitySet("ESMixPrimCollComp") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTTwoPrim, false) + .n() + .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + } + + @Test + public void esNamePpSpColl() throws Exception { + testRes.run("ESCollAllPrim(1)/CollPropertyString") + .isEntitySet("ESCollAllPrim") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/CollPropertyString") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .n() + .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/CollPropertyString/$count") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'") + .n() + .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) + .n() + .isCount(); + } + + @Test + public void esNameRef() throws Exception { + testRes.run("ESAllPrim/$ref") + .isEntitySet("ESAllPrim") + .n().isRef(); + + testRes.run("ESAllPrim(-32768)/$ref") + .isEntitySet("ESAllPrim").isKeyPredicate(0, "PropertyInt16", "-32768") + .n().isRef(); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/$ref") + .isEntitySet("ESKeyNav").isKeyPredicate(0, "PropertyInt16", "1") + .n().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .n().isRef(); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany/$ref") + .isEntitySet("ESKeyNav").isKeyPredicate(0, "PropertyInt16", "1") + .n().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) + .n().isRef(); + + testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='2')/$ref") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .n() + .isRef(); + } + + @Test + public void singletonEntityValue() throws Exception { + testRes.run("SIMedia/$value") + .isSingleton("SIMedia") + .n().isValue(); + } + + @Test + public void singletonPpNpCast() throws Exception { + testRes.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETKeyNavMany") + .isSingleton("SINav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); + + testRes.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETKeyNavMany(1)") + .isSingleton("SINav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1"); + } + + @Test + public void singletonPpCpCast() throws Exception { + testRes.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/PropertyComp") + .isSingleton("SINav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false); + + testRes.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/PropertyComp/PropertyComp") + .isSingleton("SINav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false); + + testRes.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/PropertyCompTwoPrim/olingo.odata.test1.CTBase") + .isSingleton("SINav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isComplexProperty("PropertyCompTwoPrim", ComplexTypeProvider.nameCTTwoPrim, false) + .isTypeFilter(ComplexTypeProvider.nameCTBase); + } + + @Test + public void singletonPpSpCast() throws Exception { + testRes.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/PropertyInt16") + .isSingleton("SINav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testRes.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/CollPropertyString") + .isSingleton("SINav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) + .isType(PropertyProvider.nameString, true); + } + + @Test + public void singletonEntityPpNp() throws Exception { + testRes.run("SINav/NavPropertyETKeyNavMany") + .isSingleton("SINav") + .n().isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); + + testRes.run("SINav/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='2')") + .isSingleton("SINav") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'"); + } + + @Test + public void singletonEntityPpCp() throws Exception { + testRes.run("SINav/PropertyComp") + .isSingleton("SINav") + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false); + + testRes.run("SINav/PropertyComp/PropertyComp") + .isSingleton("SINav") + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false); + + testRes.run("SINav/PropertyComp/PropertyInt16") + .isSingleton("SINav").isType(EntityTypeProvider.nameETTwoKeyNav) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + } + + @Test + public void singletonEntityPpCpColl() throws Exception { + testRes.run("SINav/CollPropertyComp") + .isSingleton("SINav") + .n().isComplexProperty("CollPropertyComp", ComplexTypeProvider.nameCTPrimComp, true); + + testRes.run("SINav/CollPropertyComp/$count") + .isSingleton("SINav") + .n().isComplexProperty("CollPropertyComp", ComplexTypeProvider.nameCTPrimComp, true) + .n().isCount(); + } + + @Test + public void singletonEntityPpSp() throws Exception { + testRes.run("SINav/PropertyString") + .isSingleton("SINav") + .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + } + + @Test + public void singletonEntityPpSpColl() throws Exception { + testRes.run("SINav/CollPropertyString") + .isSingleton("SINav") + .n().isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true); + + testRes.run("SINav/CollPropertyString/$count") + .isSingleton("SINav") + .n().isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) + .n().isCount(); + } + + @Test + public void valueOnNonMediaEntity() throws Exception { + testUri.runEx("ESAllPrim/$value").isExSemantic(UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS); + testUri.runEx("ESAllPrim(1)/NavPropertyETTwoPrimMany/$value").isExSemantic( + UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS); + testUri.runEx("FICRTCollESMedia()/$value") + .isExSemantic(UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS); + + testUri.runEx("ESAllPrim(1)/$value").isExSemantic(UriParserSemanticException.MessageKeys.NOT_A_MEDIA_RESOURCE); + testUri.runEx("ESAllPrim(1)/NavPropertyETTwoPrimOne/$value").isExSemantic( + UriParserSemanticException.MessageKeys.NOT_A_MEDIA_RESOURCE); + testUri.runEx("FICRTETKeyNav()/$value").isExSemantic(UriParserSemanticException.MessageKeys.NOT_A_MEDIA_RESOURCE); + } + + @Test + public void functionBound_varReturnType() { + // returning primitive + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTString()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .n() + .isUriPathInfoKind(UriResourceKind.function) + .isType(PropertyProvider.nameString, false); + + // returning collection of primitive + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollString()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .n() + .isUriPathInfoKind(UriResourceKind.function) + .isType(PropertyProvider.nameString, true); + + // returning single complex + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCTTwoPrim()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .n() + .isUriPathInfoKind(UriResourceKind.function) + .isType(ComplexTypeProvider.nameCTTwoPrim, false); + + // returning collection of complex + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollCTTwoPrim()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .n() + .isUriPathInfoKind(UriResourceKind.function) + .isType(ComplexTypeProvider.nameCTTwoPrim, true); + + // returning single entity + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='ABC')" + + "/olingo.odata.test1.ETBaseTwoKeyNav/olingo.odata.test1.BFCETBaseTwoKeyNavRTETTwoKeyNav()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isUriPathInfoKind(UriResourceKind.function) + .isType(EntityTypeProvider.nameETTwoKeyNav, false); + + // returning collection of entity (aka entitySet) + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='ABC')/olingo.odata.test1.BFCSINavRTESTwoKeyNav()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n() + .isUriPathInfoKind(UriResourceKind.function) + .isType(EntityTypeProvider.nameETTwoKeyNav, true); + } + + @Test + public void functionBound_varOverloading() throws Exception { + // on ESTwoKeyNav + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .n() + .isUriPathInfoKind(UriResourceKind.function) + .isType(EntityTypeProvider.nameETTwoKeyNav); + + // with string parameter + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_(ParameterString='ABC')") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .n() + .isUriPathInfoKind(UriResourceKind.function) + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isParameter(0, "ParameterString", "'ABC'"); + + // with string parameter + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .n() + .isUriPathInfoKind(UriResourceKind.function) + .isType(EntityTypeProvider.nameETTwoKeyNav); + } + + @Test + public void boundFuncBnCpropCastRtEs() throws Exception { + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" + + "/PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESBaseTwoKeyNav()") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n().isFunction("BFCCTPrimCompRTESBaseTwoKeyNav"); + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" + + "/PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESBaseTwoKeyNav()/$count") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isFunction("BFCCTPrimCompRTESBaseTwoKeyNav") + .isType(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isUriPathInfoKind(UriResourceKind.count); + } + + @Test + public void boundFuncBnCpropCollRtEs() throws Exception { + testRes.run("ESKeyNav(PropertyInt16=1)/CollPropertyComp/olingo.odata.test1.BFCCollCTPrimCompRTESAllPrim()") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isUriPathInfoKind(UriResourceKind.complexProperty) + .isComplexProperty("CollPropertyComp", ComplexTypeProvider.nameCTPrimComp, true) + .n() + .isFunction("BFCCollCTPrimCompRTESAllPrim"); + + testRes + .run("ESKeyNav(PropertyInt16=1)/CollPropertyComp/olingo.odata.test1.BFCCollCTPrimCompRTESAllPrim()/$count") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isUriPathInfoKind(UriResourceKind.complexProperty) + .isComplexProperty("CollPropertyComp", ComplexTypeProvider.nameCTPrimComp, true) + .n() + .isFunction("BFCCollCTPrimCompRTESAllPrim") + .isType(EntityTypeProvider.nameETAllPrim, true) + .n() + .isUriPathInfoKind(UriResourceKind.count); + } + + @Test + public void boundFuncBnCpropRtEs() throws Exception { + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')" + + "/PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESTwoKeyNav()") + .isEntitySet("ESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .n() + .isUriPathInfoKind(UriResourceKind.complexProperty) + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isFunction("BFCCTPrimCompRTESTwoKeyNav"); + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')" + + "/PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESTwoKeyNav()/$count") + .isEntitySet("ESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .n() + .isUriPathInfoKind(UriResourceKind.complexProperty) + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isFunction("BFCCTPrimCompRTESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .n() + .isUriPathInfoKind(UriResourceKind.count); + } + + @Test + public void boundFuncBnEntityRtEs() throws Exception { + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.BFCETTwoKeyNavRTESTwoKeyNav()") + .isEntitySet("ESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .n() + .isFunction("BFCETTwoKeyNavRTESTwoKeyNav"); + } + + @Test + public void boundFuncBnEntityCastRtEs() throws Exception { + testRes + .run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" + + "/olingo.odata.test1.BFCETBaseTwoKeyNavRTESTwoKeyNav()") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isFunction("BFCETBaseTwoKeyNavRTESTwoKeyNav"); + + testRes + .run("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=1,PropertyString='(''2'')')" + + "/olingo.odata.test1.BFCETBaseTwoKeyNavRTESTwoKeyNav()") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'(''2'')'") + .n() + .isFunction("BFCETBaseTwoKeyNavRTESTwoKeyNav"); + } + + @Test + public void boundFuncBnEsCastRtEs() throws Exception { + testRes.run("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav" + + "/olingo.odata.test1.BFCESBaseTwoKeyNavRTESBaseTwoKey()") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isFunction("BFCESBaseTwoKeyNavRTESBaseTwoKey"); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav" + + "/olingo.odata.test1.BFCESBaseTwoKeyNavRTESBaseTwoKey()" + + "/olingo.odata.test1.ETTwoBaseTwoKeyNav") + .isEntitySet("ESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isFunction("BFCESBaseTwoKeyNavRTESBaseTwoKey") + .isType(EntityTypeProvider.nameETBaseTwoKeyNav) + .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBaseTwoKeyNav); + + testRes.run("ESTwoKeyNav" + + "/olingo.odata.test1.BFC_RTESTwoKeyNav_()" + + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=1,PropertyString='2')" + + "/olingo.odata.test1.ETTwoBaseTwoKeyNav") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFC_RTESTwoKeyNav_") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav); + } + + @Test + public void boundFuncBnEsRtCprop() throws Exception { + testRes.run("ESAllPrim/olingo.odata.test1.BFNESAllPrimRTCTAllPrim()") + .isEntitySet("ESAllPrim") + .n() + .isFunction("BFNESAllPrimRTCTAllPrim") + .isType(ComplexTypeProvider.nameCTAllPrim); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCTTwoPrim()/olingo.odata.test1.CTBase") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFCESTwoKeyNavRTCTTwoPrim") + .isType(ComplexTypeProvider.nameCTTwoPrim, false) + .isTypeFilterOnEntry(ComplexTypeProvider.nameCTBase); + } + + @Test + public void boundFuncBnEsRtCpropColl() throws Exception { + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollCTTwoPrim()") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFCESTwoKeyNavRTCollCTTwoPrim") + .isType(ComplexTypeProvider.nameCTTwoPrim, true); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollCTTwoPrim()/$count") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFCESTwoKeyNavRTCollCTTwoPrim") + .isType(ComplexTypeProvider.nameCTTwoPrim, true) + .n() + .isUriPathInfoKind(UriResourceKind.count); + } + + @Test + public void boundFuncBnEsRtEntityPpNp() throws Exception { + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTTwoKeyNav()/NavPropertyETKeyNavOne") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFCESTwoKeyNavRTTwoKeyNav") + .n() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTTwoKeyNav()/NavPropertyETKeyNavOne/$ref") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFCESTwoKeyNavRTTwoKeyNav") + .n() + .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) + .n() + .isUriPathInfoKind(UriResourceKind.ref); + + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/NavPropertyETMediaOne/$value") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNav") + .n() + .isNavProperty("NavPropertyETMediaOne", EntityTypeProvider.nameETMedia, false) + .n() + .isValue(); + + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" + + "/NavPropertyETTwoKeyNavOne") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNavParam") + .isParameter(0, "ParameterString", "'1'") + .n() + .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); + + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" + + "/NavPropertyETTwoKeyNavOne/PropertyComp") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNavParam") + .isParameter(0, "ParameterString", "'1'") + .n() + .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false); + + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" + + "/NavPropertyETTwoKeyNavOne/PropertyComp/PropertyComp") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNavParam") + .isParameter(0, "ParameterString", "'1'") + .n() + .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false); + + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" + + "/NavPropertyETTwoKeyNavOne/PropertyString") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNavParam") + .isParameter(0, "ParameterString", "'1'") + .n() + .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .n() + .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" + + "/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/PropertyString") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNavParam") + .isParameter(0, "ParameterString", "'1'") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'") + .n() + .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testUri.runEx("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(WrongParameter='1')") + .isExSemantic(MessageKeys.UNKNOWN_PART); + testUri.runEx("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString=wrong)") + .isExSemantic(MessageKeys.INVALID_KEY_VALUE); + } + + @Test + public void boundFuncBnEsRtEntyPpNpCast() throws Exception { + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTTwoKeyNav()" + + "/NavPropertyETTwoKeyNavOne/olingo.odata.test1.ETBaseTwoKeyNav") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFCESTwoKeyNavRTTwoKeyNav") + .n() + .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav); + + testRes + .run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()(PropertyInt16=1,PropertyString='2')" + + "/NavPropertyETTwoKeyNavOne/olingo.odata.test1.ETTwoBaseTwoKeyNav") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFC_RTESTwoKeyNav_") + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .n() + .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav); + } + + @Test + public void boundFuncBnEsRtEntityPpCp() throws Exception { + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyCompNav") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNav") + .n() + .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTNavFiveProp, false); + + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyCompNav/PropertyInt16") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNav") + .n() + .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTNavFiveProp, false) + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyCompNav/PropertyInt16/$value") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNav") + .n() + .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTNavFiveProp, false) + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .n() + .isValue(); + } + + @Test + public void boundFuncBnEsRtEntyPpCpCast() throws Exception { + + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" + + "/PropertyCompTwoPrim/olingo.odata.test1.CTTwoBase") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNavParam") + .isParameter(0, "ParameterString", "'1'") + .n() + .isComplexProperty("PropertyCompTwoPrim", ComplexTypeProvider.nameCTTwoPrim, false) + .isTypeFilter(ComplexTypeProvider.nameCTTwoBase); + + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" + + "/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')" + + "/PropertyCompTwoPrim/olingo.odata.test1.CTTwoBase") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNavParam") + .isParameter(0, "ParameterString", "'1'") + .n() + .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'") + .n() + .isComplexProperty("PropertyCompTwoPrim", ComplexTypeProvider.nameCTTwoPrim, false) + .isTypeFilter(ComplexTypeProvider.nameCTTwoBase); + } + + @Test + public void boundFuncBnEsRtEntityPpSp() throws Exception { + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyInt16") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNav") + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testRes.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyInt16/$value") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFCESKeyNavRTETKeyNav") + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .n() + .isValue(); + } + + @Test + public void boundFuncBnEsRtEs() throws Exception { + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFC_RTESTwoKeyNav_") + .isType(EntityTypeProvider.nameETTwoKeyNav); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_(ParameterString='2')") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFC_RTESTwoKeyNav_") + .isParameter(0, "ParameterString", "'2'") + .isType(EntityTypeProvider.nameETTwoKeyNav); + + testRes.run("ESKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") + .isEntitySet("ESKeyNav") + .n() + .isFunction("BFC_RTESTwoKeyNav_") + .isType(EntityTypeProvider.nameETTwoKeyNav); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_(ParameterString='3')") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFC_RTESTwoKeyNav_") + .isParameter(0, "ParameterString", "'3'") + .isType(EntityTypeProvider.nameETTwoKeyNav); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()/$count") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFC_RTESTwoKeyNav_") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .n() + .isCount(); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()(PropertyInt16=1,PropertyString='2')") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFC_RTESTwoKeyNav_") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'"); + } + + @Test + public void boundFuncBnEsRtEsBa() throws Exception { + testRes.run("ESKeyNav(PropertyInt16=1)/CollPropertyComp" + + "/olingo.odata.test1.BFCCollCTPrimCompRTESAllPrim()/olingo.odata.test1.BAESAllPrimRTETAllPrim") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n().isComplexProperty("CollPropertyComp", ComplexTypeProvider.nameCTPrimComp, true) + .n().isFunction("BFCCollCTPrimCompRTESAllPrim") + .n().isAction("BAESAllPrimRTETAllPrim"); + } + + @Test + public void boundFuncBnEsRtPrim() throws Exception { + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTString()") + .isEntitySet("ESTwoKeyNav") + .n().isFunction("BFCESTwoKeyNavRTString"); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTString()/$value") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFCESTwoKeyNavRTString") + .isType(PropertyProvider.nameString) + .n() + .isValue(); + } + + @Test + public void boundFuncBnEsRtPrimColl() throws Exception { + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollString()") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFCESTwoKeyNavRTCollString") + .isType(PropertyProvider.nameString, true); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollString()/$count") + .isEntitySet("ESTwoKeyNav") + .n() + .isFunction("BFCESTwoKeyNavRTCollString") + .isType(PropertyProvider.nameString, true) + .n() + .isCount(); + } + + @Test + public void boundFuncBnPpropCollRtEs() throws Exception { + testRes.run("ESKeyNav(1)/CollPropertyString/olingo.odata.test1.BFCCollStringRTESTwoKeyNav()") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) + .n() + .isFunction("BFCCollStringRTESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, true); + + testRes.run("ESKeyNav(1)/CollPropertyString/olingo.odata.test1.BFCCollStringRTESTwoKeyNav()/$count") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) + .n() + .isFunction("BFCCollStringRTESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .n() + .isCount(); + } + + @Test + public void boundFuncBnPpropRtEs() throws Exception { + + testRes.run("ESKeyNav(1)/PropertyString/olingo.odata.test1.BFCStringRTESTwoKeyNav()") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .n() + .isFunction("BFCStringRTESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, true); + + testRes.run("ESKeyNav(1)/PropertyString/olingo.odata.test1.BFCStringRTESTwoKeyNav()/$count") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .n() + .isFunction("BFCStringRTESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .n() + .isCount(); + + testRes.run("ESKeyNav(1)/PropertyString/olingo.odata.test1.BFCStringRTESTwoKeyNav()/$ref") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) + .n() + .isFunction("BFCStringRTESTwoKeyNav") + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .n() + .isRef(); + } + + @Test + public void boundFuncBnSingleRtEs() throws Exception { + testRes.run("SINav/olingo.odata.test1.BFCSINavRTESTwoKeyNav()") + .isSingleton("SINav").isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n().isFunction("BFCSINavRTESTwoKeyNav"); + } + + @Test + public void boundFuncBnSingleCastRtEs() throws Exception { + testRes.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/olingo.odata.test1.BFCETBaseTwoKeyNavRTESBaseTwoKey()") + .isSingleton("SINav") + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isFunction("BFCETBaseTwoKeyNavRTESBaseTwoKey"); + } + + @Test + public void actionBound_on_EntityEntry() throws Exception { + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.BA_RTETTwoKeyNav") + .isEntitySet("ESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .n() + .isAction("BA_RTETTwoKeyNav"); + + testRes.run("ESKeyNav(PropertyInt16=1)/olingo.odata.test1.BA_RTETTwoKeyNav") + .isEntitySet("ESKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .n() + .isAction("BA_RTETTwoKeyNav"); + } + + @Test + public void actionBound_on_EntityCollection() throws Exception { + testRes.run("ESTwoKeyNav/olingo.odata.test1.BAESTwoKeyNavRTESTwoKeyNav") + .isEntitySet("ESTwoKeyNav") + .n() + .isAction("BAESTwoKeyNavRTESTwoKeyNav"); + } + + @Test + public void functionBound_on_var_Types() throws Exception { + + // on primitive + testRes.run("ESAllPrim(1)/PropertyString/olingo.odata.test1.BFCStringRTESTwoKeyNav()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETAllPrim, false) + .n() + .isUriPathInfoKind(UriResourceKind.primitiveProperty) + .isType(PropertyProvider.nameString); + + // on collection of primitive + testRes.run("ESCollAllPrim(1)/CollPropertyString/olingo.odata.test1.BFCCollStringRTESTwoKeyNav()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETCollAllPrim, false) + .n() + .isUriPathInfoKind(UriResourceKind.primitiveProperty) + .isType(PropertyProvider.nameString); + + // on complex + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='ABC')" + + "/PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESTwoKeyNav()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n() + .isUriPathInfoKind(UriResourceKind.complexProperty) + .n() + .isType(EntityTypeProvider.nameETTwoKeyNav); + + // on collection of complex + testRes.run("ESKeyNav(1)/CollPropertyComp/olingo.odata.test1.BFCCollCTPrimCompRTESAllPrim()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .n() + .isComplexProperty("CollPropertyComp", ComplexTypeProvider.nameCTPrimComp, true) + .n() + .isUriPathInfoKind(UriResourceKind.function) + .isType(EntityTypeProvider.nameETAllPrim); + + // on entity + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='ABC')" + + "/olingo.odata.test1.BFCETTwoKeyNavRTESTwoKeyNav()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .n() + .isUriPathInfoKind(UriResourceKind.function) + .isType(EntityTypeProvider.nameETTwoKeyNav); + + // on collection of entity + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") + .isUriPathInfoKind(UriResourceKind.entitySet) + .isType(EntityTypeProvider.nameETTwoKeyNav, true) + .n().isUriPathInfoKind(UriResourceKind.function) + .isType(EntityTypeProvider.nameETTwoKeyNav); + } + + @Test + public void actionBound_on_EntityCast() throws Exception { + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" + + "/olingo.odata.test1.BAETBaseTwoKeyNavRTETBaseTwoKeyNav") + .isEntitySet("ESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isAction("BAETBaseTwoKeyNavRTETBaseTwoKeyNav"); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=1,PropertyString='2')" + + "/olingo.odata.test1.ETTwoBaseTwoKeyNav/olingo.odata.test1.BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav") + .isEntitySet("ESTwoKeyNav") + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav) + .n() + .isAction("BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav"); + } + + @Test + public void functionImport_VarReturning() { + // returning primitive + testRes.run("FINRTInt16()") + .isFunctionImport("FINRTInt16") + .isFunction("UFNRTInt16") + .isType(PropertyProvider.nameInt16, false); + + // returning collection of primitive + testRes.run("FICRTCollStringTwoParam(ParameterString='ABC',ParameterInt16=1)") + .isFunctionImport("FICRTCollStringTwoParam") + .isFunction("UFCRTCollStringTwoParam") + .isType(PropertyProvider.nameString, true); + + // returning single complex + testRes.run("FICRTCTAllPrimTwoParam(ParameterString='ABC',ParameterInt16=1)") + .isFunctionImport("FICRTCTAllPrimTwoParam") + .isFunction("UFCRTCTAllPrimTwoParam") + .isType(ComplexTypeProvider.nameCTAllPrim, false); + + // returning collection of complex + testRes.run("FICRTCollCTTwoPrim()") + .isFunctionImport("FICRTCollCTTwoPrim") + .isFunction("UFCRTCollCTTwoPrim") + .isType(ComplexTypeProvider.nameCTTwoPrim, true); + + // returning single entity + testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)") + .isFunctionImport("FICRTETTwoKeyNavParam") + .isFunction("UFCRTETTwoKeyNavParam") + .isType(EntityTypeProvider.nameETTwoKeyNav, false); + + // returning collection of entity (aka entitySet) + testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)") + .isFunctionImport("FICRTCollESTwoKeyNavParam") + .isFunction("UFCRTCollETTwoKeyNavParam") + .isType(EntityTypeProvider.nameETTwoKeyNav, true); + } + + @Test + public void functionsWithKeyPredicates() throws Exception { + testRes.run("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)") + .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") + .isFunction("UFCRTCollETMixPrimCollCompTwoParam") + .isParameter(0, "ParameterString", "'1'") + .isParameter(1, "ParameterInt16", "1"); + + testRes.run("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt16=0)") + .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") + .isFunction("UFCRTCollETMixPrimCollCompTwoParam") + .isParameter(0, "ParameterString", "'1'") + .isParameter(1, "ParameterInt16", "1") + .isKeyPredicate(0, "PropertyInt16", "0"); + + testRes.run("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)(0)") + .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") + .isFunction("UFCRTCollETMixPrimCollCompTwoParam") + .isParameter(0, "ParameterString", "'1'") + .isParameter(1, "ParameterInt16", "1") + .isKeyPredicate(0, "PropertyInt16", "0"); + + testUri.runEx("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt16 eq 0)") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + + // PropertyInt32 does not exist + testUri.runEx("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt32=0)") + .isExValidation(UriValidationException.MessageKeys.INVALID_KEY_PROPERTY); + + testUri.runEx("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)" + + "(PropertyInt16=0,PropertyInt16=1)") + .isExValidation(UriValidationException.MessageKeys.DOUBLE_KEY_PROPERTY); + + testRes.run("FICRTCollCTTwoPrimTwoParam(ParameterString='1',ParameterInt16=1)") + .isFunctionImport("FICRTCollCTTwoPrimTwoParam") + .isFunction("UFCRTCollCTTwoPrimTwoParam") + .isParameter(0, "ParameterString", "'1'") + .isParameter(1, "ParameterInt16", "1"); + + testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt16=1)") + .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); + + testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterString='1',ParameterInt16=1)(1)") + .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); + + testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt32=1)") + .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); + + testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt32=1,PropertyInt16=2)") + .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); + + testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)") + .isFunctionImport("FICRTCollESTwoKeyNavParam") + .isFunction("UFCRTCollETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1"); + + testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,PropertyString='1')") + .isFunctionImport("FICRTCollESTwoKeyNavParam") + .isFunction("UFCRTCollETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'1'"); + + testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16 eq 1)") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + + testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1)") + .isExSemantic(MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES); + + testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,PropertyInt32=1,PropertyString='1')") + .isExValidation(UriValidationException.MessageKeys.INVALID_KEY_PROPERTY); + + testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)()") + .isExSemantic(MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES); + + testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,PropertyInt32=1)") + .isExValidation(UriValidationException.MessageKeys.INVALID_KEY_PROPERTY); + + testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,Unkown=1)") + .isExValidation(UriValidationException.MessageKeys.INVALID_KEY_PROPERTY); + + testRes.run("FICRTCollCTTwoPrim()") + .isFunctionImport("FICRTCollCTTwoPrim") + .isType(ComplexTypeProvider.nameCTTwoPrim); + + testRes.run("FICRTCollStringTwoParam(ParameterInt16=1,ParameterString='2')") + .isFunctionImport("FICRTCollStringTwoParam") + .isType(PropertyProvider.nameString) + .isParameter(0, "ParameterInt16", "1") + .isParameter(1, "ParameterString", "'2'"); + + testRes.run("FICRTStringTwoParam(ParameterInt16=1)") + .isFunctionImport("FICRTStringTwoParam") + .isFunction("UFCRTStringTwoParam") + .isType(PropertyProvider.nameString) + .isParameter(0, "ParameterInt16", "1"); + + testRes.run("FICRTStringTwoParam(ParameterInt16=1,ParameterString='2')") + .isFunctionImport("FICRTStringTwoParam") + .isFunction("UFCRTStringTwoParam") + .isType(PropertyProvider.nameString) + .isParameter(0, "ParameterInt16", "1"); + + testRes.run("FICRTCollString()") + .isFunctionImport("FICRTCollString") + .isFunction("UFCRTCollString"); + + testRes.run("FICRTString()") + .isFunctionImport("FICRTString") + .isFunction("UFCRTString"); + + testUri.runEx("FICRTCollString()(0)") + .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); + + testUri.runEx("FICRTString()(0)") + .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); + } + + @Test + public void nonComposableFunctions() throws Exception { + testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$skip=1"); + testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$top=1"); + testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", + "$filter=PropertyInt16 eq 1"); + testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$skip=1"); + testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$count=true"); + testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$skiptoken=5"); + testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$search=test"); + + testRes.run("ESAllPrim/olingo.odata.test1.BFNESAllPrimRTCTAllPrim()") + .isEntitySet("ESAllPrim") + .n() + .isFunction("BFNESAllPrimRTCTAllPrim"); + + testUri.runEx("ESAllPrim/olingo.odata.test1.BFNESAllPrimRTCTAllPrim()/PropertyString") + .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); + + testUri.runEx("FINRTByteNineParam(ParameterEnum=Namespace1_Alias.ENString'String1'," + + "CollParameterETTwoPrim=@collComp,ParameterComp=@comp,ParameterDef='key1'," + + "ParameterETTwoPrim=@comp,CollParameterDef=@collDef,CollParameterByte=@collByte," + + "CollParameterComp=@collComp,CollParameterEnum=@collEnum)/$value?@comp={\"PropertyInt16\":1}" + + "&@collByte=[1]&@collEnum=[\"String1,String1\"]&@collDef=[\"Test\"]&@collComp=[{\"PropertyInt16\":11}]") + .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); + } + + @Test + public void functionImpBf() throws Exception { + testRes.run("FICRTString()/olingo.odata.test1.BFCStringRTESTwoKeyNav()") + .isFunctionImport("FICRTString").isFunction("UFCRTString") + .n().isFunction("BFCStringRTESTwoKeyNav"); + } + + @Test + public void functionImpCastBf() throws Exception { + + testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)/olingo.odata.test1.ETBaseTwoKeyNav" + + "/olingo.odata.test1.BFCETBaseTwoKeyNavRTETTwoKeyNav()") + .isFunctionImport("FICRTETTwoKeyNavParam") + .isFunction("UFCRTETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isFunction("BFCETBaseTwoKeyNavRTETTwoKeyNav"); + + testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)" + + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=2,PropertyString='3')" + + "/olingo.odata.test1.BFCETBaseTwoKeyNavRTETTwoKeyNav()") + .isFunctionImport("FICRTCollESTwoKeyNavParam") + .isFunction("UFCRTCollETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'") + .n() + .isFunction("BFCETBaseTwoKeyNavRTETTwoKeyNav"); + + testRes.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=null)") + .isFunctionImport("FICRTCollCTTwoPrimTwoParam") + .isFunction("UFCRTCollCTTwoPrimTwoParam") + .isParameter(0, "ParameterInt16", "1") + .isParameter(1, "ParameterString", null); + } + + @Test + public void functionImpEntity() throws Exception { + + testRes.run("FICRTETKeyNav()") + .isFunctionImport("FICRTETKeyNav") + .isFunction("UFCRTETKeyNav") + .isType(EntityTypeProvider.nameETKeyNav); + + testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)") + .isFunctionImport("FICRTETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1"); + + testRes.run("FICRTESMedia(ParameterInt16=1)/$value") + .isFunctionImport("FICRTESMedia") + .isFunction("UFCRTETMedia") + .n() + .isValue(); + + testRes.run("FICRTETKeyNav()/$ref") + .isFunctionImport("FICRTETKeyNav") + .isFunction("UFCRTETKeyNav") + .n() + .isRef(); + + testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)/$ref") + .isFunctionImport("FICRTETTwoKeyNavParam") + .isFunction("UFCRTETTwoKeyNavParam") + .n() + .isRef(); + + testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)/olingo.odata.test1.ETBaseTwoKeyNav") + .isFunctionImport("FICRTETTwoKeyNavParam") + .isFunction("UFCRTETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav); + + testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)/olingo.odata.test1.ETBaseTwoKeyNav") + .isFunctionImport("FICRTETTwoKeyNavParam") + .isFunction("UFCRTETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav); + + testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)" + + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=2,PropertyString='3')") + .isFunctionImport("FICRTCollESTwoKeyNavParam") + .isFunction("UFCRTCollETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'"); + } + + @Test + public void functionImpEs() throws Exception { + testRes.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')") + .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") + .isFunction("UFCRTCollETMixPrimCollCompTwoParam") + .isParameter(0, "ParameterInt16", "1") + .isParameter(1, "ParameterString", "'2'") + .isType(EntityTypeProvider.nameETMixPrimCollComp); + + testRes.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')") + .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") + .isFunction("UFCRTCollETMixPrimCollCompTwoParam") + .isParameter(0, "ParameterInt16", "1") + .isParameter(1, "ParameterString", "'2'") + .isType(EntityTypeProvider.nameETMixPrimCollComp); + + testRes.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')/$count") + .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") + .isFunction("UFCRTCollETMixPrimCollCompTwoParam") + .isParameter(0, "ParameterInt16", "1") + .isParameter(1, "ParameterString", "'2'") + .isType(EntityTypeProvider.nameETMixPrimCollComp) + .n() + .isCount(); + + testRes.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')") + .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") + .isFunction("UFCRTCollETMixPrimCollCompTwoParam") + .isParameter(0, "ParameterInt16", "1") + .isParameter(1, "ParameterString", "'1'"); + + testRes.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')(0)") + .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") + .isFunction("UFCRTCollETMixPrimCollCompTwoParam") + .isParameter(0, "ParameterInt16", "1") + .isParameter(1, "ParameterString", "'1'"); + } + + @Test + public void functionImpError() { + testUri.runEx("FICRTCollCTTwoPrimTwoParam") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testUri.runEx("FICRTCollCTTwoPrimTwoParam()").isExSemantic(MessageKeys.FUNCTION_NOT_FOUND); + testUri.runEx("FICRTCollCTTwoPrimTwoParam(invalidParam=2)").isExSemantic(MessageKeys.FUNCTION_NOT_FOUND); + } + + @Test + public void functionImportCast() throws Exception { + testRes.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString='2')/olingo.odata.test1.CTBase") + .isFunctionImport("FICRTCollCTTwoPrimTwoParam") + .isParameter(0, "ParameterInt16", "1") + .isParameter(1, "ParameterString", "'2'") + .isTypeFilterOnCollection(ComplexTypeProvider.nameCTBase); + } + + @Test + public void functionImpEsCast() throws Exception { + + testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)/olingo.odata.test1.ETBaseTwoKeyNav") + .isFunctionImport("FICRTCollESTwoKeyNavParam") + .isFunction("UFCRTCollETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav); + + testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)/olingo.odata.test1.ETBaseTwoKeyNav/$count") + .isFunctionImport("FICRTCollESTwoKeyNavParam") + .isFunction("UFCRTCollETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .n() + .isCount(); + + testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)" + + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=2,PropertyString='3')") + .isFunctionImport("FICRTCollESTwoKeyNavParam") + .isFunction("UFCRTCollETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'"); + + testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)" + + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=2,PropertyString='3')" + + "/olingo.odata.test1.ETTwoBaseTwoKeyNav") + .isFunctionImport("FICRTCollESTwoKeyNavParam") + .isFunction("UFCRTCollETTwoKeyNavParam") + .isParameter(0, "ParameterInt16", "1") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) + .isKeyPredicate(0, "PropertyInt16", "2") + .isKeyPredicate(1, "PropertyString", "'3'") + .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav); + } + + @Test + public void functionImportChain() { + // test chain; returning single complex + testRes.run("FICRTCTAllPrimTwoParam(ParameterString='ABC',ParameterInt16=1)/PropertyInt16") + .at(0) + .isFunctionImport("FICRTCTAllPrimTwoParam") + .isFunction("UFCRTCTAllPrimTwoParam") + .isType(ComplexTypeProvider.nameCTAllPrim, false) + .isParameter(0, "ParameterString", "'ABC'") + .isParameter(1, "ParameterInt16", "1") + .at(1) + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + // test chains; returning single entity + testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)/PropertyInt16") + .at(0) + .isFunctionImport("FICRTETTwoKeyNavParam") + .isFunction("UFCRTETTwoKeyNavParam") + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isParameter(0, "ParameterInt16", "1") + .at(1) + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + // test chains; returning collection of entity (aka entitySet) + testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,PropertyString='ABC')") + .at(0) + .isFunctionImport("FICRTCollESTwoKeyNavParam") + .isFunction("UFCRTCollETTwoKeyNavParam") + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isParameter(0, "ParameterInt16", "1") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'ABC'"); + + // test chains; returning collection of entity (aka entitySet) + testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,PropertyString='ABC')/PropertyInt16") + .at(0) + .isFunctionImport("FICRTCollESTwoKeyNavParam") + .isFunction("UFCRTCollETTwoKeyNavParam") + .isType(EntityTypeProvider.nameETTwoKeyNav, false) + .isParameter(0, "ParameterInt16", "1") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'ABC'") + .at(1) + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + } + + @Test + public void actionImport_VarReturnType() { + testRes.run(ContainerProvider.AIRT_STRING) + .isActionImport(ContainerProvider.AIRT_STRING) + .isAction(ActionProvider.nameUARTString.getName()) + .isType(PropertyProvider.nameString, false); + + testRes.run(ContainerProvider.AIRT_COLL_STRING_TWO_PARAM) + .isActionImport(ContainerProvider.AIRT_COLL_STRING_TWO_PARAM) + .isAction(ActionProvider.nameUARTCollStringTwoParam.getName()) + .isType(PropertyProvider.nameString, true); + + testRes.run(ContainerProvider.AIRTCT_TWO_PRIM_PARAM) + .isActionImport(ContainerProvider.AIRTCT_TWO_PRIM_PARAM) + .isAction(ActionProvider.nameUARTCTTwoPrimParam.getName()) + .isType(ComplexTypeProvider.nameCTTwoPrim, false); + + testRes.run(ContainerProvider.AIRT_COLL_CT_TWO_PRIM_PARAM) + .isActionImport(ContainerProvider.AIRT_COLL_CT_TWO_PRIM_PARAM) + .isAction(ActionProvider.nameUARTCollCTTwoPrimParam.getName()) + .isType(ComplexTypeProvider.nameCTTwoPrim, true); + + testRes.run(ContainerProvider.AIRTET_TWO_KEY_TWO_PRIM_PARAM) + .isActionImport(ContainerProvider.AIRTET_TWO_KEY_TWO_PRIM_PARAM) + .isAction(ActionProvider.nameUARTETTwoKeyTwoPrimParam.getName()) + .isType(EntityTypeProvider.nameETTwoKeyTwoPrim, false); + + testUri.runEx(ContainerProvider.AIRT_STRING + "/invalidElement") + .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); + testUri.runEx(ContainerProvider.AIRTCT_TWO_PRIM_PARAM + "/PropertyInt16") + .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); + } +} diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/SearchParserTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/SearchParserTest.java new file mode 100644 index 000000000..743439a2e --- /dev/null +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/SearchParserTest.java @@ -0,0 +1,187 @@ +/* + * 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.uri.parser; + +import java.util.Collections; + +import org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.edmx.EdmxReference; +import org.apache.olingo.server.api.OData; +import org.apache.olingo.server.core.uri.parser.search.SearchParserException; +import org.apache.olingo.server.core.uri.testutil.TestUriValidator; +import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; +import org.junit.Test; + +/** Tests of the parts of the URI parser that parse the sytem query option $search. */ +public class SearchParserTest { + + private static final Edm edm = OData.newInstance().createServiceMetadata( + new EdmTechProvider(), Collections. emptyList()).getEdm(); + + private final TestUriValidator testUri = new TestUriValidator().setEdm(edm); + + @Test + public void search() throws Exception { + testUri.run("ESTwoKeyNav", "$search=abc"); + testUri.run("ESTwoKeyNav", "$search=NOT abc"); + + testUri.run("ESTwoKeyNav", "$search=abc AND def"); + testUri.run("ESTwoKeyNav", "$search=abc OR def"); + testUri.run("ESTwoKeyNav", "$search=abc def"); + + testUri.run("ESTwoKeyNav", "$search=abc AND def AND ghi"); + testUri.run("ESTwoKeyNav", "$search=abc AND def OR ghi"); + testUri.run("ESTwoKeyNav", "$search=abc AND def ghi"); + + testUri.run("ESTwoKeyNav", "$search=abc OR def AND ghi"); + testUri.run("ESTwoKeyNav", "$search=abc OR def OR ghi"); + testUri.run("ESTwoKeyNav", "$search=abc OR def ghi"); + + testUri.run("ESTwoKeyNav", "$search=abc def AND ghi"); + testUri.run("ESTwoKeyNav", "$search=abc def OR ghi"); + testUri.run("ESTwoKeyNav", "$search=abc def ghi"); + + // mixed not + testUri.run("ESTwoKeyNav", "$search= abc def AND ghi"); + testUri.run("ESTwoKeyNav", "$search=NOT abc NOT def OR NOT ghi"); + testUri.run("ESTwoKeyNav", "$search= abc def NOT ghi"); + + // parenthesis + testUri.run("ESTwoKeyNav", "$search=(abc)"); + testUri.run("ESTwoKeyNav", "$search=(abc AND def)"); + testUri.run("ESTwoKeyNav", "$search=(abc AND def) OR ghi "); + testUri.run("ESTwoKeyNav", "$search=(abc AND def) ghi "); + testUri.run("ESTwoKeyNav", "$search=abc AND (def OR ghi)"); + testUri.run("ESTwoKeyNav", "$search=abc AND (def ghi)"); + + // search in function-import return value + testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)", "$search=test"); + + // percent encoded characters + testUri.run("ESTwoKeyNav", "$search=%41%42%43"); + testUri.run("ESTwoKeyNav", "$search=\"100%25\""); + + // escaped characters + testUri.run("ESTwoKeyNav", "$search=\"abc\""); + testUri.run("ESTwoKeyNav", "$search=\"a\\\"bc\""); + testUri.run("ESTwoKeyNav", "$search=%22abc%22"); + testUri.run("ESTwoKeyNav", "$search=%22a%5C%22bc%22"); + testUri.run("ESTwoKeyNav", "$search=%22a%5C%5Cbc%22"); + + // wrong escaped characters + testUri.runEx("ESTwoKeyNav", "$search=%22a%22bc%22") + .isExceptionMessage(SearchParserException.MessageKeys.TOKENIZER_EXCEPTION); + testUri.runEx("ESTwoKeyNav", "$search=%22a%5Cbc%22") + .isExceptionMessage(SearchParserException.MessageKeys.TOKENIZER_EXCEPTION); + testUri.runEx("ESTwoKeyNav", "$search=not%27allowed") + .isExceptionMessage(SearchParserException.MessageKeys.TOKENIZER_EXCEPTION); + } + + @Test + public void searchTree() throws Exception { + testUri.run("ESTwoKeyNav", "$expand=NavPropertyETKeyNavMany($search=(abc AND def) OR NOT ghi)") + .goExpand().isSearchSerialized("{{'abc' AND 'def'} OR {NOT 'ghi'}}"); + } + + /** + * See test + * cases at OASIS. + */ + @Test + public void searchQueryPhraseAbnfTestcases() throws Exception { + // + testUri.run("ESTwoKeyNav", "$search=\"blue%20green\""); + // + testUri.run("ESTwoKeyNav", "$search=\"blue%20green%22"); + // + // $search="blue\"green" + testUri.run("ESTwoKeyNav", "$search=\"blue\\\"green\""); + + // + // $search="blue\\green" + testUri.run("ESTwoKeyNav", "$search=\"blue\\\\green\""); + // + testUri.runEx("ESTwoKeyNav", "$search=\"blue\"green\"") + .isExceptionMessage(SearchParserException.MessageKeys.TOKENIZER_EXCEPTION); + // + testUri.runEx("ESTwoKeyNav", "$search=\"blue%22green\"") + .isExceptionMessage(SearchParserException.MessageKeys.TOKENIZER_EXCEPTION); + + // + // $search=blue green + // SearchassertQuery("\"blue%20green\"").resultsIn(); + testUri.run("ESTwoKeyNav", "$search=blue green"); + // + // SearchassertQuery("blue%20green").resultsIn(); + testUri.run("ESTwoKeyNav", "$search=blue%20green"); + + // + // $search=blue AND green + testUri.run("ESTwoKeyNav", "$search=blue AND green"); + + // + // $search=blue OR green + testUri.run("ESTwoKeyNav", "$search=blue OR green"); + + // + // $search=blue NOT green + testUri.run("ESTwoKeyNav", "$search=blue NOT green"); + + // + // $search=NOT blue + testUri.run("ESTwoKeyNav", "$search=NOT blue"); + + // + // $search=foo AND bar OR foo AND baz OR that AND bar OR that AND baz + testUri.run("ESTwoKeyNav", "$search=foo AND bar OR foo AND baz OR that AND bar OR that AND baz"); + + // + // $search=(foo OR that) AND (bar OR baz) + testUri.run("ESTwoKeyNav", "$search=(foo OR that) AND (bar OR baz)"); + + // + // $search=foo AND (bar OR baz) + testUri.run("ESTwoKeyNav", "$search=foo AND (bar OR baz)"); + + // + // $search=(foo AND bar) OR baz + testUri.run("ESTwoKeyNav", "$search=(foo AND bar) OR baz"); + + // + // $search=(NOT foo) OR baz + testUri.run("ESTwoKeyNav", "$search=(NOT foo) OR baz"); + + // + // $search=(NOT foo) + testUri.run("ESTwoKeyNav", "$search=(NOT foo)"); + + // + // http://serviceRoot/Products?$search=blue + testUri.run("ESTwoKeyNav", "$search=blue"); + + // + // http://serviceRoot/Model.Container/$all?$search=blue + testUri.run("$all", "$search=blue"); + + // + // http://serviceRoot/$all?$search=blue + testUri.run("$all", "$search=blue"); + } +} diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/SelectParserTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/SelectParserTest.java new file mode 100644 index 000000000..b906fcc4d --- /dev/null +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/SelectParserTest.java @@ -0,0 +1,177 @@ +/* + * 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.uri.parser; + +import java.util.Collections; + +import org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.edm.FullQualifiedName; +import org.apache.olingo.commons.api.edmx.EdmxReference; +import org.apache.olingo.server.api.OData; +import org.apache.olingo.server.api.uri.UriInfoKind; +import org.apache.olingo.server.core.uri.parser.UriParserSemanticException.MessageKeys; +import org.apache.olingo.server.core.uri.testutil.TestUriValidator; +import org.apache.olingo.server.tecsvc.provider.ActionProvider; +import org.apache.olingo.server.tecsvc.provider.ComplexTypeProvider; +import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; +import org.apache.olingo.server.tecsvc.provider.EntityTypeProvider; +import org.apache.olingo.server.tecsvc.provider.EnumTypeProvider; +import org.apache.olingo.server.tecsvc.provider.FunctionProvider; +import org.apache.olingo.server.tecsvc.provider.PropertyProvider; +import org.apache.olingo.server.tecsvc.provider.TypeDefinitionProvider; +import org.junit.Test; + +/** Tests of the parts of the URI parser that parse the sytem query option $select. */ +public class SelectParserTest { + + private static final Edm edm = OData.newInstance().createServiceMetadata( + new EdmTechProvider(), Collections. emptyList()).getEdm(); + + private final TestUriValidator testUri = new TestUriValidator().setEdm(edm); + + @Test + public void select() throws Exception { + testUri.run("ESTwoKeyNav", "$select=*") + .isSelectItemStar(0); + + testUri.run("ESTwoKeyNav", "$select=olingo.odata.test1.*") + .isSelectItemAllOp(0, new FullQualifiedName("olingo.odata.test1", "*")); + testUri.run("ESTwoKeyNav", "$select=Namespace1_Alias.*") + .isSelectItemAllOp(0, new FullQualifiedName("Namespace1_Alias", "*")); + + testUri.run("ESTwoKeyNav", "$select=PropertyString") + .goSelectItemPath(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); + + testUri.run("ESTwoKeyNav", "$select=PropertyComp") + .goSelectItemPath(0).isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false); + + testUri.run("ESAllPrim", "$select=PropertyTimeOfDay,PropertyDate,NavPropertyETTwoPrimOne") + .isKind(UriInfoKind.resource) + .goSelectItemPath(0).first().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) + .goUpUriValidator() + .goSelectItemPath(1).first().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) + .goUpUriValidator() + .goSelectItemPath(2).first().isNavProperty("NavPropertyETTwoPrimOne", EntityTypeProvider.nameETTwoPrim, false); + + testUri.run("ESMixEnumDefCollComp", + "$select=PropertyEnumString,PropertyDefString,CollPropertyEnumString,CollPropertyDefString") + .isKind(UriInfoKind.resource) + .goSelectItemPath(0).isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) + .goUpUriValidator() + .goSelectItemPath(1).isPrimitiveProperty("PropertyDefString", TypeDefinitionProvider.nameTDString, false) + .goUpUriValidator() + .goSelectItemPath(2).isPrimitiveProperty("CollPropertyEnumString", EnumTypeProvider.nameENString, true) + .goUpUriValidator() + .goSelectItemPath(3).isPrimitiveProperty("CollPropertyDefString", TypeDefinitionProvider.nameTDString, true); + + testUri.run("ESTwoKeyNav", "$select=PropertyComp/PropertyInt16") + .goSelectItemPath(0) + .first() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testUri.run("ESTwoKeyNav", "$select=PropertyComp/PropertyComp") + .goSelectItemPath(0) + .first() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) + .n() + .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false); + + testUri.run("ESTwoKeyNav", "$select=olingo.odata.test1.ETBaseTwoKeyNav") + .isSelectStartType(0, EntityTypeProvider.nameETBaseTwoKeyNav); + + testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')", + "$select=olingo.odata.test1.ETBaseTwoKeyNav/PropertyInt16") + .isKind(UriInfoKind.resource).goPath() + .first() + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .goUpUriValidator() + .isSelectStartType(0, EntityTypeProvider.nameETBaseTwoKeyNav) + .goSelectItemPath(0) + .first() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='1')/PropertyCompNav", + "$select=olingo.odata.test1.CTTwoBasePrimCompNav") + .isSelectStartType(0, ComplexTypeProvider.nameCTTwoBasePrimCompNav); + + testUri.run("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTTwoBasePrimCompNav") + .goSelectItemPath(0) + .first() + .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false) + .isTypeFilter(ComplexTypeProvider.nameCTTwoBasePrimCompNav); + + testUri.run("ESTwoKeyNav", "$select=PropertyCompNav/Namespace1_Alias.CTTwoBasePrimCompNav/PropertyInt16") + .goSelectItemPath(0) + .first() + .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false) + .isTypeFilter(ComplexTypeProvider.nameCTTwoBasePrimCompNav) + .n() + .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); + + testUri.run("ESAllPrim", "$select=olingo.odata.test1.BAESAllPrimRTETAllPrim") + .goSelectItemPath(0) + .first() + .isAction(ActionProvider.nameBAESAllPrimRTETAllPrim.getName()); + testUri.run("ESTwoKeyNav", "$select=Namespace1_Alias.BFCESTwoKeyNavRTString") + .goSelectItemPath(0) + .first() + .isFunction(FunctionProvider.nameBFCESTwoKeyNavRTString.getName()); + testUri.run("ESTwoKeyNav", "$select=olingo.odata.test1.BFCESTwoKeyNavRTStringParam(ParameterComp)") + .goSelectItemPath(0) + .first() + .isFunction(FunctionProvider.nameBFCESTwoKeyNavRTStringParam.getName()); + + testUri.runEx("ESMixPrimCollComp", "$select=wrong") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + testUri.runEx("ESMixPrimCollComp", "$select=PropertyComp/wrong") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + testUri.runEx("ESMixPrimCollComp", "$select=PropertyComp///PropertyInt16") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testUri.runEx("ESMixPrimCollComp", "$select=/PropertyInt16") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testUri.runEx("ESMixPrimCollComp", "$select=PropertyInt16+") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.1") + .isExSemantic(MessageKeys.UNKNOWN_PART); + testUri.runEx("ESTwoKeyNav", "$select=unknown_namespace.*").isExSemantic(MessageKeys.UNKNOWN_PART); + testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.ETKeyNav") + .isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER); + testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTTwoPrim") + .isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER); + testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTwrong") + .isExSemantic(MessageKeys.UNKNOWN_TYPE); + testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/.") + .isExSemantic(MessageKeys.UNKNOWN_PART); + testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTTwoBasePrimCompNav/.") + .isExSemantic(MessageKeys.UNKNOWN_PART); + testUri.runEx("AIRT", "$select=wrong") + .isExSemantic(MessageKeys.ONLY_FOR_TYPED_PARTS); + testUri.runEx("AIRT", "$select=olingo.odata.test1.BAESAllPrimRT") + .isExSemantic(MessageKeys.ONLY_FOR_TYPED_PARTS); + testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.BFwrong") + .isExSemantic(MessageKeys.UNKNOWN_PART); + testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.BFCESTwoKeyNavRTStringParam()") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testUri.runEx("ESTwoKeyNav", "$select=Namespace1_Alias.BFCESTwoKeyNavRTStringParam(ParameterComp,...)") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + } +} diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/TestFullResourcePath.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/TestFullResourcePath.java deleted file mode 100644 index 53e9c8875..000000000 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/TestFullResourcePath.java +++ /dev/null @@ -1,6003 +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.server.core.uri.parser; - -import java.util.Arrays; -import java.util.Collections; - -import org.apache.olingo.commons.api.edm.Edm; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; -import org.apache.olingo.commons.api.edm.FullQualifiedName; -import org.apache.olingo.commons.api.edmx.EdmxReference; -import org.apache.olingo.commons.api.format.ContentType; -import org.apache.olingo.server.api.OData; -import org.apache.olingo.server.api.uri.UriInfoKind; -import org.apache.olingo.server.api.uri.UriResourceKind; -import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind; -import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind; -import org.apache.olingo.server.core.uri.parser.UriParserSemanticException.MessageKeys; -import org.apache.olingo.server.core.uri.parser.search.SearchParserException; -import org.apache.olingo.server.core.uri.testutil.FilterValidator; -import org.apache.olingo.server.core.uri.testutil.TestUriValidator; -import org.apache.olingo.server.core.uri.validator.UriValidationException; -import org.apache.olingo.server.tecsvc.provider.ActionProvider; -import org.apache.olingo.server.tecsvc.provider.ComplexTypeProvider; -import org.apache.olingo.server.tecsvc.provider.ContainerProvider; -import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; -import org.apache.olingo.server.tecsvc.provider.EntityTypeProvider; -import org.apache.olingo.server.tecsvc.provider.EnumTypeProvider; -import org.apache.olingo.server.tecsvc.provider.FunctionProvider; -import org.apache.olingo.server.tecsvc.provider.PropertyProvider; -import org.apache.olingo.server.tecsvc.provider.TypeDefinitionProvider; -import org.junit.Test; - -public class TestFullResourcePath { - - private static final OData oData = OData.newInstance(); - private static final Edm edm = oData.createServiceMetadata( - new EdmTechProvider(), Collections. emptyList()).getEdm(); - - private final TestUriValidator testUri = new TestUriValidator().setEdm(edm); - private final FilterValidator testFilter = new FilterValidator().setEdm(edm); - - @Test - public void allowedSystemQueryOptionsOnAll() throws Exception { - testUri.run("$all", "$count=true&$format=json&$search=abc&$skip=5&$top=5&$skiptoken=abc") - .isKind(UriInfoKind.all) - .isInlineCountText("true") - .isFormatText("json") - .isSearchSerialized("'abc'") - .isSkipText("5") - .isTopText("5") - .isSkipTokenText("abc"); - } - - @Test - public void allowedSystemQueryOptionsOnCrossjoin() throws Exception { - testUri.run("$crossjoin(ESAllPrim,ESTwoPrim)", "$count=true&$expand=ESAllPrim" - + "&$filter=ESAllPrim/PropertyInt16 eq 2&$format=json&$orderby=ESAllPrim/PropertyInt16" - + "&$search=abc&$skip=5&$top=5&$skiptoken=abc") - .isKind(UriInfoKind.crossjoin) - .isInlineCountText("true") - .goExpand().goPath().isEntitySet("ESAllPrim") - .goUpExpandValidator().goUpToUriValidator() - .goFilter().left().goPath().first().isEntitySet("ESAllPrim") - .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .goUpFilterValidator().goUpToUriValidator() - .isFormatText("json") - .isSearchSerialized("'abc'") - .isSkipText("5") - .isTopText("5") - .isSkipTokenText("abc"); - } - - @Test - public void trimQueryOptionsValue() throws Exception { - // OLINGO-846 trim query option value - testUri.run("ESAllPrim", "$filter= PropertyInt16 eq 12 ") - .isKind(UriInfoKind.resource).goPath() - .first().isEntitySet("ESAllPrim"); - // OLINGO-846 trim query option value - testUri.run("ESAllPrim", "$filter= PropertyInt16 eq 12 ") - .isKind(UriInfoKind.resource).goFilter().isBinary(BinaryOperatorKind.EQ).is("< eq <12>>"); - } - - @Test - public void valueOnNonMediaEntity() throws Exception { - testUri.runEx("ESAllPrim/$value").isExSemantic(UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS); - testUri.runEx("ESAllPrim(1)/NavPropertyETTwoPrimMany/$value").isExSemantic( - UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS); - testUri.runEx("FICRTCollESMedia()/$value") - .isExSemantic(UriParserSemanticException.MessageKeys.ONLY_FOR_TYPED_PARTS); - - testUri.runEx("ESAllPrim(1)/$value").isExSemantic(UriParserSemanticException.MessageKeys.NOT_A_MEDIA_RESOURCE); - testUri.runEx("ESAllPrim(1)/NavPropertyETTwoPrimOne/$value").isExSemantic( - UriParserSemanticException.MessageKeys.NOT_A_MEDIA_RESOURCE); - testUri.runEx("FICRTETKeyNav()/$value").isExSemantic(UriParserSemanticException.MessageKeys.NOT_A_MEDIA_RESOURCE); - } - - @Test - public void enumAndTypeDefAsKey() throws Exception { - testUri - .run("ESMixEnumDefCollComp(PropertyEnumString=olingo.odata.test1.ENString'String1',PropertyDefString='abc')") - .goPath() - .at(0) - .isEntitySet("ESMixEnumDefCollComp") - .isKeyPredicate(0, "PropertyEnumString", "olingo.odata.test1.ENString'String1'") - .isKeyPredicate(1, "PropertyDefString", "'abc'"); - - testFilter.runOnETMixEnumDefCollComp("PropertyEnumString has Namespace1_Alias.ENString'String1'") - .is("< has >>"); - - testUri - .run("ESMixEnumDefCollComp(PropertyEnumString=Namespace1_Alias.ENString'String1',PropertyDefString='abc')") - .goPath() - .at(0) - .isEntitySet("ESMixEnumDefCollComp") - .isKeyPredicate(0, "PropertyEnumString", "Namespace1_Alias.ENString'String1'") - .isKeyPredicate(1, "PropertyDefString", "'abc'"); - } - - @Test - public void functionBound_varOverloading() throws Exception { - // on ESTwoKeyNav - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()").goPath() - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .at(1) - .isUriPathInfoKind(UriResourceKind.function) - .isType(EntityTypeProvider.nameETTwoKeyNav); - - // with string parameter - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_(ParameterString='ABC')").goPath() - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .at(1) - .isUriPathInfoKind(UriResourceKind.function) - .isType(EntityTypeProvider.nameETTwoKeyNav); - - // with string parameter - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()").goPath() - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .at(1) - .isUriPathInfoKind(UriResourceKind.function) - .isType(EntityTypeProvider.nameETTwoKeyNav); - } - - @Test - public void runBfuncBnCpropCastRtEs() throws Exception { - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" - + "/PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESBaseTwoKeyNav()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isComplex("PropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp, false) - .n() - .isFunction("BFCCTPrimCompRTESBaseTwoKeyNav"); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" - + "/PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESBaseTwoKeyNav()/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isComplex("PropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp, false) - .n() - .isFunction("BFCCTPrimCompRTESBaseTwoKeyNav") - .isType(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isUriPathInfoKind(UriResourceKind.count); - - } - - @Test - public void runBfuncBnCpropCollRtEs() throws Exception { - testUri.run("ESKeyNav(PropertyInt16=1)/CollPropertyComp/olingo.odata.test1.BFCCollCTPrimCompRTESAllPrim()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isUriPathInfoKind(UriResourceKind.complexProperty) - .isComplex("CollPropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp, true) - .n() - .isFunction("BFCCollCTPrimCompRTESAllPrim"); - - testUri - .run("ESKeyNav(PropertyInt16=1)/CollPropertyComp/olingo.odata.test1.BFCCollCTPrimCompRTESAllPrim()/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isUriPathInfoKind(UriResourceKind.complexProperty) - .isComplex("CollPropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp, true) - .n() - .isFunction("BFCCollCTPrimCompRTESAllPrim") - .isType(EntityTypeProvider.nameETAllPrim, true) - .n() - .isUriPathInfoKind(UriResourceKind.count); - } - - @Test - public void runBfuncBnCpropRtEs() throws Exception { - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')" - + "/PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESTwoKeyNav()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .n() - .isUriPathInfoKind(UriResourceKind.complexProperty) - .isComplex("PropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp, false) - .n() - .isFunction("BFCCTPrimCompRTESTwoKeyNav"); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')" - + "/PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESTwoKeyNav()/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .n() - .isUriPathInfoKind(UriResourceKind.complexProperty) - .isComplex("PropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp, false) - .n() - .isFunction("BFCCTPrimCompRTESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .n() - .isUriPathInfoKind(UriResourceKind.count); - - } - - @Test - public void runBfuncBnEntityRtEs() throws Exception { - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.BFCETTwoKeyNavRTESTwoKeyNav()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .n() - .isFunction("BFCETTwoKeyNavRTESTwoKeyNav"); - } - - @Test - public void runBfuncBnEntityCastRtEs() throws Exception { - testUri - .run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" - + "/olingo.odata.test1.BFCETBaseTwoKeyNavRTESTwoKeyNav()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isFunction("BFCETBaseTwoKeyNavRTESTwoKeyNav"); - - testUri - .run("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=1,PropertyString='(''2'')')" - + "/olingo.odata.test1.BFCETBaseTwoKeyNavRTESTwoKeyNav()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'(''2'')'") - .n() - .isFunction("BFCETBaseTwoKeyNavRTESTwoKeyNav"); - } - - @Test - public void runBfuncBnEsCastRtEs() throws Exception { - testUri.run("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav" - + "/olingo.odata.test1.BFCESBaseTwoKeyNavRTESBaseTwoKey()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isFunction("BFCESBaseTwoKeyNavRTESBaseTwoKey"); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav" - + "/olingo.odata.test1.BFCESBaseTwoKeyNavRTESBaseTwoKey()" - + "/olingo.odata.test1.ETTwoBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isFunction("BFCESBaseTwoKeyNavRTESBaseTwoKey") - .isType(EntityTypeProvider.nameETBaseTwoKeyNav) - .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBaseTwoKeyNav); - - testUri.run("ESTwoKeyNav" - + "/olingo.odata.test1.BFC_RTESTwoKeyNav_()" - + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=1,PropertyString='2')" - + "/olingo.odata.test1.ETTwoBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFC_RTESTwoKeyNav_") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav); - } - - @Test - public void runBfuncBnEsRtCprop() throws Exception { - testUri.run("ESAllPrim/olingo.odata.test1.BFNESAllPrimRTCTAllPrim()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESAllPrim") - .n() - .isFunction("BFNESAllPrimRTCTAllPrim") - .isType(ComplexTypeProvider.nameCTAllPrim); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCTTwoPrim()/olingo.odata.test1.CTBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFCESTwoKeyNavRTCTTwoPrim") - .isType(ComplexTypeProvider.nameCTTwoPrim, false) - .isTypeFilterOnEntry(ComplexTypeProvider.nameCTBase); - } - - @Test - public void runBfuncBnEsRtCpropColl() throws Exception { - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollCTTwoPrim()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFCESTwoKeyNavRTCollCTTwoPrim") - .isType(ComplexTypeProvider.nameCTTwoPrim, true); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollCTTwoPrim()/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFCESTwoKeyNavRTCollCTTwoPrim") - .isType(ComplexTypeProvider.nameCTTwoPrim, true) - .n() - .isUriPathInfoKind(UriResourceKind.count); - } - - @Test - public void runBfuncBnEsRtEntityPpNp() throws Exception { - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTTwoKeyNav()/NavPropertyETKeyNavOne") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFCESTwoKeyNavRTTwoKeyNav") - .n() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTTwoKeyNav()/NavPropertyETKeyNavOne/$ref") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFCESTwoKeyNavRTTwoKeyNav") - .n() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .n() - .isUriPathInfoKind(UriResourceKind.ref); - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/NavPropertyETMediaOne/$value") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNav") - .n() - .isNavProperty("NavPropertyETMediaOne", EntityTypeProvider.nameETMedia, false) - .n() - .isValue(); - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" - + "/NavPropertyETTwoKeyNavOne") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNavParam") - .isParameter(0, "ParameterString", "'1'") - .n() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" - + "/NavPropertyETTwoKeyNavOne/PropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNavParam") - .isParameter(0, "ParameterString", "'1'") - .n() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .n() - .isComplex("PropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp); - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" - + "/NavPropertyETTwoKeyNavOne/PropertyComp/PropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNavParam") - .isParameter(0, "ParameterString", "'1'") - .n() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .n() - .isComplex("PropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp) - .n() - .isComplex("PropertyComp") - .isType(ComplexTypeProvider.nameCTAllPrim); - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" - + "/NavPropertyETTwoKeyNavOne/PropertyString") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNavParam") - .isParameter(0, "ParameterString", "'1'") - .n() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .n() - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" - + "/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/PropertyString") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNavParam") - .isParameter(0, "ParameterString", "'1'") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'") - .n() - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testUri.runEx("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(WrongParameter='1')") - .isExSemantic(MessageKeys.UNKNOWN_PART); - testUri.runEx("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString=wrong)") - .isExSemantic(MessageKeys.INVALID_KEY_VALUE); - } - - @Test - public void runBfuncBnEsRtEntyPpNpCast() throws Exception { - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTTwoKeyNav()" - + "/NavPropertyETTwoKeyNavOne/olingo.odata.test1.ETBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFCESTwoKeyNavRTTwoKeyNav") - .n() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav); - - testUri - .run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()(PropertyInt16=1,PropertyString='2')" - + "/NavPropertyETTwoKeyNavOne/olingo.odata.test1.ETTwoBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFC_RTESTwoKeyNav_") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .n() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav); - - } - - @Test - public void runBfuncBnEsRtEntityPpCp() throws Exception { - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyCompNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNav") - .n() - .isComplex("PropertyCompNav") - .isType(ComplexTypeProvider.nameCTNavFiveProp); - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyCompNav/PropertyInt16") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNav") - .n() - .isComplex("PropertyCompNav") - .isType(ComplexTypeProvider.nameCTNavFiveProp) - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyCompNav/PropertyInt16/$value") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNav") - .n() - .isComplex("PropertyCompNav") - .isType(ComplexTypeProvider.nameCTNavFiveProp) - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .n() - .isValue(); - - } - - @Test - public void runBfuncBnEsRtEntyPpCpCast() throws Exception { - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" - + "/PropertyCompTwoPrim/olingo.odata.test1.CTTwoBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNavParam") - .isParameter(0, "ParameterString", "'1'") - .n() - .isComplex("PropertyCompTwoPrim") - .isType(ComplexTypeProvider.nameCTTwoPrim) - .isTypeFilter(ComplexTypeProvider.nameCTTwoBase); - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNavParam(ParameterString='1')" - + "/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')" - + "/PropertyCompTwoPrim/olingo.odata.test1.CTTwoBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNavParam") - .isParameter(0, "ParameterString", "'1'") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'") - .n() - .isComplex("PropertyCompTwoPrim") - .isType(ComplexTypeProvider.nameCTTwoPrim) - .isTypeFilter(ComplexTypeProvider.nameCTTwoBase); - } - - @Test - public void runBfuncBnEsRtEntityPpSp() throws Exception { - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyInt16") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNav") - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.run("ESKeyNav/olingo.odata.test1.BFCESKeyNavRTETKeyNav()/PropertyInt16/$value") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFCESKeyNavRTETKeyNav") - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .n() - .isValue(); - - } - - @Test - public void runBfuncBnEsRtEs() throws Exception { - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFC_RTESTwoKeyNav_") - .isType(EntityTypeProvider.nameETTwoKeyNav); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_(ParameterString='2')") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFC_RTESTwoKeyNav_") - .isParameter(0, "ParameterString", "'2'") - .isType(EntityTypeProvider.nameETTwoKeyNav); - - testUri.run("ESKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isFunction("BFC_RTESTwoKeyNav_") - .isType(EntityTypeProvider.nameETTwoKeyNav); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_(ParameterString='3')") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFC_RTESTwoKeyNav_") - .isParameter(0, "ParameterString", "'3'") - .isType(EntityTypeProvider.nameETTwoKeyNav); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFC_RTESTwoKeyNav_") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .n() - .isCount(); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()(PropertyInt16=1,PropertyString='2')") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFC_RTESTwoKeyNav_") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'"); - - } - - @Test - public void runBfuncBnEsRtEsBa() throws Exception { - - testUri.run("ESKeyNav(PropertyInt16=1)/CollPropertyComp" - + "/olingo.odata.test1.BFCCollCTPrimCompRTESAllPrim()/olingo.odata.test1.BAESAllPrimRTETAllPrim") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isComplex("CollPropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp) - .n() - .isFunction("BFCCollCTPrimCompRTESAllPrim") - .n() - .isAction("BAESAllPrimRTETAllPrim"); - - } - - @Test - public void runBfuncBnEsRtPrim() throws Exception { - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTString()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFCESTwoKeyNavRTString"); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTString()/$value") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFCESTwoKeyNavRTString") - .isType(PropertyProvider.nameString) - .n() - .isValue(); - } - - @Test - public void runbfuncBnEsRtPrimColl() throws Exception { - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollString()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFCESTwoKeyNavRTCollString") - .isType(PropertyProvider.nameString, true); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollString()/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isFunction("BFCESTwoKeyNavRTCollString") - .isType(PropertyProvider.nameString, true) - .n() - .isCount(); - } - - @Test - public void runBfuncBnPpropCollRtEs() throws Exception { - testUri.run("ESKeyNav(1)/CollPropertyString/olingo.odata.test1.BFCCollStringRTESTwoKeyNav()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) - .n() - .isFunction("BFCCollStringRTESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, true); - - testUri.run("ESKeyNav(1)/CollPropertyString/olingo.odata.test1.BFCCollStringRTESTwoKeyNav()/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) - .n() - .isFunction("BFCCollStringRTESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .n() - .isCount(); - } - - @Test - public void runBfuncBnPpropRtEs() throws Exception { - - testUri.run("ESKeyNav(1)/PropertyString/olingo.odata.test1.BFCStringRTESTwoKeyNav()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .n() - .isFunction("BFCStringRTESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, true); - - testUri.run("ESKeyNav(1)/PropertyString/olingo.odata.test1.BFCStringRTESTwoKeyNav()/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .n() - .isFunction("BFCStringRTESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .n() - .isCount(); - - testUri.run("ESKeyNav(1)/PropertyString/olingo.odata.test1.BFCStringRTESTwoKeyNav()/$ref") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .n() - .isFunction("BFCStringRTESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .n() - .isRef(); - } - - @Test - public void runBfuncBnSingleRtEs() throws Exception { - - testUri.run("SINav/olingo.odata.test1.BFCSINavRTESTwoKeyNav()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .n() - .isFunction("BFCSINavRTESTwoKeyNav"); - } - - @Test - public void runBfuncBnSingleCastRtEs() throws Exception { - testUri.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/olingo.odata.test1.BFCETBaseTwoKeyNavRTESBaseTwoKey()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isFunction("BFCETBaseTwoKeyNavRTESBaseTwoKey"); - } - - @Test - public void runActionBound_on_EntityEntry() throws Exception { - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.BA_RTETTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .n() - .isAction("BA_RTETTwoKeyNav"); - - testUri.run("ESKeyNav(PropertyInt16=1)/olingo.odata.test1.BA_RTETTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isAction("BA_RTETTwoKeyNav"); - } - - @Test - public void runActionBound_on_EntityCollection() throws Exception { - testUri.run("ESTwoKeyNav/olingo.odata.test1.BAESTwoKeyNavRTESTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .n() - .isAction("BAESTwoKeyNavRTESTwoKeyNav"); - } - - @Test - public void runFunctionBound_on_var_Types() throws Exception { - - // on primitive - testUri.run("ESAllPrim(1)/PropertyString/olingo.odata.test1.BFCStringRTESTwoKeyNav()") - .goPath() - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETAllPrim, false) - .at(1) - .isUriPathInfoKind(UriResourceKind.primitiveProperty) - .isType(PropertyProvider.nameString); - - // on collection of primitive - testUri.run("ESCollAllPrim(1)/CollPropertyString/olingo.odata.test1.BFCCollStringRTESTwoKeyNav()") - .goPath() - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETCollAllPrim, false) - .at(1) - .isUriPathInfoKind(UriResourceKind.primitiveProperty) - .isType(PropertyProvider.nameString); - - // on complex - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='ABC')" - + "/PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESTwoKeyNav()") - .goPath() - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .at(1) - .isUriPathInfoKind(UriResourceKind.complexProperty) - .at(2) - .isType(EntityTypeProvider.nameETTwoKeyNav); - - // on collection of complex - testUri.run("ESKeyNav(1)/CollPropertyComp/olingo.odata.test1.BFCCollCTPrimCompRTESAllPrim()") - .goPath() - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .at(1) - .isType(ComplexTypeProvider.nameCTPrimComp, true) - .at(2) - .isUriPathInfoKind(UriResourceKind.function) - .isType(EntityTypeProvider.nameETAllPrim); - - // on entity - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='ABC')" - + "/olingo.odata.test1.BFCETTwoKeyNavRTESTwoKeyNav()") - .goPath() - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .at(1) - .isUriPathInfoKind(UriResourceKind.function) - .isType(EntityTypeProvider.nameETTwoKeyNav); - - // on collection of entity - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") - .goPath() - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .at(1).isUriPathInfoKind(UriResourceKind.function) - .isType(EntityTypeProvider.nameETTwoKeyNav); - } - - @Test - public void runActionBound_on_EntityCast() throws Exception { - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" - + "/olingo.odata.test1.BAETBaseTwoKeyNavRTETBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isAction("BAETBaseTwoKeyNavRTETBaseTwoKeyNav"); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=1,PropertyString='2')" - + "/olingo.odata.test1.ETTwoBaseTwoKeyNav/olingo.odata.test1.BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav) - .n() - .isAction("BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav"); - } - - @Test - public void crossjoin() throws Exception { - testUri.run("$crossjoin(ESKeyNav)") - .isKind(UriInfoKind.crossjoin) - .isCrossJoinEntityList(Arrays.asList("ESKeyNav")); - - testUri.run("$crossjoin(ESKeyNav,ESTwoKeyNav)") - .isKind(UriInfoKind.crossjoin) - .isCrossJoinEntityList(Arrays.asList("ESKeyNav", "ESTwoKeyNav")); - } - - @Test - public void crossjoinFilter() throws Exception { - testUri.run("$crossjoin(ESTwoPrim,ESMixPrimCollComp)", - "$filter=ESTwoPrim/PropertyString eq ESMixPrimCollComp/PropertyComp/PropertyString") - .goFilter() - .isBinary(BinaryOperatorKind.EQ) - .is("< eq >"); - } - - @Test - public void crossjoinExpand() throws Exception { - testUri.run("$crossjoin(ESTwoPrim,ESAllPrim)", - "$expand=ESTwoPrim") - .goExpand() - .first().goPath().first().isEntitySet("ESTwoPrim"); - - testUri.run("$crossjoin(ESTwoPrim,ESAllPrim)", - "$expand=ESTwoPrim,ESAllPrim") - .goExpand() - .first().goPath().first().isEntitySet("ESTwoPrim") - .goUpExpandValidator().next().goPath().first().isEntitySet("ESAllPrim"); - - // TODO: Once crossjoin is implemented these tests should no longer result in errors -// testUri.run("$crossjoin(ESTwoPrim,ESAllPrim)", -// "$expand=ESAllPrim/NavPropertyETTwoPrimOne") -// .goExpand() -// .first().goPath().at(0).isEntitySet("ESAllPrim") -// .at(1).isNavProperty("NavPropertyETTwoPrimOne", new FullQualifiedName("Namespace1_Alias.ETTwoPrim"), false); - } - - @Test - public void crossjoinError() throws Exception { - testUri.runEx("$crossjoin").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testUri.runEx("$crossjoin/error").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("$crossjoin()").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testUri.runEx("$crossjoin(ESKeyNav, ESTwoKeyNav)/invalid") - .isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("$crossjoin(ESKeyNav)/$ref") - .isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - } - - @Test - public void runEntityId() throws Exception { - testUri.run("$entity", "$id=ESKeyNav(1)") - .isKind(UriInfoKind.entityId) - .isIdText("ESKeyNav(1)"); - testUri.run("$entity/olingo.odata.test1.ETKeyNav", "$id=ESKeyNav(1)") - .isKind(UriInfoKind.entityId) - .isEntityType(EntityTypeProvider.nameETKeyNav) - .isIdText("ESKeyNav(1)"); - } - - @Test - public void runEsName() throws Exception { - testUri.run("ESAllPrim") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESAllPrim") - .isType(EntityTypeProvider.nameETAllPrim, true); - - testUri.run("ESAllPrim/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESAllPrim") - .isType(EntityTypeProvider.nameETAllPrim, true) - .n() - .isCount(); - } - - @Test - public void esNameError() { - - testUri.runEx("ESAllPrim/$count/$ref").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("ESAllPrim/$ref/$count").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("ESAllPrim/$ref/invalid").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("ESAllPrim/$count/invalid").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("ESAllPrim/PropertyString").isExSemantic(MessageKeys.PROPERTY_AFTER_COLLECTION); - testUri.runEx("ESAllPrim(1)/whatever").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("ESAllPrim('1')").isExSemantic(MessageKeys.INVALID_KEY_VALUE); - testUri.runEx("ESAllPrim(PropertyInt16)").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testUri.runEx("ESAllPrim(PropertyInt16=)").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testUri.runEx("ESAllPrim(PropertyInt16=1,Invalid='1')").isExSemantic(MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES); - - testUri.runEx("ESBase/olingo.odata.test1.ETBase/PropertyInt16") - .isExSemantic(MessageKeys.PROPERTY_AFTER_COLLECTION); - - testUri.runEx("ETBaseTwoKeyTwoPrim/olingo.odata.test1.ETBaseTwoKeyTwoPrim" - + "/olingo.odata.test1.ETTwoBaseTwoKeyTwoPrim") - .isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); - - testUri.runEx("ETBaseTwoKeyTwoPrim/olingo.odata.test1.ETBaseTwoKeyTwoPrim(1)/olingo.odata.test1.ETAllKey") - .isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); - - testUri.runEx("ETBaseTwoKeyTwoPrim(1)/olingo.odata.test1.ETBaseTwoKeyTwoPrim('1')/olingo.odata.test1.ETAllKey") - .isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); - - testUri.runEx("ETBaseTwoKeyTwoPrim(1)/olingo.odata.test1.ETBaseTwoKeyTwoPrim" - + "/olingo.odata.test1.ETTwoBaseTwoKeyTwoPrim") - .isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); - - testUri.runEx("ETBaseTwoKeyTwoPrim/olingo.odata.test1.ETBaseTwoKeyTwoPrim" - + "/olingo.odata.test1.ETTwoBaseTwoKeyTwoPrim(1)") - .isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); - - testUri.runEx("ETBaseTwoKeyTwoPrim/olingo.odata.test1.ETAllKey").isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); - testUri.runEx("ETBaseTwoKeyTwoPrim()").isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); - testUri.runEx("ESAllNullable(1)/CollPropertyString/$value").isExSemantic(MessageKeys.ONLY_FOR_TYPED_PARTS); - - testUri.runEx("ETMixPrimCollComp(1)/ComplexProperty/$value").isExSemantic(MessageKeys.RESOURCE_NOT_FOUND); - } - - @Test - public void resourcePathWithApostrophe() throws Exception { - testUri.runEx("ESAllPrim'").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testUri.runEx("ESAllPrim'InvalidStuff").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testFilter.runOnETKeyNavEx("PropertyInt16' eq 0").isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); - testFilter.runOnETKeyNavEx("PropertyInt16 eq' 0").isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); - testFilter.runOnETKeyNavEx("PropertyInt16 eq 0'") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - testFilter.runOnETKeyNavEx("PropertyInt16 eq 'dsd''") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - } - - @Test - public void runFunctionsWithKeyPredicates() throws Exception { - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") - .isFunction("UFCRTCollETMixPrimCollCompTwoParam") - .isParameter(0, "ParameterString", "'1'") - .isParameter(1, "ParameterInt16", "1"); - - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt16=0)") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") - .isFunction("UFCRTCollETMixPrimCollCompTwoParam") - .isParameter(0, "ParameterString", "'1'") - .isParameter(1, "ParameterInt16", "1") - .isKeyPredicate(0, "PropertyInt16", "0"); - - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)(0)") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") - .isFunction("UFCRTCollETMixPrimCollCompTwoParam") - .isParameter(0, "ParameterString", "'1'") - .isParameter(1, "ParameterInt16", "1") - .isKeyPredicate(0, "PropertyInt16", "0"); - - testUri.runEx("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt16 eq 0)") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - - // PropertyInt32 does not exist - testUri.runEx("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt32=0)") - .isExValidation(UriValidationException.MessageKeys.INVALID_KEY_PROPERTY); - - testUri.runEx("FICRTCollETMixPrimCollCompTwoParam(ParameterString='1',ParameterInt16=1)" - + "(PropertyInt16=0,PropertyInt16=1)") - .isExValidation(UriValidationException.MessageKeys.DOUBLE_KEY_PROPERTY); - - testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterString='1',ParameterInt16=1)") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCollCTTwoPrimTwoParam") - .isFunction("UFCRTCollCTTwoPrimTwoParam") - .isParameter(0, "ParameterString", "'1'") - .isParameter(1, "ParameterInt16", "1"); - - testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt16=1)") - .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); - - testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterString='1',ParameterInt16=1)(1)") - .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); - - testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt32=1)") - .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); - - testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterString='1',ParameterInt16=1)(PropertyInt32=1,PropertyInt16=2)") - .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); - - testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCollESTwoKeyNavParam") - .isFunction("UFCRTCollETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1"); - - testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,PropertyString='1')") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCollESTwoKeyNavParam") - .isFunction("UFCRTCollETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'1'"); - - testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16 eq 1)") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - - testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1)") - .isExSemantic(MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES); - - testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,PropertyInt32=1,PropertyString='1')") - .isExValidation(UriValidationException.MessageKeys.INVALID_KEY_PROPERTY); - - testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)()") - .isExSemantic(MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES); - - testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,PropertyInt32=1)") - .isExValidation(UriValidationException.MessageKeys.INVALID_KEY_PROPERTY); - - testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,Unkown=1)") - .isExValidation(UriValidationException.MessageKeys.INVALID_KEY_PROPERTY); - - testUri.run("FICRTCollString()") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCollString") - .isFunction("UFCRTCollString"); - - testUri.run("FICRTString()") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTString") - .isFunction("UFCRTString"); - - testUri.runEx("FICRTCollString()(0)") - .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); - - testUri.runEx("FICRTString()(0)") - .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); - } - - @Test - public void runNonComposableFunctions() throws Exception { - - - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$skip=1"); - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$top=1"); - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", - "$filter=PropertyInt16 eq 1"); - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$skip=1"); - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$count=true"); - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$skiptoken=5"); - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')", "$search=test"); - - testUri.run("ESAllPrim/olingo.odata.test1.BFNESAllPrimRTCTAllPrim()") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESAllPrim") - .at(1) - .isFunction("BFNESAllPrimRTCTAllPrim"); - - testUri.runEx("ESAllPrim/olingo.odata.test1.BFNESAllPrimRTCTAllPrim()" - + "/PropertyString") - .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); - - testUri.runEx("FINRTByteNineParam(ParameterEnum=Namespace1_Alias.ENString'String1'," - + "CollParameterETTwoPrim=@collComp,ParameterComp=@comp,ParameterDef='key1'," - + "ParameterETTwoPrim=@comp,CollParameterDef=@collDef,CollParameterByte=@collByte," - + "CollParameterComp=@collComp,CollParameterEnum=@collEnum)/$value?@comp={\"PropertyInt16\":1}" - + "&@collByte=[1]&@collEnum=[\"String1,String1\"]&@collDef=[\"Test\"]&@collComp=[{\"PropertyInt16\":11}]") - .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); - } - - @Test - public void runEsNameCast() throws Exception { - testUri.run("ESTwoPrim/olingo.odata.test1.ETBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoPrim") - .isType(EntityTypeProvider.nameETTwoPrim, true) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBase); - - testUri.run("ESTwoPrim/olingo.odata.test1.ETBase(-32768)/olingo.odata.test1.ETTwoBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoPrim") - .isType(EntityTypeProvider.nameETTwoPrim, false) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBase) - .isKeyPredicate(0, "PropertyInt16", "-32768") - .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBase); - - testUri.run("ESTwoPrim/olingo.odata.test1.ETTwoBase(-32768)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoPrim") - .isType(EntityTypeProvider.nameETTwoPrim, false) - .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase) - .isKeyPredicate(0, "PropertyInt16", "-32768"); - - testUri.run("ESTwoPrim/Namespace1_Alias.ETTwoBase(-32768)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoPrim") - .isType(EntityTypeProvider.nameETTwoPrim, false) - .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase) - .isKeyPredicate(0, "PropertyInt16", "-32768"); - } - - @Test - public void runEsNamePpSpCast() throws Exception { - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav/PropertyDate") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" - + "/PropertyComp/PropertyInt16") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isComplex("PropertyComp") - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - } - - @Test - public void runEsNameKey() throws Exception { - testUri.run("ESCollAllPrim(1)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESCollAllPrim"); - - testUri.run("ESCollAllPrim(PropertyInt16=1)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESCollAllPrim"); - - testUri.run("ESFourKeyAlias(PropertyInt16=1,KeyAlias1=2,KeyAlias2='3',KeyAlias3='4')") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESFourKeyAlias") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "KeyAlias1", "2") - .isKeyPredicate(2, "KeyAlias2", "'3'") - .isKeyPredicate(3, "KeyAlias3", "'4'"); - - testUri.runEx("ESTwoPrim('wrong')").isExSemantic(MessageKeys.INVALID_KEY_VALUE); - testUri.runEx("ESTwoPrim(PropertyInt16='wrong')").isExSemantic(MessageKeys.INVALID_KEY_VALUE); - } - - @Test - public void runEsNameParaKeys() throws Exception { - testUri.run("ESAllKey(PropertyString='O''Neil',PropertyBoolean=true,PropertyByte=255," - + "PropertySByte=-128,PropertyInt16=-32768,PropertyInt32=-2147483648," - + "PropertyInt64=-9223372036854775808,PropertyDecimal=1,PropertyDate=2013-09-25," - + "PropertyDateTimeOffset=2002-10-10T12:00:00-05:00," - + "PropertyDuration=duration'P50903316DT2H25M4S'," - + "PropertyGuid=12345678-1234-1234-1234-123456789012," - + "PropertyTimeOfDay=12:34:55)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESAllKey") - .isKeyPredicate(0, "PropertyString", "'O''Neil'") - .isKeyPredicate(1, "PropertyBoolean", "true") - .isKeyPredicate(2, "PropertyByte", "255") - .isKeyPredicate(3, "PropertySByte", "-128") - .isKeyPredicate(4, "PropertyInt16", "-32768") - .isKeyPredicate(5, "PropertyInt32", "-2147483648") - .isKeyPredicate(6, "PropertyInt64", "-9223372036854775808") - .isKeyPredicate(7, "PropertyDecimal", "1") - .isKeyPredicate(8, "PropertyDate", "2013-09-25") - .isKeyPredicate(9, "PropertyDateTimeOffset", "2002-10-10T12:00:00-05:00") - .isKeyPredicate(10, "PropertyDuration", "duration'P50903316DT2H25M4S'") - .isKeyPredicate(11, "PropertyGuid", "12345678-1234-1234-1234-123456789012") - .isKeyPredicate(12, "PropertyTimeOfDay", "12:34:55"); - } - - @Test - public void runEsNameKeyCast() throws Exception { - testUri.run("ESTwoPrim(1)/olingo.odata.test1.ETBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoPrim") - .isType(EntityTypeProvider.nameETTwoPrim) - .isKeyPredicate(0, "PropertyInt16", "1") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBase); - - testUri.run("ESTwoPrim(1)/olingo.odata.test1.ETTwoBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoPrim") - .isType(EntityTypeProvider.nameETTwoPrim) - .isKeyPredicate(0, "PropertyInt16", "1") - .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBase); - - testUri.run("ESTwoPrim/olingo.odata.test1.ETBase(1)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoPrim") - .isType(EntityTypeProvider.nameETTwoPrim) - .isKeyPredicate(0, "PropertyInt16", "1") - .isTypeFilterOnCollection(EntityTypeProvider.nameETBase); - - testUri.run("ESTwoPrim/olingo.odata.test1.ETTwoBase(1)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoPrim") - .isType(EntityTypeProvider.nameETTwoPrim) - .isKeyPredicate(0, "PropertyInt16", "1") - .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase); - - testUri.run("ESTwoPrim/olingo.odata.test1.ETBase(1)/olingo.odata.test1.ETTwoBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoPrim") - .isType(EntityTypeProvider.nameETTwoPrim) - .isKeyPredicate(0, "PropertyInt16", "1") - .isTypeFilterOnCollection(EntityTypeProvider.nameETBase); - - testUri.run("ESTwoPrim/olingo.odata.test1.ETTwoBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoPrim") - .isType(EntityTypeProvider.nameETTwoPrim) - .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBase); - - // Keys cannot be specified twice. - testUri.runEx("ESTwoPrim(1)/olingo.odata.test1.ETBase(1)") - .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); - testUri.runEx("ESTwoPrim/olingo.odata.test1.ETBase(1)/olingo.odata.test1.ETTwoBase(1)") - .isExSemantic(MessageKeys.KEY_NOT_ALLOWED); - - testUri.runEx("ESBase/olingo.odata.test1.ETTwoPrim(1)").isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER); - } - - @Test - public void runEsNameParaKeysCast() throws Exception { - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=1,PropertyString='2')") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'"); - } - - @Test - public void run_EsNamePpCp() throws Exception { - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .n() - .isComplex("PropertyComp"); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyComp/PropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .n() - .isComplex("PropertyComp") - .n() - .isComplex("PropertyComp"); - - testUri.run("ESMixEnumDefCollComp(PropertyEnumString=olingo.odata.test1.ENString'String1'," - + "PropertyDefString='key1')/PropertyEnumString") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESMixEnumDefCollComp") - .isKeyPredicate(0, "PropertyEnumString", "olingo.odata.test1.ENString'String1'") - .isKeyPredicate(1, "PropertyDefString", "'key1'") - .n() - .isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false); - - testUri.run("ESMixEnumDefCollComp(PropertyEnumString=olingo.odata.test1.ENString'String1'," - + "PropertyDefString='key1')/PropertyDefString") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESMixEnumDefCollComp") - .isKeyPredicate(0, "PropertyEnumString", "olingo.odata.test1.ENString'String1'") - .isKeyPredicate(1, "PropertyDefString", "'key1'") - .n() - .isPrimitiveProperty("PropertyDefString", TypeDefinitionProvider.nameTDString, false); - } - - @Test - public void runEsNamePpCpColl() throws Exception { - testUri.run("ESMixPrimCollComp(5)/CollPropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESMixPrimCollComp") - .isKeyPredicate(0, "PropertyInt16", "5") - .n() - .isComplex("CollPropertyComp") - .isType(ComplexTypeProvider.nameCTTwoPrim, true); - - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/CollPropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .n() - .isComplex("CollPropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp, true); - - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/CollPropertyComp/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .n() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .n() - .isComplex("CollPropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp, true) - .n() - .isCount(); - - testUri.run("ESMixEnumDefCollComp(PropertyEnumString=olingo.odata.test1.ENString'String1'," - + "PropertyDefString='key1')/CollPropertyEnumString") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESMixEnumDefCollComp") - .isKeyPredicate(0, "PropertyEnumString", "olingo.odata.test1.ENString'String1'") - .isKeyPredicate(1, "PropertyDefString", "'key1'") - .n() - .isPrimitiveProperty("CollPropertyEnumString", EnumTypeProvider.nameENString, true); - - testUri.run("ESMixEnumDefCollComp(PropertyEnumString=olingo.odata.test1.ENString'String1'," - + "PropertyDefString='key1')/CollPropertyDefString") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESMixEnumDefCollComp") - .isKeyPredicate(0, "PropertyEnumString", "olingo.odata.test1.ENString'String1'") - .isKeyPredicate(1, "PropertyDefString", "'key1'") - .n() - .isPrimitiveProperty("CollPropertyDefString", TypeDefinitionProvider.nameTDString, true); - } - - @Test - public void runEsNamePpCpCast() throws Exception { - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav/PropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isComplex("PropertyComp"); - - testUri - .run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" - + "/PropertyComp/PropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .n() - .isComplex("PropertyComp") - .n() - .isComplex("PropertyComp"); - - testUri - .run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" - + "/PropertyCompTwoPrim/olingo.odata.test1.CTBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isComplex("PropertyCompTwoPrim") - .isType(ComplexTypeProvider.nameCTTwoPrim) - .isTypeFilter(ComplexTypeProvider.nameCTBase); - - testUri - .run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" - + "/PropertyCompTwoPrim/olingo.odata.test1.CTTwoBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isComplex("PropertyCompTwoPrim") - .isType(ComplexTypeProvider.nameCTTwoPrim) - .isTypeFilter(ComplexTypeProvider.nameCTTwoBase); - } - - @Test - public void runNsNamePpNp() throws Exception { - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true); - - testUri.run("ESKeyNav(1)/NavPropertyETKeyNavMany(2)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2"); - - testUri.run("ESKeyNav(PropertyInt16=1)/NavPropertyETKeyNavMany(PropertyInt16=2)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2"); - - testUri.run("ESKeyNav(1)/NavPropertyETKeyNavMany(2)/PropertyInt16") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.run("ESKeyNav(1)/NavPropertyETKeyNavMany(2)/PropertyCompNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .n() - .isComplex("PropertyCompNav"); - - testUri.run("ESKeyNav(1)/NavPropertyETKeyNavMany(2)/NavPropertyETKeyNavOne") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .n() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false); - - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')" - + "/NavPropertyETKeyNavMany(4)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'") - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "4"); - - testUri.run("ESKeyNav(1)/PropertyCompNav/NavPropertyETTwoKeyNavOne") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isComplex("PropertyCompNav") - .n() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); - - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='(3)')" - + "/PropertyComp/PropertyComp/PropertyInt16") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'(3)'") - .n() - .isComplex("PropertyComp") - .n() - .isComplex("PropertyComp") - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.run("ESKeyNav(1)/NavPropertyETMediaMany(2)/$value") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETMediaMany", EntityTypeProvider.nameETMedia, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .n() - .isValue(); - - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')" - + "/NavPropertyETKeyNavOne/NavPropertyETMediaOne/$value") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'") - .n() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .n() - .isNavProperty("NavPropertyETMediaOne", EntityTypeProvider.nameETMedia, false) - .n() - .isValue(); - - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')" - + "/NavPropertyETKeyNavOne/$ref") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'") - .n() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .n() - .isRef(); - } - - @Test - public void runEsNamePpNpCast() throws Exception { - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" - + "/NavPropertyETKeyNavMany") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" - + "/NavPropertyETKeyNavMany(3)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "3"); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav" - + "/NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETTwoBaseTwoKeyNav(PropertyInt16=3,PropertyString='4')") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESTwoKeyNav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "3") - .isKeyPredicate(1, "PropertyString", "'4'") - .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBaseTwoKeyNav); - - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')" - + "/NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=4,PropertyString='5')" - + "/olingo.odata.test1.ETTwoBaseTwoKeyNav/NavPropertyETBaseTwoKeyNavMany") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "4") - .isKeyPredicate(1, "PropertyString", "'5'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav) - .n() - .isNavProperty("NavPropertyETBaseTwoKeyNavMany", EntityTypeProvider.nameETBaseTwoKeyNav, true); - - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/" - + "NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=4,PropertyString='5')/" - + "NavPropertyETKeyNavMany") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "4") - .isKeyPredicate(1, "PropertyString", "'5'") - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); - } - - @Test - public void runEsNamePpNpRc() throws Exception { - // checks for using referential constraints to fill missing keys - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany('2')").goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicateRef(0, "PropertyInt16", "PropertyInt16") - .isKeyPredicate(1, "PropertyString", "'2'"); - - testUri.run("ESKeyNav(PropertyInt16=1)/NavPropertyETTwoKeyNavMany(PropertyString='2')").goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicateRef(0, "PropertyInt16", "PropertyInt16") - .isKeyPredicate(1, "PropertyString", "'2'"); - - } - - @Test - public void runEsNamePpSp() throws Exception { - testUri.run("ESAllPrim(1)/PropertyByte") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESAllPrim") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isPrimitiveProperty("PropertyByte", PropertyProvider.nameByte, false); - - testUri.run("ESAllPrim(1)/PropertyByte/$value") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESAllPrim") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isPrimitiveProperty("PropertyByte", PropertyProvider.nameByte, false) - .n() - .isValue(); - - testUri.run("ESMixPrimCollComp(1)/PropertyComp/PropertyString") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESMixPrimCollComp") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isComplex("PropertyComp") - .n() - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - } - - @Test - public void runEsNamePpSpColl() throws Exception { - testUri.run("ESCollAllPrim(1)/CollPropertyString") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESCollAllPrim") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true); - - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/CollPropertyString") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .n() - .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true); - - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=2,PropertyString='3')/CollPropertyString/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'") - .n() - .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) - .n() - .isCount(); - - } - - @Test - public void runEsNameRef() throws Exception { - testUri.run("ESAllPrim/$ref") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESAllPrim") - .n() - .isRef(); - - testUri.run("ESAllPrim(-32768)/$ref") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESAllPrim") - .isKeyPredicate(0, "PropertyInt16", "-32768") - .n() - .isRef(); - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany/$ref") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .n() - .isRef(); - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='2')/$ref") - .isKind(UriInfoKind.resource).goPath() - .first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .n() - .isRef(); - } - - @Test - public void runFunctionImpBf() throws Exception { - - testUri.run("FICRTString()/olingo.odata.test1.BFCStringRTESTwoKeyNav()"); - } - - @Test - public void runFunctionImpCastBf() throws Exception { - - testUri.run("FICRTETTwoKeyNavParam(ParameterInt16=1)/olingo.odata.test1.ETBaseTwoKeyNav" - + "/olingo.odata.test1.BFCETBaseTwoKeyNavRTETTwoKeyNav()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTETTwoKeyNavParam") - .isFunction("UFCRTETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isFunction("BFCETBaseTwoKeyNavRTETTwoKeyNav"); - - testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)" - + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=2,PropertyString='3')" - + "/olingo.odata.test1.BFCETBaseTwoKeyNavRTETTwoKeyNav()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTCollESTwoKeyNavParam") - .isFunction("UFCRTCollETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'") - .n() - .isFunction("BFCETBaseTwoKeyNavRTETTwoKeyNav"); - - testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=null)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTCollCTTwoPrimTwoParam") - .isFunction("UFCRTCollCTTwoPrimTwoParam") - .isParameter(0, "ParameterInt16", "1") - .isParameter(1, "ParameterString", null); - } - - @Test - public void runFunctionImpEntity() throws Exception { - - testUri.run("FICRTETKeyNav()") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTETKeyNav") - .isFunction("UFCRTETKeyNav") - .isType(EntityTypeProvider.nameETKeyNav); - - testUri.run("FICRTETTwoKeyNavParam(ParameterInt16=1)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1"); - - testUri.run("FICRTESMedia(ParameterInt16=1)/$value") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTESMedia") - .isFunction("UFCRTETMedia") - .n() - .isValue(); - - testUri.run("FICRTETKeyNav()/$ref") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTETKeyNav") - .isFunction("UFCRTETKeyNav") - .n() - .isRef(); - testUri.run("FICRTETTwoKeyNavParam(ParameterInt16=1)/$ref") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTETTwoKeyNavParam") - .isFunction("UFCRTETTwoKeyNavParam") - .n() - .isRef(); - - testUri.run("FICRTETTwoKeyNavParam(ParameterInt16=1)/olingo.odata.test1.ETBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTETTwoKeyNavParam") - .isFunction("UFCRTETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav); - - testUri.run("FICRTETTwoKeyNavParam(ParameterInt16=1)/olingo.odata.test1.ETBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTETTwoKeyNavParam") - .isFunction("UFCRTETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav); - - testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)" - + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=2,PropertyString='3')") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTCollESTwoKeyNavParam") - .isFunction("UFCRTCollETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'"); - } - - @Test - public void runFunctionImpEs() throws Exception { - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") - .isFunction("UFCRTCollETMixPrimCollCompTwoParam") - .isParameter(0, "ParameterInt16", "1") - .isParameter(1, "ParameterString", "'2'") - .isType(EntityTypeProvider.nameETMixPrimCollComp); - - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") - .isFunction("UFCRTCollETMixPrimCollCompTwoParam") - .isParameter(0, "ParameterInt16", "1") - .isParameter(1, "ParameterString", "'2'") - .isType(EntityTypeProvider.nameETMixPrimCollComp); - - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") - .isFunction("UFCRTCollETMixPrimCollCompTwoParam") - .isParameter(0, "ParameterInt16", "1") - .isParameter(1, "ParameterString", "'2'") - .isType(EntityTypeProvider.nameETMixPrimCollComp) - .n() - .isCount(); - - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") - .isFunction("UFCRTCollETMixPrimCollCompTwoParam") - .isParameter(0, "ParameterInt16", "1") - .isParameter(1, "ParameterString", "'1'"); - - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='1')(0)") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") - .isFunction("UFCRTCollETMixPrimCollCompTwoParam") - .isParameter(0, "ParameterInt16", "1") - .isParameter(1, "ParameterString", "'1'"); - } - - @Test - public void runFunctionImpError() { - testUri.runEx("FICRTCollCTTwoPrimTwoParam") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testUri.runEx("FICRTCollCTTwoPrimTwoParam()").isExSemantic(MessageKeys.FUNCTION_NOT_FOUND); - testUri.runEx("FICRTCollCTTwoPrimTwoParam(invalidParam=2)").isExSemantic(MessageKeys.FUNCTION_NOT_FOUND); - } - - @Test - public void runFunctionImpEsCast() throws Exception { - - testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)/olingo.odata.test1.ETBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTCollESTwoKeyNavParam") - .isFunction("UFCRTCollETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav); - - testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)/olingo.odata.test1.ETBaseTwoKeyNav/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTCollESTwoKeyNavParam") - .isFunction("UFCRTCollETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isCount(); - - testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)" - + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=2,PropertyString='3')") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTCollESTwoKeyNavParam") - .isFunction("UFCRTCollETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'"); - - testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)" - + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=2,PropertyString='3')" - + "/olingo.odata.test1.ETTwoBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath() - .first() - .isFunctionImport("FICRTCollESTwoKeyNavParam") - .isFunction("UFCRTCollETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'") - .isTypeFilterOnEntry(EntityTypeProvider.nameETTwoBaseTwoKeyNav); - - } - - @Test - public void runSingletonEntityValue() throws Exception { - testUri.run("SIMedia/$value") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SIMedia") - .n().isValue(); - } - - @Test - public void runSingletonPpNpCast() throws Exception { - testUri.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETKeyNavMany") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); - - testUri.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETKeyNavMany(1)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1"); - - } - - @Test - public void runSingletonPpCpCast() throws Exception { - testUri.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/PropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isComplex("PropertyComp"); - - testUri.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/PropertyComp/PropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isComplex("PropertyComp") - .n() - .isComplex("PropertyComp"); - - testUri.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/PropertyCompTwoPrim/olingo.odata.test1.CTBase") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isComplex("PropertyCompTwoPrim") - .isType(ComplexTypeProvider.nameCTTwoPrim) - .isTypeFilter(ComplexTypeProvider.nameCTBase); - - } - - @Test - public void runSingletonPpSpCast() throws Exception { - testUri.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/PropertyInt16") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.run("SINav/olingo.odata.test1.ETBaseTwoKeyNav/CollPropertyString") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilter(EntityTypeProvider.nameETBaseTwoKeyNav) - .n() - .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) - .isType(PropertyProvider.nameString, true); - - } - - @Test - public void runSingletonEntityPpNp() throws Exception { - testUri.run("SINav/NavPropertyETKeyNavMany") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .n() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); - - testUri.run("SINav/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='2')") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'"); - - } - - @Test - public void runSingletonEntityPpCp() throws Exception { - testUri.run("SINav/PropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .n() - .isComplex("PropertyComp"); - - testUri.run("SINav/PropertyComp/PropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .n() - .isComplex("PropertyComp") - .n() - .isComplex("PropertyComp"); - - } - - @Test - public void runSingletonEntityPpCpColl() throws Exception { - testUri.run("SINav/CollPropertyComp") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .n() - .isComplex("CollPropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp, true); - - testUri.run("SINav/CollPropertyComp/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .n() - .isComplex("CollPropertyComp") - .isType(ComplexTypeProvider.nameCTPrimComp, true) - .n() - .isCount(); - } - - @Test - public void runSingletonEntityPpSp() throws Exception { - testUri.run("SINav/PropertyString") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .n() - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - } - - @Test - public void runSingletonEntityPpSpColl() throws Exception { - testUri.run("SINav/CollPropertyString") - - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .n() - .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true); - testUri.run("SINav/CollPropertyString/$count") - .isKind(UriInfoKind.resource).goPath() - .first() - .isSingleton("SINav") - .n() - .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) - .n() - .isCount(); - } - - @Test - public void expandStar() throws Exception { - testUri.run("ESKeyNav(1)", "$expand=*") - .isKind(UriInfoKind.resource).goExpand() - .first() - .isSegmentStar(); - - testUri.run("ESKeyNav(1)", "$expand=*/$ref") - .isKind(UriInfoKind.resource).goExpand() - .first() - .isSegmentStar() - .isSegmentRef(); - - testUri.run("ESKeyNav(1)", "$expand=*/$ref,NavPropertyETKeyNavMany") - .isKind(UriInfoKind.resource).goExpand() - .first() - .isSegmentStar().isSegmentRef() - .next() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); - - testUri.run("ESKeyNav(1)", "$expand=*($levels=3)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .isSegmentStar() - .isLevelText("3"); - - testUri.run("ESKeyNav(1)", "$expand=*($levels=max)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .isSegmentStar() - .isLevelText("max"); - } - - @Test - public void expandNavigationRef() throws Exception { - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .n().isRef(); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavOne/$ref") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .isType(EntityTypeProvider.nameETKeyNav, false) - .n().isRef(); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($filter=PropertyInt16 eq 1)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .n().isRef() - .goUpExpandValidator().goFilter().is("< eq <1>>"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($orderby=PropertyInt16)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .n().isRef() - .goUpExpandValidator() - .isSortOrder(0, false) - .goOrder(0).goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($skip=1)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .n().isRef() - .goUpExpandValidator() - .isSkipText("1"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($top=2)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .n().isRef() - .goUpExpandValidator() - .isTopText("2"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($count=true)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .n().isRef() - .goUpExpandValidator() - .isInlineCountText("true"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($skip=1;$top=3)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .n().isRef() - .goUpExpandValidator() - .isSkipText("1") - .isTopText("3"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref($skip=1%3b$top=3)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .n().isRef() - .goUpExpandValidator() - .isSkipText("1") - .isTopText("3"); - } - - @Test - public void expandNavigationCount() throws Exception { - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$count") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .n().isCount(); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavOne/$count") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .isType(EntityTypeProvider.nameETKeyNav, false) - .n().isCount(); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$count($filter=PropertyInt16 gt 1)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .n().isCount() - .goUpExpandValidator() - .goFilter().is("< gt <1>>"); - } - - @Test - public void expandNavigationOptions() throws Exception { - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($filter=PropertyInt16 eq 1)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator().goFilter().is("< eq <1>>"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($orderby=PropertyInt16)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator() - .isSortOrder(0, false) - .goOrder(0).goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($skip=1)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator() - .isSkipText("1"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($top=2)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator() - .isTopText("2"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($count=true)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator() - .isInlineCountText("true"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($select=PropertyString)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator() - .goSelectItem(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($expand=NavPropertyETTwoKeyNavOne)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator() - .goExpand() - .goPath().first() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($expand=NavPropertyETKeyNavMany)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator() - .goExpand() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavOne($levels=5)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .isType(EntityTypeProvider.nameETKeyNav, false) - .goUpExpandValidator() - .isLevelText("5"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($select=PropertyString)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator() - .goSelectItem(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavOne($levels=max)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .isType(EntityTypeProvider.nameETKeyNav, false) - .goUpExpandValidator() - .isLevelText("max"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($skip=1;$top=2)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator() - .isSkipText("1") - .isTopText("2"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($skip=1%3b$top=2)") - .isKind(UriInfoKind.resource).goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator() - .isSkipText("1") - .isTopText("2"); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany($search=Country AND Western)") - .isKind(UriInfoKind.resource).goExpand() - .first().goPath().first().isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .goUpExpandValidator() - .isSearchSerialized("{'Country' AND 'Western'}"); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='Hugo')", "$expand=NavPropertyETKeyNavMany") - .isKind(UriInfoKind.resource).goPath() - .first() - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'Hugo'") - .goUpUriValidator().goExpand() - .first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav, true); - } - - @Test - public void expandTypeCasts() throws Exception { - testUri.run("ESTwoKeyNav", "$expand=olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETKeyNavMany") - .isKind(UriInfoKind.resource) - .goExpand().first() - .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='Hugo')", - "$expand=olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETKeyNavMany") - .isKind(UriInfoKind.resource).goPath().first() - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'Hugo'") - .goUpUriValidator().goExpand().first() - .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) - .goPath().first() - .isType(EntityTypeProvider.nameETKeyNav) - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')", - "$expand=olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETTwoKeyNavMany") - .isKind(UriInfoKind.resource).goPath().first() - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .goUpUriValidator().goExpand().first() - .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) - .goPath().first() - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')", - "$expand=olingo.odata.test1.ETBaseTwoKeyNav/NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETTwoBaseTwoKeyNav") - .isKind(UriInfoKind.resource).goPath().first() - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .goUpUriValidator().goExpand().first() - .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) - .goPath().first() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBaseTwoKeyNav); - - testUri.run("ESTwoKeyNav", "$expand=olingo.odata.test1.ETBaseTwoKeyNav/PropertyCompNav/NavPropertyETTwoKeyNavOne") - .isKind(UriInfoKind.resource) - .goExpand().first() - .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) - .goPath().first() - .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false) - .n() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); - - testUri.run("ESTwoKeyNav", "$expand=olingo.odata.test1.ETBaseTwoKeyNav/PropertyCompNav/*") - .isKind(UriInfoKind.resource) - .goExpand().first() - .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) - .isSegmentStar() - .goPath().last().isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false); - - testUri.run("ESTwoKeyNav", "$expand=olingo.odata.test1.ETBaseTwoKeyNav/PropertyCompNav" - + "/olingo.odata.test1.CTTwoBasePrimCompNav/NavPropertyETTwoKeyNavOne") - .isKind(UriInfoKind.resource) - .goExpand().first() - .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) - .goPath().first() - .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false) - .isTypeFilter(ComplexTypeProvider.nameCTTwoBasePrimCompNav) - .n() - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); - - testUri.run("ESKeyNav", "$expand=NavPropertyETTwoKeyNavMany/Namespace1_Alias.ETBaseTwoKeyNav" - + "($expand=NavPropertyETBaseTwoKeyNavOne)") - .isKind(UriInfoKind.resource) - .goExpand().goPath().first() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav) - .goUpExpandValidator() - // go to the expand options of the current expand - .goExpand() - .goPath().first() - .isNavProperty("NavPropertyETBaseTwoKeyNavOne", EntityTypeProvider.nameETBaseTwoKeyNav, false); - - testUri.run("ESKeyNav(1)", "$expand=NavPropertyETKeyNavMany/$ref,NavPropertyETTwoKeyNavMany($skip=2;$top=1)") - .isKind(UriInfoKind.resource) - .goExpand().first() - .goPath() - .first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .n().isRef() - .goUpExpandValidator() - .next() - .goPath() - .first().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .goUpExpandValidator() - .isSkipText("2") - .isTopText("1"); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')", "$expand=olingo.odata.test1.ETBaseTwoKeyNav" - + "/NavPropertyETTwoKeyNavMany/olingo.odata.test1.ETTwoBaseTwoKeyNav($select=PropertyString)") - .isKind(UriInfoKind.resource).goPath() - .first() - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .goUpUriValidator().goExpand().first() - .isExpandStartType(EntityTypeProvider.nameETBaseTwoKeyNav) - .goPath().first() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnCollection(EntityTypeProvider.nameETTwoBaseTwoKeyNav) - .goUpExpandValidator() - .goSelectItem(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testUri.run("ESKeyNav", "$expand=NavPropertyETKeyNavOne($expand=NavPropertyETKeyNavMany(" - + "$expand=NavPropertyETKeyNavOne))") - .isKind(UriInfoKind.resource) - .goExpand().first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .isType(EntityTypeProvider.nameETKeyNav) - .goUpExpandValidator() - .goExpand().first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, true) - .isType(EntityTypeProvider.nameETKeyNav) - .goUpExpandValidator() - .goExpand().first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .isType(EntityTypeProvider.nameETKeyNav); - - testUri.run("ESKeyNav", "$expand=NavPropertyETKeyNavOne($select=PropertyInt16)") - .isKind(UriInfoKind.resource) - .goExpand().first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .isType(EntityTypeProvider.nameETKeyNav) - .goUpExpandValidator() - .goSelectItem(0).isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.run("ESKeyNav", "$expand=NavPropertyETKeyNavOne($select=PropertyCompNav/PropertyInt16)") - .isKind(UriInfoKind.resource) - .goExpand().first() - .goPath().first() - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .isType(EntityTypeProvider.nameETKeyNav) - .goUpExpandValidator() - .goSelectItem(0) - .first().isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTNavFiveProp, false) - .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.runEx("ESKeyNav", "$expand=undefined") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - testUri.runEx("ESTwoKeyNav", "$expand=PropertyCompNav/undefined") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - testUri.runEx("ESTwoKeyNav", "$expand=PropertyCompNav/*+") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - } - - @Test - public void duplicatedSystemQueryOptionsInExpand() throws Exception { - testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($select=PropertyInt16;$select=PropertyInt16)") - .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); - - testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($filter=true;$filter=true)") - .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); - - testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($orderby=PropertyInt16;$orderby=PropertyInt16)") - .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); - - testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($levels=2;$levels=3)") - .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); - - testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($expand=*;$expand=*)") - .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); - - testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($count=true;$count=true)") - .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); - - testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($top=1;$top=1)") - .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); - - testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($skip=2;$skip=2)") - .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); - - testUri.runEx("ESKeyNav", "$expand=NavPropertyETKeyNavOne($search=Test;$search=Test)") - .isExSyntax(UriParserSyntaxException.MessageKeys.DOUBLE_SYSTEM_QUERY_OPTION); - } - - @Test - public void select() throws Exception { - testUri.run("ESTwoKeyNav", "$select=*") - .isSelectItemStar(0); - - testUri.run("ESTwoKeyNav", "$select=olingo.odata.test1.*") - .isSelectItemAllOp(0, new FullQualifiedName("olingo.odata.test1", "*")); - testUri.run("ESTwoKeyNav", "$select=Namespace1_Alias.*") - .isSelectItemAllOp(0, new FullQualifiedName("Namespace1_Alias", "*")); - - testUri.run("ESTwoKeyNav", "$select=PropertyString") - .goSelectItemPath(0).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testUri.run("ESTwoKeyNav", "$select=PropertyComp") - .goSelectItemPath(0).isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false); - - testUri.run("ESAllPrim", "$select=PropertyTimeOfDay,PropertyDate,NavPropertyETTwoPrimOne") - .isKind(UriInfoKind.resource) - .goSelectItemPath(0).first().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) - .goUpUriValidator() - .goSelectItemPath(1).first().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) - .goUpUriValidator() - .goSelectItemPath(2).first().isNavProperty("NavPropertyETTwoPrimOne", EntityTypeProvider.nameETTwoPrim, false); - - testUri.run("ESMixEnumDefCollComp", - "$select=PropertyEnumString,PropertyDefString,CollPropertyEnumString,CollPropertyDefString") - .isKind(UriInfoKind.resource) - .goSelectItemPath(0).isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpUriValidator() - .goSelectItemPath(1).isPrimitiveProperty("PropertyDefString", TypeDefinitionProvider.nameTDString, false) - .goUpUriValidator() - .goSelectItemPath(2).isPrimitiveProperty("CollPropertyEnumString", EnumTypeProvider.nameENString, true) - .goUpUriValidator() - .goSelectItemPath(3).isPrimitiveProperty("CollPropertyDefString", TypeDefinitionProvider.nameTDString, true); - - testUri.run("ESTwoKeyNav", "$select=PropertyComp/PropertyInt16") - .goSelectItemPath(0) - .first() - .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.run("ESTwoKeyNav", "$select=PropertyComp/PropertyComp") - .goSelectItemPath(0) - .first() - .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n() - .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false); - - testUri.run("ESTwoKeyNav", "$select=olingo.odata.test1.ETBaseTwoKeyNav") - .isSelectStartType(0, EntityTypeProvider.nameETBaseTwoKeyNav); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')", - "$select=olingo.odata.test1.ETBaseTwoKeyNav/PropertyInt16") - .isKind(UriInfoKind.resource).goPath() - .first() - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .goUpUriValidator() - .isSelectStartType(0, EntityTypeProvider.nameETBaseTwoKeyNav) - .goSelectItemPath(0) - .first() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='1')/PropertyCompNav", - "$select=olingo.odata.test1.CTTwoBasePrimCompNav") - .isSelectStartType(0, ComplexTypeProvider.nameCTTwoBasePrimCompNav); - - testUri.run("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTTwoBasePrimCompNav") - .goSelectItemPath(0) - .first() - .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false) - .isTypeFilter(ComplexTypeProvider.nameCTTwoBasePrimCompNav); - - testUri.run("ESTwoKeyNav", "$select=PropertyCompNav/Namespace1_Alias.CTTwoBasePrimCompNav/PropertyInt16") - .goSelectItemPath(0) - .first() - .isComplexProperty("PropertyCompNav", ComplexTypeProvider.nameCTBasePrimCompNav, false) - .isTypeFilter(ComplexTypeProvider.nameCTTwoBasePrimCompNav) - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testUri.run("ESAllPrim", "$select=olingo.odata.test1.BAESAllPrimRTETAllPrim") - .goSelectItemPath(0) - .first() - .isAction(ActionProvider.nameBAESAllPrimRTETAllPrim.getName()); - testUri.run("ESTwoKeyNav", "$select=Namespace1_Alias.BFCESTwoKeyNavRTString") - .goSelectItemPath(0) - .first() - .isFunction(FunctionProvider.nameBFCESTwoKeyNavRTString.getName()); - testUri.run("ESTwoKeyNav", "$select=olingo.odata.test1.BFCESTwoKeyNavRTStringParam(ParameterComp)") - .goSelectItemPath(0) - .first() - .isFunction(FunctionProvider.nameBFCESTwoKeyNavRTStringParam.getName()); - - testUri.runEx("ESMixPrimCollComp", "$select=wrong") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - testUri.runEx("ESMixPrimCollComp", "$select=PropertyComp/wrong") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - testUri.runEx("ESMixPrimCollComp", "$select=PropertyComp///PropertyInt16") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testUri.runEx("ESMixPrimCollComp", "$select=/PropertyInt16") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testUri.runEx("ESMixPrimCollComp", "$select=PropertyInt16+") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.1") - .isExSemantic(MessageKeys.UNKNOWN_PART); - testUri.runEx("ESTwoKeyNav", "$select=unknown_namespace.*").isExSemantic(MessageKeys.UNKNOWN_PART); - testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.ETKeyNav") - .isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER); - testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTTwoPrim") - .isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER); - testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTwrong") - .isExSemantic(MessageKeys.UNKNOWN_TYPE); - testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/.") - .isExSemantic(MessageKeys.UNKNOWN_PART); - testUri.runEx("ESTwoKeyNav", "$select=PropertyCompNav/olingo.odata.test1.CTTwoBasePrimCompNav/.") - .isExSemantic(MessageKeys.UNKNOWN_PART); - testUri.runEx("AIRT", "$select=wrong") - .isExSemantic(MessageKeys.ONLY_FOR_TYPED_PARTS); - testUri.runEx("AIRT", "$select=olingo.odata.test1.BAESAllPrimRT") - .isExSemantic(MessageKeys.ONLY_FOR_TYPED_PARTS); - testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.BFwrong") - .isExSemantic(MessageKeys.UNKNOWN_PART); - testUri.runEx("ESTwoKeyNav", "$select=olingo.odata.test1.BFCESTwoKeyNavRTStringParam()") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testUri.runEx("ESTwoKeyNav", "$select=Namespace1_Alias.BFCESTwoKeyNavRTStringParam(ParameterComp,...)") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - } - - @Test - public void top() throws Exception { - testUri.run("ESKeyNav", "$top=1") - .isKind(UriInfoKind.resource) - .goPath().isEntitySet("ESKeyNav") - .goUpUriValidator().isTopText("1"); - - testUri.run("ESKeyNav", "$top=0") - .isKind(UriInfoKind.resource) - .goPath().isEntitySet("ESKeyNav") - .goUpUriValidator().isTopText("0"); - - testUri.runEx("ESKeyNav", "$top=undefined") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - testUri.runEx("ESKeyNav", "$top=") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - testUri.runEx("ESKeyNav", "$top=-3") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - } - - @Test - public void format() throws Exception { - testUri.run("ESKeyNav(1)", "$format=atom") - .isKind(UriInfoKind.resource) - .isFormatText("atom"); - testUri.run("ESKeyNav(1)", "$format=json") - .isKind(UriInfoKind.resource) - .isFormatText("json"); - testUri.run("ESKeyNav(1)", "$format=xml") - .isKind(UriInfoKind.resource) - .isFormatText("xml"); - testUri.run("ESKeyNav(1)", "$format=IANA_content_type/must_contain_a_slash") - .isKind(UriInfoKind.resource) - .isFormatText("IANA_content_type/must_contain_a_slash"); - testUri.run("ESKeyNav(1)", "$format=Test_all_valid_signsSpecified_for_format_signs%26-._~$@%27/Aa123%26-._~$@%27") - .isKind(UriInfoKind.resource) - .isFormatText("Test_all_valid_signsSpecified_for_format_signs&-._~$@'/Aa123&-._~$@'"); - testUri.run("ESKeyNav(1)", "$format=" + ContentType.APPLICATION_ATOM_XML_ENTRY_UTF8) - .isKind(UriInfoKind.resource) - .isFormatText(ContentType.APPLICATION_ATOM_XML_ENTRY_UTF8.toContentTypeString()); - testUri.runEx("ESKeyNav(1)", "$format=noSlash") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT); - testUri.runEx("ESKeyNav(1)", "$format=slashAtEnd/") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT); - testUri.runEx("ESKeyNav(1)", "$format=/startsWithSlash") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT); - testUri.runEx("ESKeyNav(1)", "$format=two/Slashes/tooMuch") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT); - testUri.runEx("ESKeyNav(1)", "$format=") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT); - } - - @Test - public void count() throws Exception { - testUri.run("ESAllPrim", "$count=true") - .isKind(UriInfoKind.resource) - .isInlineCountText("true"); - testUri.run("ESAllPrim", "$count=false") - .isKind(UriInfoKind.resource) - .isInlineCountText("false"); - testUri.runEx("ESAllPrim", "$count=undefined") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - testUri.runEx("ESAllPrim", "$count=") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - } - - @Test - public void skip() throws Exception { - testUri.run("ESAllPrim", "$skip=3") - .isKind(UriInfoKind.resource) - .isSkipText("3"); - testUri.run("ESAllPrim", "$skip=0") - .isKind(UriInfoKind.resource) - .isSkipText("0"); - - testUri.runEx("ESAllPrim", "$skip=F") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - testUri.runEx("ESAllPrim", "$skip=") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - testUri.runEx("ESAllPrim", "$skip=-3") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - } - - @Test - public void skiptoken() throws Exception { - testUri.run("ESAllPrim", "$skiptoken=foo") - .isKind(UriInfoKind.resource) - .isSkipTokenText("foo"); - - testUri.runEx("ESAllPrim", "$skiptoken=") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - } - - @Test - public void notExistingSystemQueryOption() throws Exception { - testUri.runEx("ESAllPrim", "$wrong=error") - .isExSyntax(UriParserSyntaxException.MessageKeys.UNKNOWN_SYSTEM_QUERY_OPTION); - } - - @Test - public void misc() throws Exception { - testUri.run("") - .isKind(UriInfoKind.service); - testUri.run("/") - .isKind(UriInfoKind.service); - - testUri.run("$all") - .isKind(UriInfoKind.all); - - testUri.run("$metadata") - .isKind(UriInfoKind.metadata); - - testUri.run("$batch") - .isKind(UriInfoKind.batch); - - testUri.runEx("//").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("$metadata/").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("//$metadata").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("ESKeyNav//$count").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - - testUri.runEx("$metadata/$ref").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("$batch/$ref").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("$all/$ref").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - testUri.runEx("$entity/olingo.odata.test1.ETKeyNav/$ref") - .isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); - - testUri.runEx("$wrong").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testUri.runEx("", "$wrong").isExSyntax(UriParserSyntaxException.MessageKeys.UNKNOWN_SYSTEM_QUERY_OPTION); - - testUri.run("ESKeyNav") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESKeyNav"); - testUri.run("ESKeyNav(1)") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1"); - testUri.runEx("ESKeyNav()").isExSemantic(MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES); - - testUri.run("SINav") - .isKind(UriInfoKind.resource) - .goPath().first() - .isSingleton("SINav"); - - testUri.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')") - .isKind(UriInfoKind.resource) - .goPath() - .isFunctionImport("FICRTCollETMixPrimCollCompTwoParam") - .isType(EntityTypeProvider.nameETMixPrimCollComp) - .isParameter(0, "ParameterInt16", "1") - .isParameter(1, "ParameterString", "'2'"); - - testUri.run("FICRTETKeyNav()") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTETKeyNav") - .isType(EntityTypeProvider.nameETKeyNav); - - testUri.run("FICRTCollCTTwoPrim()") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCollCTTwoPrim") - .isType(ComplexTypeProvider.nameCTTwoPrim); - - testUri.run("FICRTCTAllPrimTwoParam(ParameterInt16=1,ParameterString='2')") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCTAllPrimTwoParam") - .isType(ComplexTypeProvider.nameCTAllPrim) - .isParameter(0, "ParameterInt16", "1") - .isParameter(1, "ParameterString", "'2'"); - - testUri.run("FICRTCollStringTwoParam(ParameterInt16=1,ParameterString='2')") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTCollStringTwoParam") - .isType(PropertyProvider.nameString) - .isParameter(0, "ParameterInt16", "1") - .isParameter(1, "ParameterString", "'2'"); - - testUri.run("FICRTStringTwoParam(ParameterInt16=1)") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTStringTwoParam") - .isFunction("UFCRTStringTwoParam") - .isType(PropertyProvider.nameString) - .isParameter(0, "ParameterInt16", "1"); - - testUri.run("FICRTStringTwoParam(ParameterInt16=1,ParameterString='2')") - .isKind(UriInfoKind.resource) - .goPath().first() - .isFunctionImport("FICRTStringTwoParam") - .isFunction("UFCRTStringTwoParam") - .isType(PropertyProvider.nameString) - .isParameter(0, "ParameterInt16", "1"); - - testUri.run(ContainerProvider.AIRT_STRING) - .isKind(UriInfoKind.resource) - .goPath().first() - .isActionImport(ContainerProvider.AIRT_STRING); - - testUri.run(ContainerProvider.AIRT_COLL_ES_ALL_PRIM_PARAM) - .isKind(UriInfoKind.resource) - .goPath().first() - .isActionImport(ContainerProvider.AIRT_COLL_ES_ALL_PRIM_PARAM); - - testUri.run(ContainerProvider.AIRT) - .isKind(UriInfoKind.resource) - .goPath().first() - .isActionImport(ContainerProvider.AIRT); - - testUri.run("ESKeyNav/$count") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESKeyNav") - .n().isCount(); - - testUri.run("ESKeyNav/$ref") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESKeyNav") - .n().isRef(); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESTwoKeyNav") - .n().isFunction("BFC_RTESTwoKeyNav_"); - - testUri.run("ESAllPrim/olingo.odata.test1.BAESAllPrimRTETAllPrim") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESAllPrim") - .n().isAction("BAESAllPrimRTETAllPrim"); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESTwoKeyNav") - .n().isFunction("BFC_RTESTwoKeyNav_"); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESTwoKeyNav") - .isTypeFilterOnCollection(EntityTypeProvider.nameETBaseTwoKeyNav); - - testUri.run("ESTwoKeyNav/$count") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESTwoKeyNav") - .n() - .isCount(); - - testUri.run("ESTwoKeyNav/$ref") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESTwoKeyNav") - .n() - .isRef(); - - testUri.run("ESKeyNav(1)") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1"); - - testUri.run("ESKeyNav(1)/$ref") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isRef(); - - testUri.run("ESMedia(1)/$value") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESMedia") - .n() - .isValue(); - - testUri.run("ESAllPrim/olingo.odata.test1.BAESAllPrimRTETAllPrim") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESAllPrim") - .n().isAction("BAESAllPrimRTETAllPrim"); - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESTwoKeyNav") - .n().isFunction("BFC_RTESTwoKeyNav_"); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav); - - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav/$ref") - .isKind(UriInfoKind.resource) - .goPath().first() - .isEntitySet("ESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .n().isRef(); - } - - @Test - public void filter() throws Exception { - testFilter.runOnETAllPrim("PropertyBoolean") - .is("") - .isType(PropertyProvider.nameBoolean); - - testFilter.runOnETTwoKeyNav("PropertyComp/PropertyInt16 gt 0") - .is("< gt <0>>") - .left().isType(PropertyProvider.nameInt16); - - testFilter.runOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyDate ne null") - .is("< ne >") - .left().isType(PropertyProvider.nameDate); - - testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne eq null") - .is("< eq >") - .left().isType(EntityTypeProvider.nameETTwoKeyNav); - - testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyString eq ''") - .is("< eq <''>>") - .left().isType(PropertyProvider.nameString); - - testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComp eq null") - .is("< eq >") - .left().isType(ComplexTypeProvider.nameCTPrimComp); - - testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComp/PropertyComp eq null") - .is("< eq >") - .left().isType(ComplexTypeProvider.nameCTAllPrim); - - testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/PropertyComp/PropertyInt16 eq 1") - .is("< eq <1>>") - .left().isType(PropertyProvider.nameInt16) - .root().right().isLiteral("1"); - - testFilter.runOnETTwoKeyNav("NavPropertyETKeyNavMany(1)/NavPropertyETTwoKeyNavMany(PropertyString='2')/" - + "PropertyString eq 'SomeString'") - .is("< eq <'SomeString'>>") - .left() - .isType(PropertyProvider.nameString) - .isMember().goPath() - .first() - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .n() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicateRef(0, "PropertyInt16", "PropertyInt16") - .isKeyPredicate(1, "PropertyString", "'2'") - .n() - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .goUpFilterValidator() - .root().right(); - - testFilter.runOnETTwoKeyNav("olingo.odata.test1.ETBaseTwoKeyNav/PropertyDate eq 2013-11-12") - .is("< eq <2013-11-12>>") - .left() - .isType(PropertyProvider.nameDate) - .isMember().isMemberStartType(EntityTypeProvider.nameETBaseTwoKeyNav).goPath() - .first().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) - .goUpFilterValidator() - .root().right() - .isLiteral("2013-11-12"); - - testFilter.runOnCTTwoPrim("olingo.odata.test1.CTBase/AdditionalPropString eq 'SomeString'") - .is("< eq <'SomeString'>>") - .left() - .isType(PropertyProvider.nameString) - .isMember().isMemberStartType(ComplexTypeProvider.nameCTBase).goPath() - .first().isPrimitiveProperty("AdditionalPropString", PropertyProvider.nameString, false) - .goUpFilterValidator() - .root().right() - .isLiteral("'SomeString'"); - - testFilter - .runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/olingo.odata.test1.ETBaseTwoKeyNav/PropertyDate eq 2013-11-12") - .is("< eq <2013-11-12>>") - .left() - .isType(PropertyProvider.nameDate) - .root().right() - .isLiteral("2013-11-12"); - - testFilter - .runOnETTwoKeyNav("PropertyCompTwoPrim/olingo.odata.test1.CTTwoBase/AdditionalPropString eq 'SomeString'") - .is("< eq <'SomeString'>>") - .left() - .isType(PropertyProvider.nameString) - .root().right() - .isLiteral("'SomeString'"); - - testFilter.runOnETTwoKeyNavEx("invalid").isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - testFilter.runOnETTwoKeyNavEx("PropertyComp").isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); - testFilter.runOnETTwoKeyNavEx("PropertyComp/invalid").isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - testFilter.runOnETTwoKeyNavEx("concat('a','b')/invalid").isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); - testFilter.runOnETTwoKeyNavEx("PropertyComp/concat('a','b')") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - testFilter.runOnETTwoKeyNavEx("PropertyComp/PropertyInt16 eq '1'") - .isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); - testFilter.runOnETTwoKeyNavEx("PropertyComp/PropertyComp/PropertyDate eq 1") - .isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); - testFilter.runOnETTwoKeyNavEx("PropertyComp/PropertyComp/PropertyString eq 1") - .isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); - testFilter.runOnETTwoKeyNavEx("PropertyComp/PropertyInt64 eq 1") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - testFilter.runOnETTwoKeyNavEx("NavPropertyETKeyNavMany/PropertyInt16 gt 42") - .isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); - testFilter.runOnETTwoKeyNavEx("NavPropertyETKeyNavMany/NavPropertyETTwoKeyNavOne eq null") - .isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); - } - - @Test - public void filterBinaryOperators() throws Exception { - testFilter.runOnETAllPrim("PropertySByte eq PropertySByte") - .is("< eq >") - .isBinary(BinaryOperatorKind.EQ) - .left().isType(PropertyProvider.nameSByte) - .root().right().isType(PropertyProvider.nameSByte); - - testFilter.runOnETAllPrim("PropertySByte ne PropertySByte") - .is("< ne >") - .isBinary(BinaryOperatorKind.NE) - .left().isType(PropertyProvider.nameSByte) - .root().right().isType(PropertyProvider.nameSByte); - - testFilter.runOnETAllPrim("PropertySByte add PropertySByte gt 0") - .is("<< add > gt <0>>") - .left().left().isType(PropertyProvider.nameSByte) - .root().left().right().isType(PropertyProvider.nameSByte); - - testFilter.runOnETAllPrim("PropertyByte add PropertyByte gt 0") - .is("<< add > gt <0>>") - .left().left().isType(PropertyProvider.nameByte) - .root().left().right().isType(PropertyProvider.nameByte); - testFilter.runOnETAllPrim("PropertyInt16 add PropertyInt16 gt 0") - .is("<< add > gt <0>>") - .left().left().isType(PropertyProvider.nameInt16) - .root().left().right().isType(PropertyProvider.nameInt16); - testFilter.runOnETAllPrim("PropertyInt32 add PropertyInt32 gt 0") - .is("<< add > gt <0>>") - .left().left().isType(PropertyProvider.nameInt32) - .root().left().right().isType(PropertyProvider.nameInt32); - testFilter.runOnETAllPrim("PropertyInt64 add PropertyInt64 gt 0") - .is("<< add > gt <0>>") - .left().left().isType(PropertyProvider.nameInt64) - .root().left().right().isType(PropertyProvider.nameInt64); - testFilter.runOnETAllPrim("PropertySingle add PropertySingle gt 0") - .is("<< add > gt <0>>") - .left().left().isType(PropertyProvider.nameSingle) - .root().left().right().isType(PropertyProvider.nameSingle); - testFilter.runOnETAllPrim("PropertyDouble add PropertyDouble gt 0") - .is("<< add > gt <0>>") - .left().left().isType(PropertyProvider.nameDouble) - .root().left().right().isType(PropertyProvider.nameDouble); - testFilter.runOnETAllPrim("PropertyDecimal add PropertyDecimal gt 0") - .is("<< add > gt <0>>") - .left().left().isType(PropertyProvider.nameDecimal) - .root().left().right().isType(PropertyProvider.nameDecimal); - testFilter.runOnETAllPrim("PropertySByte add PropertyDecimal gt 0") - .is("<< add > gt <0>>") - .left().left().isType(PropertyProvider.nameSByte) - .root().left().right().isType(PropertyProvider.nameDecimal); - testFilter.runOnETAllPrim("PropertySByte add PropertyInt32 gt 0") - .is("<< add > gt <0>>") - .left().left().isType(PropertyProvider.nameSByte) - .root().left().right().isType(PropertyProvider.nameInt32); - testFilter.runOnETAllPrim("PropertySByte add PropertyInt64 gt 0") - .is("<< add > gt <0>>") - .left().left().isType(PropertyProvider.nameSByte) - .root().left().right().isType(PropertyProvider.nameInt64); - testFilter.runOnETAllPrim("PropertyDateTimeOffset add PropertyDuration ne null") - .is("<< add > ne >") - .left().left().isType(PropertyProvider.nameDateTimeOffset) - .root().left().right().isType(PropertyProvider.nameDuration); - testFilter.runOnETAllPrim("PropertyDuration add PropertyDuration ne null") - .is("<< add > ne >") - .left().left().isType(PropertyProvider.nameDuration) - .root().left().right().isType(PropertyProvider.nameDuration); - testFilter.runOnETAllPrim("PropertyDate add PropertyDuration ne null") - .is("<< add > ne >") - .left().left().isType(PropertyProvider.nameDate) - .root().left().right().isType(PropertyProvider.nameDuration); - testFilter.runOnETAllPrim("PropertySByte sub PropertySByte gt 0") - .is("<< sub > gt <0>>") - .left().left().isType(PropertyProvider.nameSByte) - .root().left().right().isType(PropertyProvider.nameSByte); - testFilter.runOnETAllPrim("PropertyByte sub PropertyByte gt 0") - .is("<< sub > gt <0>>") - .left().left().isType(PropertyProvider.nameByte) - .root().left().right().isType(PropertyProvider.nameByte); - testFilter.runOnETAllPrim("PropertyInt16 sub PropertyInt16 gt 0") - .is("<< sub > gt <0>>") - .left().left().isType(PropertyProvider.nameInt16) - .root().left().right().isType(PropertyProvider.nameInt16); - testFilter.runOnETAllPrim("PropertyInt32 sub PropertyInt32 gt 0") - .is("<< sub > gt <0>>") - .left().left().isType(PropertyProvider.nameInt32) - .root().left().right().isType(PropertyProvider.nameInt32); - testFilter.runOnETAllPrim("PropertyInt64 sub PropertyInt64 gt 0") - .is("<< sub > gt <0>>") - .left().left().isType(PropertyProvider.nameInt64) - .root().left().right().isType(PropertyProvider.nameInt64); - testFilter.runOnETAllPrim("PropertySingle sub PropertySingle gt 0") - .is("<< sub > gt <0>>") - .left().left().isType(PropertyProvider.nameSingle) - .root().left().right().isType(PropertyProvider.nameSingle); - testFilter.runOnETAllPrim("PropertyDouble sub PropertyDouble gt 0") - .is("<< sub > gt <0>>") - .left().left().isType(PropertyProvider.nameDouble) - .root().left().right().isType(PropertyProvider.nameDouble); - testFilter.runOnETAllPrim("PropertyDecimal sub PropertyDecimal gt 0") - .is("<< sub > gt <0>>") - .left().left().isType(PropertyProvider.nameDecimal) - .root().left().right().isType(PropertyProvider.nameDecimal); - testFilter.runOnETAllPrim("PropertyDecimal sub PropertyInt32 gt 0") - .is("<< sub > gt <0>>") - .left().left().isType(PropertyProvider.nameDecimal) - .root().left().right().isType(PropertyProvider.nameInt32); - testFilter.runOnETAllPrim("PropertyDecimal sub PropertyInt64 gt 0") - .is("<< sub > gt <0>>") - .left().left().isType(PropertyProvider.nameDecimal) - .root().left().right().isType(PropertyProvider.nameInt64); - testFilter.runOnETAllPrim("PropertyDecimal sub PropertyByte gt 0") - .is("<< sub > gt <0>>") - .left().left().isType(PropertyProvider.nameDecimal) - .root().left().right().isType(PropertyProvider.nameByte); - testFilter.runOnETAllPrim("PropertyDateTimeOffset sub PropertyDuration ne null") - .is("<< sub > ne >") - .left().left().isType(PropertyProvider.nameDateTimeOffset) - .root().left().right().isType(PropertyProvider.nameDuration); - testFilter.runOnETAllPrim("PropertyDuration sub PropertyDuration ne null") - .is("<< sub > ne >") - .left().left().isType(PropertyProvider.nameDuration) - .root().left().right().isType(PropertyProvider.nameDuration); - testFilter.runOnETAllPrim("PropertyDateTimeOffset sub PropertyDateTimeOffset ne null") - .is("<< sub > ne >") - .left().left().isType(PropertyProvider.nameDateTimeOffset) - .root().left().right().isType(PropertyProvider.nameDateTimeOffset); - testFilter.runOnETAllPrim("PropertyDate sub PropertyDuration ne null") - .is("<< sub > ne >") - .left().left().isType(PropertyProvider.nameDate) - .root().left().right().isType(PropertyProvider.nameDuration); - testFilter.runOnETAllPrim("PropertyDate sub PropertyDate ne null") - .is("<< sub > ne >") - .left().left().isType(PropertyProvider.nameDate) - .root().left().right().isType(PropertyProvider.nameDate); - testFilter.runOnETAllPrim("PropertySByte mul PropertySByte gt 0") - .is("<< mul > gt <0>>") - .left().left().isType(PropertyProvider.nameSByte) - .root().left().right().isType(PropertyProvider.nameSByte); - testFilter.runOnETAllPrim("PropertyByte mul PropertyByte gt 0") - .is("<< mul > gt <0>>") - .left().left().isType(PropertyProvider.nameByte) - .root().left().right().isType(PropertyProvider.nameByte); - testFilter.runOnETAllPrim("PropertyInt16 mul PropertyInt16 gt 0") - .is("<< mul > gt <0>>") - .left().left().isType(PropertyProvider.nameInt16) - .root().left().right().isType(PropertyProvider.nameInt16); - testFilter.runOnETAllPrim("PropertyInt32 mul PropertyInt32 gt 0") - .is("<< mul > gt <0>>") - .left().left().isType(PropertyProvider.nameInt32) - .root().left().right().isType(PropertyProvider.nameInt32); - testFilter.runOnETAllPrim("PropertyInt64 mul PropertyInt64 gt 0") - .is("<< mul > gt <0>>") - .left().left().isType(PropertyProvider.nameInt64) - .root().left().right().isType(PropertyProvider.nameInt64); - testFilter.runOnETAllPrim("PropertySingle mul PropertySingle gt 0") - .is("<< mul > gt <0>>") - .left().left().isType(PropertyProvider.nameSingle) - .root().left().right().isType(PropertyProvider.nameSingle); - testFilter.runOnETAllPrim("PropertyDouble mul PropertyDouble gt 0") - .is("<< mul > gt <0>>") - .left().left().isType(PropertyProvider.nameDouble) - .root().left().right().isType(PropertyProvider.nameDouble); - testFilter.runOnETAllPrim("PropertyDecimal mul PropertyDecimal gt 0") - .is("<< mul > gt <0>>") - .left().left().isType(PropertyProvider.nameDecimal) - .root().left().right().isType(PropertyProvider.nameDecimal); - testFilter.runOnETAllPrim("PropertyInt64 mul PropertyInt32 gt 0") - .is("<< mul > gt <0>>") - .left().left().isType(PropertyProvider.nameInt64) - .root().left().right().isType(PropertyProvider.nameInt32); - testFilter.runOnETAllPrim("PropertyInt64 mul PropertySByte gt 0") - .is("<< mul > gt <0>>") - .left().left().isType(PropertyProvider.nameInt64) - .root().left().right().isType(PropertyProvider.nameSByte); - testFilter.runOnETAllPrim("PropertyInt64 mul PropertyDecimal gt 0") - .is("<< mul > gt <0>>") - .left().left().isType(PropertyProvider.nameInt64) - .root().left().right().isType(PropertyProvider.nameDecimal); - testFilter.runOnETAllPrim("PropertySByte div PropertySByte gt 0") - .is("<< div > gt <0>>") - .left().left().isType(PropertyProvider.nameSByte) - .root().left().right().isType(PropertyProvider.nameSByte); - testFilter.runOnETAllPrim("PropertyByte div PropertyByte gt 0") - .is("<< div > gt <0>>") - .left().left().isType(PropertyProvider.nameByte) - .root().left().right().isType(PropertyProvider.nameByte); - testFilter.runOnETAllPrim("PropertyInt16 div PropertyInt16 gt 0") - .is("<< div > gt <0>>") - .left().left().isType(PropertyProvider.nameInt16) - .root().left().right().isType(PropertyProvider.nameInt16); - testFilter.runOnETAllPrim("PropertyInt32 div PropertyInt32 gt 0") - .is("<< div > gt <0>>") - .left().left().isType(PropertyProvider.nameInt32) - .root().left().right().isType(PropertyProvider.nameInt32); - testFilter.runOnETAllPrim("PropertyInt64 div PropertyInt64 gt 0") - .is("<< div > gt <0>>") - .left().left().isType(PropertyProvider.nameInt64) - .root().left().right().isType(PropertyProvider.nameInt64); - testFilter.runOnETAllPrim("PropertySingle div PropertySingle gt 0") - .is("<< div > gt <0>>") - .left().left().isType(PropertyProvider.nameSingle) - .root().left().right().isType(PropertyProvider.nameSingle); - testFilter.runOnETAllPrim("PropertyDouble div PropertyDouble gt 0") - .is("<< div > gt <0>>") - .left().left().isType(PropertyProvider.nameDouble) - .root().left().right().isType(PropertyProvider.nameDouble); - testFilter.runOnETAllPrim("PropertyDecimal div PropertyDecimal gt 0") - .is("<< div > gt <0>>") - .left().left().isType(PropertyProvider.nameDecimal) - .root().left().right().isType(PropertyProvider.nameDecimal); - testFilter.runOnETAllPrim("PropertyByte div PropertyInt32 gt 0") - .is("<< div > gt <0>>") - .left().left().isType(PropertyProvider.nameByte) - .root().left().right().isType(PropertyProvider.nameInt32); - testFilter.runOnETAllPrim("PropertyByte div PropertyDecimal gt 0") - .is("<< div > gt <0>>") - .left().left().isType(PropertyProvider.nameByte) - .root().left().right().isType(PropertyProvider.nameDecimal); - testFilter.runOnETAllPrim("PropertyByte div PropertySByte gt 0") - .is("<< div > gt <0>>") - .left().left().isType(PropertyProvider.nameByte) - .root().left().right().isType(PropertyProvider.nameSByte); - - testFilter.runOnETAllPrim("PropertyByte div 0 gt 0") - .is("<< div <0>> gt <0>>"); - - testFilter.runOnETAllPrim("0 div 0 gt 0") - .is("<<<0> div <0>> gt <0>>"); - - testFilter.runOnETAllPrim("PropertySByte mod PropertySByte gt 0") - .is("<< mod > gt <0>>") - .left().left().isType(PropertyProvider.nameSByte) - .root().left().right().isType(PropertyProvider.nameSByte); - testFilter.runOnETAllPrim("PropertyByte mod PropertyByte gt 0") - .is("<< mod > gt <0>>") - .left().left().isType(PropertyProvider.nameByte) - .root().left().right().isType(PropertyProvider.nameByte); - testFilter.runOnETAllPrim("PropertyInt16 mod PropertyInt16 gt 0") - .is("<< mod > gt <0>>") - .left().left().isType(PropertyProvider.nameInt16) - .root().left().right().isType(PropertyProvider.nameInt16); - testFilter.runOnETAllPrim("PropertyInt32 mod PropertyInt32 gt 0") - .is("<< mod > gt <0>>") - .left().left().isType(PropertyProvider.nameInt32) - .root().left().right().isType(PropertyProvider.nameInt32); - testFilter.runOnETAllPrim("PropertyInt64 mod PropertyInt64 gt 0") - .is("<< mod > gt <0>>") - .left().left().isType(PropertyProvider.nameInt64) - .root().left().right().isType(PropertyProvider.nameInt64); - testFilter.runOnETAllPrim("PropertySingle mod PropertySingle gt 0") - .is("<< mod > gt <0>>") - .left().left().isType(PropertyProvider.nameSingle) - .root().left().right().isType(PropertyProvider.nameSingle); - testFilter.runOnETAllPrim("PropertyDouble mod PropertyDouble gt 0") - .is("<< mod > gt <0>>") - .left().left().isType(PropertyProvider.nameDouble) - .root().left().right().isType(PropertyProvider.nameDouble); - testFilter.runOnETAllPrim("PropertyDecimal mod PropertyDecimal gt 0") - .is("<< mod > gt <0>>") - .left().left().isType(PropertyProvider.nameDecimal) - .root().left().right().isType(PropertyProvider.nameDecimal); - - testFilter.runOnETAllPrim("PropertyDecimal ge PropertyDecimal") - .is("< ge >") - .isBinary(BinaryOperatorKind.GE) - .left().isType(PropertyProvider.nameDecimal) - .root().right().isType(PropertyProvider.nameDecimal); - testFilter.runOnETAllPrim("PropertyDecimal lt PropertyDecimal") - .is("< lt >") - .isBinary(BinaryOperatorKind.LT) - .left().isType(PropertyProvider.nameDecimal) - .root().right().isType(PropertyProvider.nameDecimal); - testFilter.runOnETAllPrim("PropertyDecimal le PropertyDecimal") - .is("< le >") - .isBinary(BinaryOperatorKind.LE) - .left().isType(PropertyProvider.nameDecimal) - .root().right().isType(PropertyProvider.nameDecimal); - - // Numeric promotion: Double is considered the widest type. - testFilter.runOnETAllPrim("PropertyDecimal ne NaN") - .right().isLiteral("NaN").isType(PropertyProvider.nameDouble); - testFilter.runOnETAllPrim("PropertyDecimal gt -INF") - .right().isLiteral("-INF").isType(PropertyProvider.nameDouble); - testFilter.runOnETAllPrim("PropertyDecimal lt INF") - .right().isLiteral("INF").isType(PropertyProvider.nameDouble); - } - - @Test - public void filterProperties() throws Exception { - testFilter.runOnETAllPrim("PropertyBoolean eq true") - .is("< eq >") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyBoolean", PropertyProvider.nameBoolean, false) - .goUpFilterValidator() - .root().right().isLiteral("true"); - - testFilter.runOnETAllPrim("PropertyDecimal eq 1.25") - .is("< eq <1.25>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyDecimal", PropertyProvider.nameDecimal, false) - .goUpFilterValidator() - .root().right().isLiteral("1.25"); - - testFilter.runOnETAllPrim("PropertyDouble eq 1.5") - .is("< eq <1.5>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyDouble", PropertyProvider.nameDouble, false) - .goUpFilterValidator() - .root().right().isLiteral("1.5"); - - testFilter.runOnETAllPrim("PropertySingle eq 1.5") - .is("< eq <1.5>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertySingle", PropertyProvider.nameSingle, false) - .goUpFilterValidator() - .root().right().isLiteral("1.5"); - - testFilter.runOnETAllPrim("PropertySByte eq -128") - .is("< eq <-128>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertySByte", PropertyProvider.nameSByte, false) - .goUpFilterValidator() - .root().right().isLiteral("-128"); - - testFilter.runOnETAllPrim("PropertyByte eq 255") - .is("< eq <255>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyByte", - PropertyProvider.nameByte, false).goUpFilterValidator() - .root().right().isLiteral("255"); - - testFilter.runOnETAllPrim("PropertyInt16 eq 32767") - .is("< eq <32767>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .goUpFilterValidator() - .root().right().isLiteral("32767"); - - testFilter.runOnETAllPrim("PropertyInt32 eq 2147483647") - .is("< eq <2147483647>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyInt32", PropertyProvider.nameInt32, false) - .goUpFilterValidator() - .root().right().isLiteral("2147483647"); - - testFilter.runOnETAllPrim("PropertyInt64 eq 9223372036854775807") - .is("< eq <9223372036854775807>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyInt64", PropertyProvider.nameInt64, false) - .goUpFilterValidator() - .root().right().isLiteral("9223372036854775807"); - - testFilter.runOnETAllPrim("PropertyDate eq 2013-09-25") - .is("< eq <2013-09-25>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) - .goUpFilterValidator() - .root().right().isLiteral("2013-09-25"); - - testFilter.runOnETAllPrim("PropertyDateTimeOffset eq 2013-09-25T12:34:56.123456789012-10:24") - .is("< eq <2013-09-25T12:34:56.123456789012-10:24>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath() - .isPrimitiveProperty("PropertyDateTimeOffset", PropertyProvider.nameDateTimeOffset, false) - .goUpFilterValidator() - .root().right().isLiteral("2013-09-25T12:34:56.123456789012-10:24"); - - testFilter.runOnETAllPrim("PropertyDuration eq duration'P10DT5H34M21.123456789012S'") - .is("< eq >") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyDuration", PropertyProvider.nameDuration, false) - .goUpFilterValidator() - .root().right().isLiteral("duration'P10DT5H34M21.123456789012S'"); - - testFilter.runOnETAllPrim("PropertyGuid eq 005056A5-09B1-1ED3-89BD-FB81372CCB33") - .is("< eq <005056A5-09B1-1ED3-89BD-FB81372CCB33>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyGuid", PropertyProvider.nameGuid, false) - .goUpFilterValidator() - .root().right().isLiteral("005056A5-09B1-1ED3-89BD-FB81372CCB33"); - - testFilter.runOnETAllPrim("PropertyString eq 'somestring'") - .is("< eq <'somestring'>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .goUpFilterValidator() - .root().right().isLiteral("'somestring'"); - - testFilter.runOnETAllPrim("PropertyTimeOfDay eq 12:34:55.12345678901") - .is("< eq <12:34:55.12345678901>>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) - .goUpFilterValidator() - .root().right().isLiteral("12:34:55.12345678901"); - - testFilter.runOnETMixEnumDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String1'") - .is("< eq >>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); - - testFilter.runOnETMixEnumDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String2'") - .is("< eq >>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String2")); - - testFilter.runOnETMixEnumDefCollComp( - "PropertyCompMixedEnumDef/PropertyEnumString eq olingo.odata.test1.ENString'String3'") - .is("< eq >>") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath() - .first().isComplex("PropertyCompMixedEnumDef") - .n().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String3")); - - testFilter - .runOnETMixEnumDefCollComp( - "PropertyCompMixedEnumDef/PropertyEnumString eq " + - "PropertyCompMixedEnumDef/PropertyEnumString") - .is("< eq " + - ">") - .isBinary(BinaryOperatorKind.EQ) - .root().left().goPath() - .first().isComplex("PropertyCompMixedEnumDef") - .n().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .root().right().goPath() - .first().isComplex("PropertyCompMixedEnumDef") - .n().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false); - - testFilter.runOnETAllPrim("PropertyByte mod 0 gt 0") - .is("<< mod <0>> gt <0>>"); - } - - @Test - public void filterFunctions() throws Exception { - testFilter.runOnETAllPrim( - "olingo.odata.test1.UFCRTETTwoKeyNavParamCTTwoPrim(ParameterCTTwoPrim=@ParamAlias) eq null" - + "&@ParamAlias={}") - .is("< eq >") - .left().goPath() - .first() - .isFunction("UFCRTETTwoKeyNavParamCTTwoPrim") - .isParameterAlias(0, "ParameterCTTwoPrim", "@ParamAlias"); - - testFilter.runOnETTwoKeyNav("PropertyComp/olingo.odata.test1.BFCCTPrimCompRTETTwoKeyNavParam" - + "(ParameterString=PropertyComp/PropertyComp/PropertyString)/PropertyString eq 'SomeString'") - .is("< eq <'SomeString'>>") - .root().left().goPath() - .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n().isFunction("BFCCTPrimCompRTETTwoKeyNavParam") - .goParameter(0).isMember() - .goPath() - .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .goUpFilterValidator().goUpToResourceValidator() - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETTwoKeyNav("PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESTwoKeyNav()" - + "(PropertyInt16=1,PropertyString='2')/PropertyString eq 'SomeString'") - .is("< eq <'SomeString'>>") - .root().left().goPath() - .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n().isFunction("BFCCTPrimCompRTESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETTwoKeyNav("PropertyComp/olingo.odata.test1.BFCCTPrimCompRTETTwoKeyNavParam" - + "(ParameterString='1')/PropertyString eq 'SomeString'") - .is("< eq <'SomeString'>>") - .root().left().goPath() - .first() - .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n() - .isFunction("BFCCTPrimCompRTETTwoKeyNavParam") - .isParameter(0, "ParameterString", "'1'") - .n() - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavMany/olingo.odata.test1.BFCESTwoKeyNavRTString()" - + " eq 'SomeString'") - .is("< eq <'SomeString'>>") - .root().left().goPath() - .first() - .isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .n().isFunction("BFCESTwoKeyNavRTString"); - - testFilter.runOnETKeyNav("$it/olingo.odata.test1.BFCETKeyNavRTETKeyNav()/PropertyString eq 'SomeString'") - .is("<<$it/BFCETKeyNavRTETKeyNav/PropertyString> eq <'SomeString'>>") - .root().left().goPath() - .first().isIt() - .n().isFunction("BFCETKeyNavRTETKeyNav") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETTwoKeyNav("olingo.odata.test1.BFCESTwoKeyNavRTCTTwoPrim()/PropertyString eq 'SomeString'") - .is("< eq <'SomeString'>>") - .root().left().goPath() - .first().isFunction("BFCESTwoKeyNavRTCTTwoPrim") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavOne/olingo.odata.test1.BFCETTwoKeyNavRTETTwoKeyNav()" - + "/PropertyComp/PropertyComp/PropertyString eq 'Walldorf'") - .is("< " - + "eq <'Walldorf'>>") - .root().left().goPath() - .first().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .n().isFunction("BFCETTwoKeyNavRTETTwoKeyNav") - .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETTwoKeyNav("PropertyComp/olingo.odata.test1.BFCCTPrimCompRTESTwoKeyNav()" - + "/olingo.odata.test1.ETBaseTwoKeyNav(PropertyInt16=2,PropertyString='3')/PropertyString eq 'SomeString'") - .is("< " - + "eq <'SomeString'>>") - .root().left().goPath() - .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n().isFunction("BFCCTPrimCompRTESTwoKeyNav") - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .isKeyPredicate(0, "PropertyInt16", "2") - .isKeyPredicate(1, "PropertyString", "'3'") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETTwoKeyNavSingle("$it/olingo.odata.test1.BFCETTwoKeyNavRTCTTwoPrim()/olingo.odata.test1.CTBase" - + "/PropertyString eq 'SomeString'") - .is("<<$it/BFCETTwoKeyNavRTCTTwoPrim/olingo.odata.test1.CTBase/PropertyString> eq <'SomeString'>>") - .root().left().goPath() - .first() - .isIt() - .n() - .isFunction("BFCETTwoKeyNavRTCTTwoPrim") - .isTypeFilterOnEntry(ComplexTypeProvider.nameCTBase) - .n() - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETTwoKeyNav("olingo.odata.test1.UFCRTETTwoKeyNavParam(ParameterInt16=1)/PropertyInt16 eq 2") - .is("< eq <2>>") - .root().left().goPath() - .first() - .isFunction("UFCRTETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testFilter.runOnETTwoKeyNav("olingo.odata.test1.UFCRTETTwoKeyNavParam(ParameterInt16=@Param1Alias)" - + "/PropertyInt16 eq 2" - + "&@Param1Alias=1") - .root().left().goPath() - .first() - .isFunction("UFCRTETTwoKeyNavParam") - .isParameterAlias(0, "ParameterInt16", "@Param1Alias") - .n() - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testFilter.runOnETTwoKeyNav("olingo.odata.test1.UFCRTETTwoKeyNavParam(ParameterInt16=1)" - + "/PropertyComp/PropertyComp/PropertyString eq 'SomeString'") - .root().left().goPath() - .first() - .isFunction("UFCRTETTwoKeyNavParam") - .isParameter(0, "ParameterInt16", "1") - .n() - .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n() - .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) - .n() - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETTwoKeyNav("olingo.odata.test1.UFCRTETTwoKeyNavParam(ParameterInt16=PropertyInt16)" - + "/PropertyComp/PropertyComp/PropertyString eq 'SomeString'") - .root().left().goPath() - .first() - .isFunction("UFCRTETTwoKeyNavParam") - .goParameter(0) - .isMember().goPath().first().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .goUpFilterValidator().goUpToResourceValidator() - .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETTwoKeyNavEx("olingo.odata.test1.UFCRTETTwoKeyNavParam(ParameterInt16=@alias)") - .isExValidation(UriValidationException.MessageKeys.MISSING_ALIAS); - } - - @Test - public void methods() throws Exception { - testFilter.runOnETKeyNav("indexof(PropertyString,'47') eq 5") - .is("<,<'47'>)> eq <5>>") - .left() - .isMethod(MethodKind.INDEXOF, 2) - .isParameterText(0, "") - .isParameterText(1, "<'47'>"); - - testFilter.runOnETKeyNav("tolower(PropertyString) eq 'foo'") - .is("<)> eq <'foo'>>") - .left() - .isMethod(MethodKind.TOLOWER, 1) - .isParameterText(0, ""); - - testFilter.runOnETKeyNav("toupper(PropertyString) eq 'FOO'") - .is("<)> eq <'FOO'>>") - .left() - .isMethod(MethodKind.TOUPPER, 1) - .isParameterText(0, ""); - - testFilter.runOnETKeyNav("trim(PropertyString) eq 'fooba'") - .is("<)> eq <'fooba'>>") - .left() - .isMethod(MethodKind.TRIM, 1) - .isParameterText(0, ""); - - testFilter.runOnETKeyNav("substring(PropertyString,4) eq 'foo'") - .is("<,<4>)> eq <'foo'>>") - .left() - .isMethod(MethodKind.SUBSTRING, 2) - .isParameterText(0, "") - .isParameterText(1, "<4>"); - - testFilter.runOnETKeyNav("substring(PropertyString,4) eq 'foo'") - .is("<,<4>)> eq <'foo'>>") - .left() - .isMethod(MethodKind.SUBSTRING, 2) - .isParameterText(0, "") - .isParameterText(1, "<4>"); - - testFilter.runOnETKeyNav("substring(PropertyString,2,4) eq 'foo'") - .is("<,<2>,<4>)> eq <'foo'>>") - .left() - .isMethod(MethodKind.SUBSTRING, 3) - .isParameterText(0, "") - .isParameterText(1, "<2>") - .isParameterText(2, "<4>"); - - testFilter.runOnETKeyNav("concat(PropertyString,PropertyCompTwoPrim/PropertyString) eq 'foo'") - .is("<,)> eq <'foo'>>") - .left() - .isMethod(MethodKind.CONCAT, 2) - .isParameterText(0, "") - .isParameterText(1, ""); - - testFilter.runOnETKeyNav("concat(PropertyString,'bar') eq 'foobar'") - .is("<,<'bar'>)> eq <'foobar'>>") - .left() - .isMethod(MethodKind.CONCAT, 2) - .isParameterText(0, "") - .isParameterText(1, "<'bar'>"); - - testFilter.runOnETKeyNav("concat(PropertyString,'bar') eq 'foobar'") - .is("<,<'bar'>)> eq <'foobar'>>") - .left() - .isMethod(MethodKind.CONCAT, 2) - .isParameterText(0, "") - .isParameterText(1, "<'bar'>"); - - testFilter.runOnETKeyNav("length(PropertyString) eq 32") - .is("<)> eq <32>>") - .left() - .isMethod(MethodKind.LENGTH, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("year(PropertyDate) eq 2013") - .is("<)> eq <2013>>") - .left() - .isMethod(MethodKind.YEAR, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("year(2013-09-25) eq 2013") - .is("<)> eq <2013>>") - .left() - .isMethod(MethodKind.YEAR, 1) - .isParameterText(0, "<2013-09-25>"); - - testFilter.runOnETAllPrim("year(PropertyDateTimeOffset) eq 2013") - .is("<)> eq <2013>>") - .left() - .isMethod(MethodKind.YEAR, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("year(2013-09-25T12:34:56.123456789012-10:24) eq 2013") - .is("<)> eq <2013>>") - .left() - .isMethod(MethodKind.YEAR, 1) - .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); - - testFilter.runOnETAllPrim("month(PropertyDate) eq 9") - .is("<)> eq <9>>") - .left() - .isMethod(MethodKind.MONTH, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("month(2013-09-25) eq 9") - .is("<)> eq <9>>") - .left() - .isMethod(MethodKind.MONTH, 1) - .isParameterText(0, "<2013-09-25>"); - - testFilter.runOnETAllPrim("month(PropertyDateTimeOffset) eq 9") - .is("<)> eq <9>>") - .left() - .isMethod(MethodKind.MONTH, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("month(2013-09-25T12:34:56.123456789012-10:24) eq 9") - .is("<)> eq <9>>") - .left() - .isMethod(MethodKind.MONTH, 1) - .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); - - testFilter.runOnETAllPrim("day(PropertyDate) eq 25") - .is("<)> eq <25>>") - .left() - .isMethod(MethodKind.DAY, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("day(2013-09-25) eq 25") - .is("<)> eq <25>>") - .left() - .isMethod(MethodKind.DAY, 1) - .isParameterText(0, "<2013-09-25>"); - - testFilter.runOnETAllPrim("day(PropertyDateTimeOffset) eq 25") - .is("<)> eq <25>>") - .left() - .isMethod(MethodKind.DAY, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("day(2013-09-25T12:34:56.123456789012-10:24) eq 25") - .is("<)> eq <25>>") - .left() - .isMethod(MethodKind.DAY, 1) - .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); - - testFilter.runOnETAllPrim("hour(PropertyDateTimeOffset) eq 2") - .is("<)> eq <2>>") - .left() - .isMethod(MethodKind.HOUR, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("hour(PropertyDateTimeOffset) eq 2") - .is("<)> eq <2>>") - .left() - .isMethod(MethodKind.HOUR, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("hour(2013-09-25T12:34:56.123456789012-10:24) eq 2") - .is("<)> eq <2>>") - .left() - .isMethod(MethodKind.HOUR, 1) - .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); - - testFilter.runOnETAllPrim("hour(PropertyTimeOfDay) eq 2") - .is("<)> eq <2>>") - .left() - .isMethod(MethodKind.HOUR, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("hour(12:34:55.123456789012) eq 12") - .is("<)> eq <12>>") - .left() - .isMethod(MethodKind.HOUR, 1) - .isParameterText(0, "<12:34:55.123456789012>"); - - testFilter.runOnETAllPrim("minute(PropertyDateTimeOffset) eq 34") - .is("<)> eq <34>>") - .left() - .isMethod(MethodKind.MINUTE, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("minute(2013-09-25T12:34:56.123456789012-10:24) eq 34") - .is("<)> eq <34>>") - .left() - .isMethod(MethodKind.MINUTE, 1) - .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); - - testFilter.runOnETAllPrim("minute(PropertyTimeOfDay) eq 34") - .is("<)> eq <34>>") - .left() - .isMethod(MethodKind.MINUTE, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("minute(12:34:55.123456789012) eq 34") - .is("<)> eq <34>>") - .left() - .isMethod(MethodKind.MINUTE, 1) - .isParameterText(0, "<12:34:55.123456789012>"); - - testFilter.runOnETAllPrim("second(PropertyDateTimeOffset) eq 56") - .is("<)> eq <56>>") - .left() - .isMethod(MethodKind.SECOND, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("second(2013-09-25T12:34:56.123456789012-10:24) eq 56") - .is("<)> eq <56>>") - .left() - .isMethod(MethodKind.SECOND, 1) - .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); - - testFilter.runOnETAllPrim("second(PropertyTimeOfDay) eq 56") - .is("<)> eq <56>>") - .left() - .isMethod(MethodKind.SECOND, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("second(12:34:55.123456789012) eq 56") - .is("<)> eq <56>>") - .left() - .isMethod(MethodKind.SECOND, 1) - .isParameterText(0, "<12:34:55.123456789012>"); - - testFilter.runOnETAllPrim("fractionalseconds(PropertyDateTimeOffset) eq 123456789012") - .is("<)> eq <123456789012>>") - .left() - .isMethod(MethodKind.FRACTIONALSECONDS, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("fractionalseconds(2013-09-25T12:34:56.123456789012-10:24) eq 123456789012") - .is("<)> eq <123456789012>>") - .left() - .isMethod(MethodKind.FRACTIONALSECONDS, 1) - .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); - - testFilter.runOnETAllPrim("fractionalseconds(PropertyTimeOfDay) eq 123456789012") - .is("<)> eq <123456789012>>") - .left() - .isMethod(MethodKind.FRACTIONALSECONDS, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("fractionalseconds(12:34:55.123456789012) eq 123456789012") - .is("<)> eq <123456789012>>") - .left() - .isMethod(MethodKind.FRACTIONALSECONDS, 1) - .isParameterText(0, "<12:34:55.123456789012>"); - - testFilter.runOnETAllPrim("totalseconds(PropertyDuration) eq 4711") - .is("<)> eq <4711>>") - .left() - .isMethod(MethodKind.TOTALSECONDS, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("totalseconds(duration'P10DT5H34M21.123456789012S') eq 4711") - .is("<)> eq <4711>>") - .left() - .isMethod(MethodKind.TOTALSECONDS, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("date(PropertyDateTimeOffset) eq 2013-09-25") - .is("<)> eq <2013-09-25>>") - .left() - .isMethod(MethodKind.DATE, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("date(2013-09-25T12:34:56.123456789012-10:24) eq 2013-09-25") - .is("<)> eq <2013-09-25>>") - .left() - .isMethod(MethodKind.DATE, 1) - .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); - - testFilter.runOnETAllPrim("time(PropertyDateTimeOffset) eq 12:34:55.123456789012") - .is("<)> eq <12:34:55.123456789012>>") - .left() - .isMethod(MethodKind.TIME, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("time(2013-09-25T12:34:56.123456789012-10:24) eq 12:34:55.123456789012") - .is("<)> eq <12:34:55.123456789012>>") - .left() - .isMethod(MethodKind.TIME, 1) - .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); - - testFilter.runOnETAllPrim("round(PropertyDouble) eq 17") - .is("<)> eq <17>>") - .left() - .isMethod(MethodKind.ROUND, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("round(17.45e1) eq 17") - .is("<)> eq <17>>") - .left() - .isMethod(MethodKind.ROUND, 1) - .isParameterText(0, "<17.45e1>"); - - testFilter.runOnETAllPrim("round(PropertyDecimal) eq 17") - .is("<)> eq <17>>") - .left() - .isMethod(MethodKind.ROUND, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("round(17.45) eq 17") - .is("<)> eq <17>>") - .left() - .isMethod(MethodKind.ROUND, 1) - .isParameterText(0, "<17.45>"); - - testFilter.runOnETAllPrim("floor(PropertyDouble) eq 17") - .is("<)> eq <17>>") - .left() - .isMethod(MethodKind.FLOOR, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("floor(17.45e1) eq 17") - .is("<)> eq <17>>") - .left() - .isMethod(MethodKind.FLOOR, 1) - .isParameterText(0, "<17.45e1>"); - - testFilter.runOnETAllPrim("floor(PropertyDecimal) eq 17") - .is("<)> eq <17>>") - .left() - .isMethod(MethodKind.FLOOR, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("floor(17.45) eq 17") - .is("<)> eq <17>>") - .left() - .isMethod(MethodKind.FLOOR, 1) - .isParameterText(0, "<17.45>"); - - testFilter.runOnETAllPrim("ceiling(PropertyDouble) eq 18") - .is("<)> eq <18>>") - .left() - .isMethod(MethodKind.CEILING, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("ceiling(17.55e1) eq 18") - .is("<)> eq <18>>") - .left() - .isMethod(MethodKind.CEILING, 1) - .isParameterText(0, "<17.55e1>"); - - testFilter.runOnETAllPrim("ceiling(PropertyDecimal) eq 18") - .is("<)> eq <18>>") - .left() - .isMethod(MethodKind.CEILING, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("ceiling(17.55) eq 18") - .is("<)> eq <18>>") - .left() - .isMethod(MethodKind.CEILING, 1) - .isParameterText(0, "<17.55>"); - - testFilter.runOnETAllPrim("totaloffsetminutes(PropertyDateTimeOffset) eq 4711") - .is("<)> eq <4711>>") - .left() - .isMethod(MethodKind.TOTALOFFSETMINUTES, 1) - .isParameterText(0, ""); - - testFilter.runOnETAllPrim("totaloffsetminutes(2013-09-25T12:34:56.123456789012-10:24) eq 4711") - .is("<)> eq <4711>>") - .left() - .isMethod(MethodKind.TOTALOFFSETMINUTES, 1) - .isParameterText(0, "<2013-09-25T12:34:56.123456789012-10:24>"); - - testFilter.runOnETAllPrim("mindatetime() ne null") - .is("< ne >") - .left().isMethod(MethodKind.MINDATETIME, 0); - - testFilter.runOnETAllPrim("mindatetime() eq 2013-09-25T12:34:56.123456789012-10:24") - .is("< eq <2013-09-25T12:34:56.123456789012-10:24>>") - .left() - .isMethod(MethodKind.MINDATETIME, 0); - - testFilter.runOnETAllPrim("maxdatetime() ne null") - .is("< ne >") - .left().isMethod(MethodKind.MAXDATETIME, 0); - - testFilter.runOnETAllPrim("maxdatetime() eq 2013-09-25T12:34:56.123456789012-10:24") - .is("< eq <2013-09-25T12:34:56.123456789012-10:24>>") - .left() - .isMethod(MethodKind.MAXDATETIME, 0); - - testFilter.runOnETAllPrim("now() ne null") - .is("< ne >") - .left().isMethod(MethodKind.NOW, 0); - - testFilter.runOnETAllPrim("now() eq 2013-09-25T12:34:56.123456789012-10:24") - .is("< eq <2013-09-25T12:34:56.123456789012-10:24>>") - .left() - .isMethod(MethodKind.NOW, 0); - - testFilter.runOnETTwoKeyNav("$it/PropertyString eq 'SomeString'") - .is("<<$it/PropertyString> eq <'SomeString'>>") - .left() - .goPath() - .first().isUriPathInfoKind(UriResourceKind.it) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnCTTwoPrim("$it/PropertyString eq 'SomeString'") - .is("<<$it/PropertyString> eq <'SomeString'>>") - .left() - .goPath() - .first().isUriPathInfoKind(UriResourceKind.it) - .isType(ComplexTypeProvider.nameCTTwoPrim, false) - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnString("$it eq 'Walldorf'") - .is("<<$it> eq <'Walldorf'>>") - .left() - .goPath() - .first().isUriPathInfoKind(UriResourceKind.it) - .isType(PropertyProvider.nameString, false); - - testFilter.runOnString("endswith($it,'sap.com')") - .is(",<'sap.com'>)>") - .isMethod(MethodKind.ENDSWITH, 2) - .isParameterText(0, "<$it>") - .isParameterText(1, "<'sap.com'>") - .goParameter(0) - .goPath() - .first().isUriPathInfoKind(UriResourceKind.it) - .isType(PropertyProvider.nameString, false); - - testFilter.runOnString("endswith($it,'sap.com') eq false") - .is("<,<'sap.com'>)> eq >") - .left() - .isMethod(MethodKind.ENDSWITH, 2) - .isParameterText(0, "<$it>") - .isParameterText(1, "<'sap.com'>") - .goParameter(0) - .goPath() - .first().isUriPathInfoKind(UriResourceKind.it) - .isType(PropertyProvider.nameString, false); - - testFilter.runOnETTwoKeyNav("endswith($it/CollPropertyString,'sap.com')") - .is(",<'sap.com'>)>") - .isMethod(MethodKind.ENDSWITH, 2) - .isParameterText(0, "<$it/CollPropertyString>") - .isParameterText(1, "<'sap.com'>") - .goParameter(0) - .goPath() - .first().isUriPathInfoKind(UriResourceKind.it) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .n().isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true); - - testFilter.runOnETTwoKeyNav("endswith(PropertyComp/PropertyComp/PropertyString,'dorf')") - .is(",<'dorf'>)>") - .isMethod(MethodKind.ENDSWITH, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() - .root().goParameter(1).isLiteral("'dorf'"); - - testFilter.runOnETTwoKeyNav("endswith(PropertyComp/PropertyComp/PropertyString,'dorf') eq true") - .is("<,<'dorf'>)> eq >") - .isBinary(BinaryOperatorKind.EQ) - .left().isMethod(MethodKind.ENDSWITH, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() - .root().left().goParameter(1).isLiteral("'dorf'"); - - testFilter.runOnETTwoKeyNav("endswith('Walldorf','dorf')") - .is(",<'dorf'>)>") - .isMethod(MethodKind.ENDSWITH, 2) - .goParameter(0).isLiteral("'Walldorf'") - .root().goParameter(1).isLiteral("'dorf'"); - - testFilter.runOnETTwoKeyNav("endswith('Walldorf','dorf') eq true") - .is("<,<'dorf'>)> eq >") - .isBinary(BinaryOperatorKind.EQ) - .left().isMethod(MethodKind.ENDSWITH, 2) - .goParameter(0).isLiteral("'Walldorf'") - .root().left().goParameter(1).isLiteral("'dorf'"); - - testFilter.runOnETKeyNav("startswith(PropertyCompAllPrim/PropertyString,'Wall')") - .is(",<'Wall'>)>") - .isMethod(MethodKind.STARTSWITH, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyCompAllPrim") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() - .root().goParameter(1).isLiteral("'Wall'"); - - testFilter.runOnETKeyNav("startswith(PropertyCompAllPrim/PropertyString,'Wall') eq true") - .is("<,<'Wall'>)> eq >") - .isBinary(BinaryOperatorKind.EQ) - .left().isMethod(MethodKind.STARTSWITH, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyCompAllPrim") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() - .root().left().goParameter(1).isLiteral("'Wall'"); - - testFilter.runOnETKeyNav("startswith('Walldorf','Wall')") - .is(",<'Wall'>)>") - .isMethod(MethodKind.STARTSWITH, 2) - .goParameter(0).isLiteral("'Walldorf'") - .root().goParameter(1).isLiteral("'Wall'"); - - testFilter.runOnETKeyNav("startswith('Walldorf','Wall') eq true") - .is("<,<'Wall'>)> eq >") - .isBinary(BinaryOperatorKind.EQ) - .left().isMethod(MethodKind.STARTSWITH, 2) - .goParameter(0).isLiteral("'Walldorf'") - .root().left().goParameter(1).isLiteral("'Wall'"); - - testFilter.runOnETTwoKeyNav("contains(PropertyComp/PropertyComp/PropertyString,'Wall')") - .is(",<'Wall'>)>") - .isMethod(MethodKind.CONTAINS, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() - .root().goParameter(1).isLiteral("'Wall'"); - - testFilter.runOnETTwoKeyNav("contains(PropertyComp/PropertyComp/PropertyString,'Wall') eq true") - .is("<,<'Wall'>)> eq >") - .isBinary(BinaryOperatorKind.EQ) - .left().isMethod(MethodKind.CONTAINS, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() - .root().left().goParameter(1).isLiteral("'Wall'"); - - testFilter.runOnETTwoKeyNav("contains('Walldorf','Wall')") - .is(",<'Wall'>)>") - .isMethod(MethodKind.CONTAINS, 2) - .goParameter(0).isLiteral("'Walldorf'") - .root().goParameter(1).isLiteral("'Wall'"); - - testFilter.runOnETTwoKeyNav("contains('Walldorf','Wall') eq true") - .is("<,<'Wall'>)> eq >") - .isBinary(BinaryOperatorKind.EQ) - .left().isMethod(MethodKind.CONTAINS, 2) - .goParameter(0).isLiteral("'Walldorf'") - .root().left().goParameter(1).isLiteral("'Wall'"); - - testFilter.runOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyInt16 eq " - + "$root/ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyInt16") - .is("< eq <$root/ESTwoKeyNav/PropertyInt16>>") - .root().left() - .goPath() - .first().isComplex("PropertyComp").isType(ComplexTypeProvider.nameCTPrimComp, false) - .n().isComplex("PropertyComp").isType(ComplexTypeProvider.nameCTAllPrim, false) - .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .goUpFilterValidator() - .root().right() - .goPath() - .first().isUriPathInfoKind(UriResourceKind.root) - .n().isEntitySet("ESTwoKeyNav") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'2'") - .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - } - - @Test - public void castMethod() throws Exception { - testFilter.runOnETKeyNav("cast(olingo.odata.test1.ETBaseTwoKeyNav) ne null") - .is("<)> ne >") - .left() - .isMethod(MethodKind.CAST, 1) - .isParameterText(0, "") - .goParameter(0).isTypedLiteral(EntityTypeProvider.nameETBaseTwoKeyNav); - - testFilter.runOnETKeyNav("cast(PropertyCompTwoPrim,olingo.odata.test1.CTBase) ne null") - .is("<,)> ne >") - .left() - .isMethod(MethodKind.CAST, 2) - .isParameterText(0, "") - .isParameterText(1, "") - .goParameter(0).goPath().first() - .isComplexProperty("PropertyCompTwoPrim", ComplexTypeProvider.nameCTTwoPrim, false) - .goUpFilterValidator() - .root().left() - .goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTBase); - - testFilter.runOnETKeyNav("cast($it,olingo.odata.test1.CTBase) ne null") - .is("<,)> ne >") - .left() - .isMethod(MethodKind.CAST, 2) - .isParameterText(0, "<$it>") - .isParameterText(1, "") - .goParameter(0).goPath().first() - .isIt().isType(EntityTypeProvider.nameETKeyNav, false) - .goUpFilterValidator() - .root().left() - .goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTBase); - - testFilter.runOnETKeyNav("concat(PropertyString,cast(PropertyCompAllPrim/PropertyInt16,Edm.String)) ne ''") - .is("<,,)>)> ne <''>>") - .left() - .isMethod(MethodKind.CONCAT, 2) - .isParameterText(0, "") - .isParameterText(1, ",)>") - .goParameter(1) - .isMethod(MethodKind.CAST, 2) - .isParameterText(0, "") - .isParameterText(1, ""); - - testFilter.runOnETKeyNav("cast($it,olingo.odata.test1.CTBase) eq cast($it,olingo.odata.test1.CTBase)") - .is("<,)> eq ,)>>") - .left() - .isMethod(MethodKind.CAST, 2) - .isParameterText(0, "<$it>") - .isParameterText(1, "") - .goParameter(0).goPath().first() - .isIt().isType(EntityTypeProvider.nameETKeyNav, false) - .goUpFilterValidator() - .root().left() - .goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTBase) - .root().right() - .isMethod(MethodKind.CAST, 2) - .isParameterText(0, "<$it>") - .isParameterText(1, "") - .goParameter(0).goPath().first() - .isIt().isType(EntityTypeProvider.nameETKeyNav, false) - .goUpFilterValidator() - .root().right() - .goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTBase); - - testFilter.runOnInt32("cast(Edm.Int32) gt 0") - .is("<)> gt <0>>") - .left() - .isMethod(MethodKind.CAST, 1) - .goParameter(0).isTypedLiteral(PropertyProvider.nameInt32); - - testFilter.runOnDateTimeOffset("cast(Edm.DateTimeOffset) ne null") - .is("<)> ne >") - .left() - .isMethod(MethodKind.CAST, 1) - .goParameter(0).isTypedLiteral(PropertyProvider.nameDateTimeOffset); - - testFilter.runOnDuration("cast(Edm.Duration) ne null") - .is("<)> ne >") - .left() - .isMethod(MethodKind.CAST, 1) - .goParameter(0).isTypedLiteral(PropertyProvider.nameDuration); - - testFilter.runOnTimeOfDay("cast(Edm.TimeOfDay) ne null") - .is("<)> ne >") - .left() - .isMethod(MethodKind.CAST, 1) - .goParameter(0).isTypedLiteral(PropertyProvider.nameTimeOfDay); - - testFilter.runOnETKeyNav("cast(CollPropertyInt16,Edm.Int32) ne null") - .is("<,)> ne >") - .left() - .isMethod(MethodKind.CAST, 2) - .goParameter(0).goPath().first() - .isPrimitiveProperty("CollPropertyInt16", PropertyProvider.nameInt16, true) - .goUpFilterValidator().root().left() - .goParameter(1).isTypedLiteral(PropertyProvider.nameInt32); - - testFilter.runOnETTwoKeyNav( - "cast(PropertyComp/PropertyComp/PropertyDateTimeOffset,Edm.DateTimeOffset) ne null") - .is("<,)> ne >") - .left() - .isMethod(MethodKind.CAST, 2) - .goParameter(0).goPath() - .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) - .n().isPrimitiveProperty("PropertyDateTimeOffset", PropertyProvider.nameDateTimeOffset, false) - .goUpFilterValidator().root().left() - .goParameter(1).isTypedLiteral(PropertyProvider.nameDateTimeOffset); - - testFilter.runOnETTwoKeyNav("cast(PropertyComp/PropertyComp/PropertyDuration,Edm.Duration) ne null") - .is("<,)> ne >") - .left() - .isMethod(MethodKind.CAST, 2) - .goParameter(0).goPath() - .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) - .n().isPrimitiveProperty("PropertyDuration", PropertyProvider.nameDuration, false) - .goUpFilterValidator().root().left() - .goParameter(1).isTypedLiteral(PropertyProvider.nameDuration); - - testFilter.runOnETTwoKeyNav("cast(PropertyComp/PropertyComp/PropertyTimeOfDay,Edm.TimeOfDay) ne null") - .is("<,)> ne >") - .left() - .isMethod(MethodKind.CAST, 2) - .goParameter(0).goPath() - .first().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .n().isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) - .n().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) - .goUpFilterValidator().root().left() - .goParameter(1).isTypedLiteral(PropertyProvider.nameTimeOfDay); - - testFilter.runOnETKeyNav("cast(PropertyCompAllPrim,olingo.odata.test1.CTTwoPrim) ne null") - .is("<,)> ne >") - .left() - .isMethod(MethodKind.CAST, 2) - .goParameter(0).goPath() - .first().isComplexProperty("PropertyCompAllPrim", ComplexTypeProvider.nameCTAllPrim, false) - .goUpFilterValidator().root().left() - .goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoPrim); - - testFilter.runOnETKeyNav("cast(NavPropertyETKeyNavOne,olingo.odata.test1.ETKeyPrimNav) ne null") - .is("<,)> ne >") - .left() - .isMethod(MethodKind.CAST, 2) - .goParameter(0).goPath() - .first().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .goUpFilterValidator().root().left() - .goParameter(1).isTypedLiteral(EntityTypeProvider.nameETKeyPrimNav); - - testFilter.runOnETAllPrim( - "olingo.odata.test1.UFCRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString='1') ne null") - .left() - .goPath() - .isFunction("UFCRTCTTwoPrimTwoParam") - .isParameter(0, "ParameterInt16", "1") - .isParameter(1, "ParameterString", "'1'"); - - testFilter.runOnETKeyNavEx("cast(NavPropertyETKeyPrimNavOne,olingo.odata.test1.ETKeyNav)") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - } - - @Test - public void lambdaFunctions() throws Exception { - testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavMany/any(d:d/PropertyString eq 'SomeString')") - .is(" eq <'SomeString'>>>>") - .root().goPath() - .first().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .n().isUriPathInfoKind(UriResourceKind.lambdaAny) - .goLambdaExpression() - .isBinary(BinaryOperatorKind.EQ) - .left().goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavMany/any()") - .is(">"); - - testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavOne/CollPropertyString/any(d:d eq 'SomeString')") - .is(" eq <'SomeString'>>>>") - .root().goPath() - .first().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .n().isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) - .n().isUriPathInfoKind(UriResourceKind.lambdaAny) - .goLambdaExpression() - .isBinary(BinaryOperatorKind.EQ) - .left().goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(PropertyProvider.nameString, false); - - testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavOne/olingo.odata.test1.BFCETTwoKeyNavRTESTwoKeyNav()" - + "/any(d:d/PropertyComp/PropertyInt16 eq 6)") - .is(" eq <6>>>>") - .root().goPath() - .first().isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .n().isFunction("BFCETTwoKeyNavRTESTwoKeyNav") - .n().isUriPathInfoKind(UriResourceKind.lambdaAny) - .goLambdaExpression() - .isBinary(BinaryOperatorKind.EQ) - .left().goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavMany/any(d:d/PropertyInt16 eq 1 or " - + "d/CollPropertyString/any(e:e eq 'SomeString'))") - .is(" eq <1>>" - + " or eq <'SomeString'>>>>>>>") - .root().goPath() - .first().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .n().isUriPathInfoKind(UriResourceKind.lambdaAny) - .goLambdaExpression() - .root().isBinary(BinaryOperatorKind.OR) - .root().left() - .isBinary(BinaryOperatorKind.EQ) - .left() - .goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .goUpFilterValidator() - .root().right() - .goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .n().isUriPathInfoKind(UriResourceKind.primitiveProperty) - .isPrimitiveProperty("CollPropertyString", PropertyProvider.nameString, true) - .at(2).isUriPathInfoKind(UriResourceKind.lambdaAny) - .goLambdaExpression() - .root().left().goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(PropertyProvider.nameString, false); - - testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavMany/any(d:d/PropertyInt16 eq 1 or " - + "d/CollPropertyString/any(e:e eq 'SomeString'))") - .is(" eq <1>> or " - + " eq <'SomeString'>>>>>>>") - .root().goPath() - .first().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .n().isUriPathInfoKind(UriResourceKind.lambdaAny) - .goLambdaExpression() - .root().isBinary(BinaryOperatorKind.OR) - .root().left() - .isBinary(BinaryOperatorKind.EQ) - .left() - .goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .goUpFilterValidator() - .root().right() - .goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .n().isType(PropertyProvider.nameString, true) - .n().isUriPathInfoKind(UriResourceKind.lambdaAny) - .goLambdaExpression() - .root().left().goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(PropertyProvider.nameString, false); - - testFilter.runOnETKeyNav("NavPropertyETTwoKeyNavMany/any(d:d/PropertyString eq 'SomeString' and " - + "d/CollPropertyString/any(e:e eq d/PropertyString))") - .is(" eq <'SomeString'>> and " - + " eq >>>>>>") - .root().goPath() - .first().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .n().isUriPathInfoKind(UriResourceKind.lambdaAny) - .goLambdaExpression() - .root().isBinary(BinaryOperatorKind.AND) - .root().left() - .isBinary(BinaryOperatorKind.EQ) - .left() - .goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .goUpFilterValidator() - .root().right() - .goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .n().isType(PropertyProvider.nameString, true) - .n().isUriPathInfoKind(UriResourceKind.lambdaAny) - .goLambdaExpression() - .root().left().goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .isType(PropertyProvider.nameString, false) - .goUpFilterValidator() - .root().right().goPath() - .first().isUriPathInfoKind(UriResourceKind.lambdaVariable) - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOnETKeyNavEx("any()") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - testFilter.runOnETKeyNavEx("any(d:d/PropertyInt16 eq 1)") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - } - - @Test - public void isOfMethod() throws Exception { - testFilter.runOnETKeyNav("isof(olingo.odata.test1.ETTwoKeyNav)") - .is(")>") - .root() - .isMethod(MethodKind.ISOF, 1) - .goParameter(0).isTypedLiteral(EntityTypeProvider.nameETTwoKeyNav); - - testFilter.runOnETKeyNav("isof(olingo.odata.test1.ETBaseTwoKeyNav) eq true") - .is("<)> eq >") - .root().isBinary(BinaryOperatorKind.EQ) - .left() - .isMethod(MethodKind.ISOF, 1) - .goParameter(0).isTypedLiteral(EntityTypeProvider.nameETBaseTwoKeyNav); - - testFilter - .runOnETKeyNav("isof(olingo.odata.test1.ETBaseTwoKeyNav) eq true and PropertyCompNav/PropertyInt16 eq 1") - .is("<<)> eq > and < eq <1>>>") - .root().isBinary(BinaryOperatorKind.AND) - .left().isBinary(BinaryOperatorKind.EQ) - .left().isMethod(MethodKind.ISOF, 1) - .goParameter(0).isTypedLiteral(EntityTypeProvider.nameETBaseTwoKeyNav); - - testFilter.runOnETKeyNav("isof(NavPropertyETKeyNavOne,olingo.odata.test1.ETKeyNav) eq true") - .is("<,)> eq >") - .root().isBinary(BinaryOperatorKind.EQ) - .left().isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .goUpFilterValidator() - .root().left().goParameter(1).isTypedLiteral(EntityTypeProvider.nameETKeyNav); - - testFilter.runOnETKeyNav("isof(PropertyCompTwoPrim,olingo.odata.test1.CTTwoPrim)") - .is(",)>") - .root().isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath().isComplex("PropertyCompTwoPrim").goUpFilterValidator() - .root().goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoPrim); - - testFilter.runOnETKeyNav("isof(PropertyCompTwoPrim,olingo.odata.test1.CTTwoBase)") - .is(",)>") - .root().isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath().isComplex("PropertyCompTwoPrim").goUpFilterValidator() - .root().goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoBase); - - testFilter.runOnETKeyNav("isof(PropertyCompTwoPrim,olingo.odata.test1.CTTwoPrim) eq true") - .is("<,)> eq >") - .root().left().isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath().isComplex("PropertyCompTwoPrim").goUpFilterValidator() - .root().left().goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoPrim); - - testFilter.runOnETKeyNav("isof($it,olingo.odata.test1.CTTwoPrim)") - .is(",)>") - .root() - .isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath().isIt().goUpFilterValidator() - .root().goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoPrim); - - testFilter.runOnETKeyNav("isof($it,olingo.odata.test1.CTTwoBase) eq false") - .is("<,)> eq >") - .isBinary(BinaryOperatorKind.EQ) - .root().left() - .isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath().isIt().goUpFilterValidator() - .root().left().goParameter(1).isTypedLiteral(ComplexTypeProvider.nameCTTwoBase); - - testFilter.runOnETKeyNav("isof(PropertyCompNav/PropertyInt16,Edm.Int32)") - .is(",)>") - .root() - .isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyCompNav") - .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .goUpFilterValidator() - .root().goParameter(1).isTypedLiteral(PropertyProvider.nameInt32); - - testFilter.runOnETTwoKeyNav("isof(PropertyComp/PropertyComp/PropertyDateTimeOffset,Edm.DateTimeOffset)") - .is(",)>") - .root() - .isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyDateTimeOffset", PropertyProvider.nameDateTimeOffset, false) - .goUpFilterValidator() - .root().goParameter(1).isTypedLiteral(PropertyProvider.nameDateTimeOffset); - - testFilter.runOnETTwoKeyNav("isof(PropertyComp/PropertyComp/PropertyTimeOfDay,Edm.TimeOfDay)") - .is(",)>") - .root() - .isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) - .goUpFilterValidator() - .root().goParameter(1).isTypedLiteral(PropertyProvider.nameTimeOfDay); - - testFilter.runOnETTwoKeyNav("isof(PropertyComp/PropertyComp/PropertyDuration,Edm.Duration)") - .is(",)>") - .root() - .isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyDuration", PropertyProvider.nameDuration, false) - .goUpFilterValidator() - .root().goParameter(1).isTypedLiteral(PropertyProvider.nameDuration); - - testFilter.runOnETTwoKeyNav("isof(PropertyComp/PropertyComp/PropertyString,Edm.String)") - .is(",)>") - .root() - .isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .goUpFilterValidator() - .root().goParameter(1).isTypedLiteral(PropertyProvider.nameString); - - testFilter.runOnETTwoKeyNav("isof(PropertyComp/PropertyComp/PropertyString,Edm.Guid)") - .is(",)>") - .root() - .isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .goUpFilterValidator() - .root().goParameter(1).isTypedLiteral(PropertyProvider.nameGuid); - - testFilter.runOnETMixEnumDefCollComp("isof(PropertyEnumString,Namespace1_Alias.ENString)") - .isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath() - .first().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .root().goParameter(1).isTypedLiteral(EnumTypeProvider.nameENString); - - testFilter.runOnETMixEnumDefCollComp("isof(PropertyDefString,Namespace1_Alias.TDString)") - .isMethod(MethodKind.ISOF, 2) - .goParameter(0).goPath() - .first().isPrimitiveProperty("PropertyDefString", TypeDefinitionProvider.nameTDString, false) - .goUpFilterValidator() - .root().goParameter(1).isTypedLiteral(TypeDefinitionProvider.nameTDString); - } - - @Test - public void has() throws Exception { - - testFilter.runOnETMixEnumDefCollComp("PropertyEnumString has olingo.odata.test1.ENString'String1'") - .is("< has >>") - .isBinary(BinaryOperatorKind.HAS) - .root().left().goPath().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); - - testFilter.runOnETMixEnumDefCollComp( - "PropertyCompMixedEnumDef/PropertyEnumString has olingo.odata.test1.ENString'String2'") - .is("< has >>") - .isBinary(BinaryOperatorKind.HAS) - .root().left().goPath() - .first().isComplex("PropertyCompMixedEnumDef") - .n().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String2")); - - testFilter - .runOnETMixEnumDefCollComp( - "PropertyCompMixedEnumDef/PropertyEnumString has olingo.odata.test1.ENString'String2' eq true") - .is("<< has " + - ">> eq >") - .isBinary(BinaryOperatorKind.EQ) - .root().left() - .isBinary(BinaryOperatorKind.HAS) - .root().left().left().goPath() - .first().isComplex("PropertyCompMixedEnumDef") - .n().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .root().left().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String2")); - - testFilter.runOnETMixEnumDefCollComp("PropertyEnumString has olingo.odata.test1.ENString'String3'") - .is("< has >>") - .isBinary(BinaryOperatorKind.HAS) - .root().left().goPath() - .first().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String3")); - - testFilter.runOnETMixEnumDefCollComp("PropertyEnumString has olingo.odata.test1.ENString'String1,String3'") - .is("< has >>") - .isBinary(BinaryOperatorKind.HAS) - .root().left().goPath() - .first().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .root().right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1", "String3")); - - testFilter.runUriEx("ESMixEnumDefCollComp", "$filter=PropertyEnumString has null") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testFilter.runUriEx("ESMixEnumDefCollComp", "$filter=PropertyEnumString has ENString'String1'") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testFilter.runUriEx("ESMixEnumDefCollComp", "$filter=PropertyEnumString has wrongNamespace.ENString'String1'") - .isExSemantic(MessageKeys.UNKNOWN_TYPE); - testFilter.runUriEx("ESMixEnumDefCollComp", "$filter=PropertyEnumString has olingo.odata.test1.Wrong'String1'") - .isExSemantic(MessageKeys.UNKNOWN_TYPE); - } - - @Test - public void filterOnCountAndRef() throws Exception { - testUri.run("ESKeyNav/$count", "$filter=PropertyInt16 ge 0") - .goPath().isCount() - .goUpUriValidator().goFilter().isBinary(BinaryOperatorKind.GE) - .left().goPath().first().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .goUpFilterValidator().root().right().isLiteral("0"); - testUri.run("ESKeyNav/$ref", "$filter=PropertyInt16 ge 0") - .goPath().isRef() - .goUpUriValidator().goFilter().isBinary(BinaryOperatorKind.GE) - .left().goPath().first().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .goUpFilterValidator().root().right().isLiteral("0"); - } - - @Test - public void orderby() throws Exception { - testFilter.runOrderByOnETTwoKeyNav("PropertyString") - .isSortOrder(0, false) - .goOrder(0).goPath() - .first().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOrderByOnETTwoKeyNav("PropertyComp") - .isSortOrder(0, false) - .goOrder(0).goPath() - .first().isComplex("PropertyComp"); - - testFilter.runOrderByOnETTwoKeyNav("PropertyComp/PropertyComp") - .isSortOrder(0, false) - .goOrder(0).goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp"); - - testFilter.runOrderByOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyDate") - .isSortOrder(0, false) - .goOrder(0).goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false); - - testFilter.runOrderByOnETTwoKeyNav("olingo.odata.test1.UFCRTETAllPrimTwoParam(" - + "ParameterString=@ParamStringAlias,ParameterInt16=@ParamInt16Alias)/PropertyString eq 'SomeString'" - + "&@ParamStringAlias='1'&@ParamInt16Alias=1") - .isSortOrder(0, false) - .goOrder(0).isBinary(BinaryOperatorKind.EQ).left().goPath() - .first().isFunction("UFCRTETAllPrimTwoParam").goUpFilterValidator() - .goOrder(0).right().isLiteral("'SomeString'"); - - testFilter.runOrderByOnETTwoKeyNav("olingo.odata.test1.UFCRTETAllPrimTwoParam(" - + "ParameterString=@ParamStringAlias,ParameterInt16=@ParamInt16Alias)/PropertyString eq 'SomeString' asc" - + "&@ParamStringAlias='1'&@ParamInt16Alias=1") - .isSortOrder(0, false) - .goOrder(0).isBinary(BinaryOperatorKind.EQ).left().goPath() - .first().isFunction("UFCRTETAllPrimTwoParam").goUpFilterValidator() - .goOrder(0).right().isLiteral("'SomeString'"); - - testFilter.runOrderByOnETTwoKeyNav("olingo.odata.test1.UFCRTETAllPrimTwoParam(" - + "ParameterString=@ParamStringAlias,ParameterInt16=@ParamInt16Alias)/PropertyString eq 'SomeString' desc" - + "&@ParamStringAlias='1'&@ParamInt16Alias=1") - .isSortOrder(0, true) - .goOrder(0).isBinary(BinaryOperatorKind.EQ).left().goPath() - .first().isFunction("UFCRTETAllPrimTwoParam").goUpFilterValidator() - .goOrder(0).right().isLiteral("'SomeString'"); - - testFilter.runOrderByOnETTwoKeyNav("olingo.odata.test1.UFCRTETAllPrimTwoParam(" - + "ParameterString=@ParamStringAlias,ParameterInt16=@ParamInt16Alias)/PropertyString eq 'SomeString' desc," - + "PropertyString eq '1'" - + "&@ParamStringAlias='1'&@ParamInt16Alias=1") - .isSortOrder(0, true) - .goOrder(0).isBinary(BinaryOperatorKind.EQ).left().goPath() - .first().isFunction("UFCRTETAllPrimTwoParam").goUpFilterValidator() - .goOrder(0).right().isLiteral("'SomeString'") - .isSortOrder(1, false) - .goOrder(1).isBinary(BinaryOperatorKind.EQ).left().goPath() - .first().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() - .goOrder(1).right().isLiteral("'1'"); - - testFilter.runOrderByOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyDate eq " - + "$root/ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyComp/PropertyComp/PropertyDate") - .isSortOrder(0, false) - .goOrder(0).isBinary(BinaryOperatorKind.EQ).left().goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) - .goUpFilterValidator() - .goOrder(0).right().goPath() - .first().isUriPathInfoKind(UriResourceKind.root) - .n().isEntitySet("ESTwoKeyNav") - .n().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false); - - testFilter.runOrderByOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyDate eq 2013-11-12 desc," - + "PropertyString eq 'SomeString' desc") - .isSortOrder(0, true) - .goOrder(0).isBinary(BinaryOperatorKind.EQ) - .left().goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false).goUpFilterValidator() - .goOrder(0).right().isLiteral("2013-11-12") - .isSortOrder(1, true) - .goOrder(1).left().goPath().first().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .goUpFilterValidator() - .goOrder(1).right().isLiteral("'SomeString'"); - - testFilter.runOrderByOnETTwoKeyNav("PropertyComp desc,PropertyComp/PropertyInt16 eq 1") - .isSortOrder(0, true) - .goOrder(0).goPath() - .first().isComplex("PropertyComp").goUpFilterValidator() - .isSortOrder(1, false) - .goOrder(1).isBinary(BinaryOperatorKind.EQ) - .left().goPath() - .first().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false).goUpFilterValidator() - .goOrder(1).right().isLiteral("1"); - - testFilter.runOrderByOnETTwoKeyNav("NavPropertyETKeyNavOne") - .isSortOrder(0, false).goOrder(0).goPath() - .first().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false); - - testFilter.runOrderByOnETTwoKeyNav("NavPropertyETKeyNavOne/PropertyString") - .isSortOrder(0, false).goOrder(0).goPath() - .first().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOrderByOnETTwoKeyNav("NavPropertyETKeyNavOne/PropertyCompNav") - .isSortOrder(0, false).goOrder(0).goPath() - .first().isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .n().isComplex("PropertyCompNav"); - - testFilter.runOrderByOnETTwoKeyNav("PropertyComp/PropertyComp/PropertyInt16 eq 1") - .isSortOrder(0, false).goOrder(0).left().goPath() - .first().isComplex("PropertyComp") - .n().isComplex("PropertyComp") - .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - testFilter.runOrderByOnETTwoKeyNav("NavPropertyETKeyNavMany(1)/NavPropertyETTwoKeyNavMany(PropertyString='2')" - + "/PropertyString eq 'SomeString'") - .isSortOrder(0, false).goOrder(0).left().goPath() - .first().isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .n().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOrderByOnETTwoKeyNav("NavPropertyETKeyNavMany(1)/NavPropertyETTwoKeyNavMany(PropertyString='2')" - + "/PropertyString eq 'SomeString1' desc,PropertyString eq 'SomeString2' asc") - .isSortOrder(0, true).goOrder(0).left().goPath() - .first().isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .n().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .n().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false).goUpFilterValidator() - .isSortOrder(1, false).goOrder(1).left().goPath() - .first().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - testFilter.runOrderByOnETAllPrim("PropertyBoolean eq true") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyBoolean", PropertyProvider.nameBoolean, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("true"); - - testFilter.runOrderByOnETAllPrim("PropertyBoolean eq true desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyBoolean", PropertyProvider.nameBoolean, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("true"); - - testFilter.runOrderByOnETAllPrim("PropertyDouble eq 3.5E+38") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDouble", PropertyProvider.nameDouble, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("3.5E+38"); - - testFilter.runOrderByOnETAllPrim("PropertyDouble eq 3.5E+38 desc").isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDouble", PropertyProvider.nameDouble, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("3.5E+38"); - - testFilter.runOrderByOnETAllPrim("PropertySingle eq 1.5") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertySingle", PropertyProvider.nameSingle, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("1.5"); - - testFilter.runOrderByOnETAllPrim("PropertySingle eq 1.5 desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertySingle", PropertyProvider.nameSingle, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("1.5"); - - testFilter.runOrderByOnETAllPrim("PropertySByte eq -128") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertySByte", PropertyProvider.nameSByte, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("-128"); - - testFilter.runOrderByOnETAllPrim("PropertySByte eq -128 desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertySByte", PropertyProvider.nameSByte, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("-128"); - - testFilter.runOrderByOnETAllPrim("PropertyByte eq 255") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyByte", PropertyProvider.nameByte, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("255"); - - testFilter.runOrderByOnETAllPrim("PropertyByte eq 255 desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyByte", PropertyProvider.nameByte, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("255"); - - testFilter.runOrderByOnETAllPrim("PropertyInt16 eq 32767") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("32767"); - - testFilter.runOrderByOnETAllPrim("PropertyInt16 eq 32767 desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("32767"); - - testFilter.runOrderByOnETAllPrim("PropertyInt32 eq 2147483647") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt32", PropertyProvider.nameInt32, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("2147483647"); - - testFilter.runOrderByOnETAllPrim("PropertyInt32 eq 2147483647 desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt32", PropertyProvider.nameInt32, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("2147483647"); - - testFilter.runOrderByOnETAllPrim("PropertyInt64 eq 9223372036854775807") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt64", PropertyProvider.nameInt64, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("9223372036854775807"); - - testFilter.runOrderByOnETAllPrim("PropertyInt64 eq 9223372036854775807 desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyInt64", PropertyProvider.nameInt64, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("9223372036854775807"); - - testFilter.runOrderByOnETAllPrim("PropertyBinary eq binary'VGVzdA=='") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyBinary", PropertyProvider.nameBinary, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("binary'VGVzdA=='"); - - testFilter.runOrderByOnETAllPrim("PropertyBinary eq binary'VGVzdA==' desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyBinary", PropertyProvider.nameBinary, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("binary'VGVzdA=='"); - - testFilter.runOrderByOnETAllPrim("PropertyDate eq 2013-09-25") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("2013-09-25"); - - testFilter.runOrderByOnETAllPrim("PropertyDate eq 2013-09-25 desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDate", PropertyProvider.nameDate, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("2013-09-25"); - - testFilter.runOrderByOnETAllPrim("PropertyDateTimeOffset eq 2013-09-25T12:34:56.123456789012-10:24") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDateTimeOffset", PropertyProvider.nameDateTimeOffset, - false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("2013-09-25T12:34:56.123456789012-10:24"); - - testFilter.runOrderByOnETAllPrim("PropertyDateTimeOffset eq 2013-09-25T12:34:56.123456789012-10:24 desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDateTimeOffset", PropertyProvider.nameDateTimeOffset, - false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("2013-09-25T12:34:56.123456789012-10:24"); - - testFilter.runOrderByOnETAllPrim("PropertyDuration eq duration'P10DT5H34M21.123456789012S'") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDuration", PropertyProvider.nameDuration, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("duration'P10DT5H34M21.123456789012S'"); - - testFilter.runOrderByOnETAllPrim("PropertyDuration eq duration'P10DT5H34M21.123456789012S' desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyDuration", PropertyProvider.nameDuration, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("duration'P10DT5H34M21.123456789012S'"); - - testFilter.runOrderByOnETAllPrim("PropertyGuid eq 005056A5-09B1-1ED3-89BD-FB81372CCB33") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyGuid", PropertyProvider.nameGuid, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("005056A5-09B1-1ED3-89BD-FB81372CCB33"); - - testFilter.runOrderByOnETAllPrim("PropertyGuid eq 005056A5-09B1-1ED3-89BD-FB81372CCB33 desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyGuid", PropertyProvider.nameGuid, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("005056A5-09B1-1ED3-89BD-FB81372CCB33"); - - testFilter.runOrderByOnETAllPrim("PropertyString eq 'somestring'") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("'somestring'"); - - testFilter.runOrderByOnETAllPrim("PropertyString eq 'somestring' desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("'somestring'"); - - testFilter.runOrderByOnETAllPrim("PropertyTimeOfDay eq 12:34:55.123456789012") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("12:34:55.123456789012"); - - testFilter.runOrderByOnETAllPrim("PropertyTimeOfDay eq 12:34:55.123456789012 desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyTimeOfDay", PropertyProvider.nameTimeOfDay, false) - .goUpFilterValidator() - .goOrder(0).right().isLiteral("12:34:55.123456789012"); - - testFilter.runOrderByOnETMixEnumDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String1'") - .isSortOrder(0, false) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .goOrder(0).right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); - - testFilter.runOrderByOnETMixEnumDefCollComp("PropertyEnumString eq olingo.odata.test1.ENString'String1' desc") - .isSortOrder(0, true) - .goOrder(0).left().goPath().isPrimitiveProperty("PropertyEnumString", EnumTypeProvider.nameENString, false) - .goUpFilterValidator() - .goOrder(0).right().isEnum(EnumTypeProvider.nameENString, Arrays.asList("String1")); - - testFilter.runOrderByOnETTwoKeyNavEx("PropertyInt16 1") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - testFilter.runOrderByOnETTwoKeyNavEx("PropertyInt16, PropertyInt32 PropertyDuration") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testFilter.runOrderByOnETTwoKeyNavEx("PropertyInt16 PropertyInt32, PropertyDuration desc") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - testFilter.runOrderByOnETTwoKeyNavEx("PropertyInt16 asc, PropertyInt32 PropertyDuration desc") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testFilter.runOrderByOnETTwoKeyNavEx("PropertyInt16 asc desc") - .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); - testFilter.runOrderByOnETTwoKeyNavEx("undefined") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - testFilter.runOrderByOnETTwoKeyNavEx("PropertyComp/undefined") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - } - - @Test - public void search() throws Exception { - testUri.run("ESTwoKeyNav", "$search=abc"); - testUri.run("ESTwoKeyNav", "$search=NOT abc"); - - testUri.run("ESTwoKeyNav", "$search=abc AND def"); - testUri.run("ESTwoKeyNav", "$search=abc OR def"); - testUri.run("ESTwoKeyNav", "$search=abc def"); - - testUri.run("ESTwoKeyNav", "$search=abc AND def AND ghi"); - testUri.run("ESTwoKeyNav", "$search=abc AND def OR ghi"); - testUri.run("ESTwoKeyNav", "$search=abc AND def ghi"); - - testUri.run("ESTwoKeyNav", "$search=abc OR def AND ghi"); - testUri.run("ESTwoKeyNav", "$search=abc OR def OR ghi"); - testUri.run("ESTwoKeyNav", "$search=abc OR def ghi"); - - testUri.run("ESTwoKeyNav", "$search=abc def AND ghi"); - testUri.run("ESTwoKeyNav", "$search=abc def OR ghi"); - testUri.run("ESTwoKeyNav", "$search=abc def ghi"); - - // mixed not - testUri.run("ESTwoKeyNav", "$search= abc def AND ghi"); - testUri.run("ESTwoKeyNav", "$search=NOT abc NOT def OR NOT ghi"); - testUri.run("ESTwoKeyNav", "$search= abc def NOT ghi"); - - // parenthesis - testUri.run("ESTwoKeyNav", "$search=(abc)"); - testUri.run("ESTwoKeyNav", "$search=(abc AND def)"); - testUri.run("ESTwoKeyNav", "$search=(abc AND def) OR ghi "); - testUri.run("ESTwoKeyNav", "$search=(abc AND def) ghi "); - testUri.run("ESTwoKeyNav", "$search=abc AND (def OR ghi)"); - testUri.run("ESTwoKeyNav", "$search=abc AND (def ghi)"); - - // search in function-import return value - testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)", "$search=test"); - - // percent encoded characters - testUri.run("ESTwoKeyNav", "$search=%41%42%43"); - testUri.run("ESTwoKeyNav", "$search=\"100%25\""); - - // escaped characters - testUri.run("ESTwoKeyNav", "$search=\"abc\""); - testUri.run("ESTwoKeyNav", "$search=\"a\\\"bc\""); - testUri.run("ESTwoKeyNav", "$search=%22abc%22"); - testUri.run("ESTwoKeyNav", "$search=%22a%5C%22bc%22"); - testUri.run("ESTwoKeyNav", "$search=%22a%5C%5Cbc%22"); - - // wrong escaped characters - testUri.runEx("ESTwoKeyNav", "$search=%22a%22bc%22") - .isExceptionMessage(SearchParserException.MessageKeys.TOKENIZER_EXCEPTION); - testUri.runEx("ESTwoKeyNav", "$search=%22a%5Cbc%22") - .isExceptionMessage(SearchParserException.MessageKeys.TOKENIZER_EXCEPTION); - testUri.runEx("ESTwoKeyNav", "$search=not%27allowed") - .isExceptionMessage(SearchParserException.MessageKeys.TOKENIZER_EXCEPTION); - } - - @Test - public void searchTree() throws Exception { - testUri.run("ESTwoKeyNav", "$expand=NavPropertyETKeyNavMany($search=(abc AND def) OR NOT ghi)") - .goExpand().isSearchSerialized("{{'abc' AND 'def'} OR {NOT 'ghi'}}"); - } - - /** - * See test - * cases at OASIS. - */ - @Test - public void searchQueryPhraseAbnfTestcases() throws Exception { - // - testUri.run("ESTwoKeyNav", "$search=\"blue%20green\""); - // - testUri.run("ESTwoKeyNav", "$search=\"blue%20green%22"); - // - // $search="blue\"green" - testUri.run("ESTwoKeyNav", "$search=\"blue\\\"green\""); - - // - // $search="blue\\green" - testUri.run("ESTwoKeyNav", "$search=\"blue\\\\green\""); - // - testUri.runEx("ESTwoKeyNav", "$search=\"blue\"green\"") - .isExceptionMessage(SearchParserException.MessageKeys.TOKENIZER_EXCEPTION); - // - testUri.runEx("ESTwoKeyNav", "$search=\"blue%22green\"") - .isExceptionMessage(SearchParserException.MessageKeys.TOKENIZER_EXCEPTION); - - // - // $search=blue green - // SearchassertQuery("\"blue%20green\"").resultsIn(); - testUri.run("ESTwoKeyNav", "$search=blue green"); - // - // SearchassertQuery("blue%20green").resultsIn(); - testUri.run("ESTwoKeyNav", "$search=blue%20green"); - - // - // $search=blue AND green - testUri.run("ESTwoKeyNav", "$search=blue AND green"); - - // - // $search=blue OR green - testUri.run("ESTwoKeyNav", "$search=blue OR green"); - - // - // $search=blue NOT green - testUri.run("ESTwoKeyNav", "$search=blue NOT green"); - - // - // $search=NOT blue - testUri.run("ESTwoKeyNav", "$search=NOT blue"); - - // - // $search=foo AND bar OR foo AND baz OR that AND bar OR that AND baz - testUri.run("ESTwoKeyNav", "$search=foo AND bar OR foo AND baz OR that AND bar OR that AND baz"); - - // - // $search=(foo OR that) AND (bar OR baz) - testUri.run("ESTwoKeyNav", "$search=(foo OR that) AND (bar OR baz)"); - - // - // $search=foo AND (bar OR baz) - testUri.run("ESTwoKeyNav", "$search=foo AND (bar OR baz)"); - - // - // $search=(foo AND bar) OR baz - testUri.run("ESTwoKeyNav", "$search=(foo AND bar) OR baz"); - - // - // $search=(NOT foo) OR baz - testUri.run("ESTwoKeyNav", "$search=(NOT foo) OR baz"); - - // - // $search=(NOT foo) - testUri.run("ESTwoKeyNav", "$search=(NOT foo)"); - - // - // http://serviceRoot/Products?$search=blue - testUri.run("ESTwoKeyNav", "$search=blue"); - - // - // http://serviceRoot/Model.Container/$all?$search=blue - testUri.run("$all", "$search=blue"); - - // - // http://serviceRoot/$all?$search=blue - testUri.run("$all", "$search=blue"); - } - - @Test - public void errors() { - testUri.runEx("FICRTString(wrong1='ABC')/olingo.odata.test1.BFCStringRTESTwoKeyNav()") - .isExSemantic(MessageKeys.FUNCTION_NOT_FOUND); - testUri.runEx("FICRTString(wrong1='ABC',wrong2=1)/olingo.odata.test1.BFCStringRTESTwoKeyNav()") - .isExSemantic(MessageKeys.FUNCTION_NOT_FOUND); - - // type filter for entity incompatible - testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBase") - .isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER); - - // type filter for entity double on entry - testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')" - + "/olingo.odata.test1.ETBaseTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav") - .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); - // type filter for entity double on collection - testUri.runEx("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav") - .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); - // type filter for entity double on non key pred - testUri.runEx("SINav/olingo.odata.test1.ETBaseTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav") - .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); - - // type filter for complex incompatible - testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyCompTwoPrim" - + "/olingo.odata.test1.CTCollAllPrim") - .isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER); - - // type filter for complex double on entry - testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString='2')" - + "/olingo.odata.test1.CTBase/olingo.odata.test1.CTBase") - .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); - - // type filter for complex double on collection - testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString='2')" - + "/olingo.odata.test1.CTBase/olingo.odata.test1.CTBase") - .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); - - // type filter for complex double on non key pred - testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyCompTwoPrim" - + "/olingo.odata.test1.CTBase/olingo.odata.test1.CTBase") - .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); - - testUri.runEx("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_") - .isExSemantic(MessageKeys.UNKNOWN_TYPE); - - // $ref - testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyCompTwoPrim/$ref") - .isExSemantic(MessageKeys.ONLY_FOR_ENTITY_TYPES); - testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyCompTwoPrim/$count") - .isExSemantic(MessageKeys.ONLY_FOR_COLLECTIONS); - - // Actions must not be followed by anything. - testUri.runEx(ContainerProvider.AIRT_STRING + "/$value") - .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); - testUri.runEx(ContainerProvider.AIRTCT_TWO_PRIM_PARAM + "/PropertyInt16") - .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); - testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/" - + "olingo.odata.test1.BA_RTETTwoKeyNav/olingo.odata.test1.ETTwoKeyNav") - .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); - testUri.runEx("ESTwoKeyNav/olingo.odata.test1.BAESTwoKeyNavRTESTwoKeyNav/$count") - .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); - } - - @Test - public void doublePercentDecoding() throws Exception { - testUri.runEx("ESAllPrim%252832767%29").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - } - - @Test - public void multipleKeysInResourcePath() throws Exception { - // See OLINGO-730 - testUri.runEx("ESAllPrim(32767)(1)(2)").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - } - - @Test - public void simpleKeyInExpandSystemQueryOption() throws Exception { - testUri.runEx("ESAllPrim(0)", "$expand=NavPropertyETTwoPrimMany(-365)($filter=PropertyString eq 'Test String1')") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - } - - @Test - public void compoundKeyInExpandSystemQueryOption() throws Exception { - testUri.runEx("ESAllPrim(0)", "$expand=NavPropertyETTwoPrimMany(PropertyInt16=1,PropertyString=2)" - + "($filter=PropertyString eq 'Test String1')") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - } - - @Test - public void keyPredicatesInExpandFilter() throws Exception { - testUri.run("ESKeyNav(0)", "$expand=NavPropertyETTwoKeyNavMany($filter=NavPropertyETTwoKeyNavMany" - + "(PropertyInt16=1,PropertyString='2')/PropertyInt16 eq 1)").goExpand() - .first().goPath().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .goUpExpandValidator().goFilter() - .is("< eq <1>>"); - } - - @Test - public void keyPredicatesInDoubleExpandedFilter() throws Exception { - testUri.run("ESKeyNav(0)", "$expand=NavPropertyETTwoKeyNavMany($expand=NavPropertyETTwoKeyNavMany" - + "($filter=NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='2')/PropertyInt16 eq 1))") - .goExpand() - .first().goPath().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .goUpExpandValidator().goExpand() - .first().goPath().isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .goUpExpandValidator().goFilter() - .is("< eq <1>>"); - } - - @Test - public void filterSystemQueryOptionManyWithKeyAny() throws Exception { - testFilter.runUriEx("ESAllPrim", "$filter=NavPropertyETTwoPrimMany(1)/any(d:d/PropertyInt16 eq 0)") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - } - - @Test - public void filterSystemQueryOptionManyWithKeyAll() throws Exception { - testFilter.runUriEx("ESAllPrim", "$filter=NavPropertyETTwoPrimMany(1)/all(d:d/PropertyInt16 eq 0)") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - } - - @Test - public void navigationPropertyWithCount() throws Exception { - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany/$count") - .goPath().at(0).isEntitySet("ESKeyNav").isKeyPredicate(0, "PropertyInt16", "1") - .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, true) - .at(2).isCount(); - } - - @Test - public void navigationWithMoreThanOneKey() throws Exception { - testUri.runEx("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='2')" - + "(PropertyInt16=1,PropertyString='2')") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - } - - @Test - public void startElementsInsteadOfNavigationProperties() { - testUri.runEx("ESAllPrim(0)/ESAllPrim(0)/ESAllPrim(0)").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("ESAllPrim(0)/SINav").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("ESAllPrim(0)/FICRTString()").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("ESAllPrim(0)/AIRTString").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("SI/ESAllPrim(0)").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("SI/SINav").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("SI/FICRTString()").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("SI/AIRTString").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("FICRTETKeyNav()/ESAllPrim(0)").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("FICRTETKeyNav()/SINav").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("FICRTETKeyNav()/FICRTString()").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("FICRTETKeyNav()/AIRTString").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); - testUri.runEx("AIRTESAllPrimParam/ESAllPrim(0)") - .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); - testUri.runEx("AIRTESAllPrimParam/SINav") - .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); - testUri.runEx("AIRTESAllPrimParam/FICRTString()") - .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); - testUri.runEx("AIRTESAllPrimParam/AIRTString") - .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); - } - - @Test - public void invalidTypeCast() { - testUri.runEx("ESAllPrim/namespace.Invalid").isExSemantic(MessageKeys.UNKNOWN_TYPE); - testUri.runEx("ESAllPrim(0)/namespace.Invalid").isExSemantic(MessageKeys.UNKNOWN_TYPE); - } - - @Test - public void firstResourcePathWithNamespace() { - testUri.runEx("olingo.odata.test1.ESAllPrim").isExSemantic(MessageKeys.NAMESPACE_NOT_ALLOWED_AT_FIRST_ELEMENT); - testUri.runEx("olingo.odata.test1.ESAllPrim(0)").isExSemantic(MessageKeys.NAMESPACE_NOT_ALLOWED_AT_FIRST_ELEMENT); - testUri.runEx("olingo.odata.test1.FINRTInt16()").isExSemantic(MessageKeys.NAMESPACE_NOT_ALLOWED_AT_FIRST_ELEMENT); - testUri.runEx("olingo.odata.test1.AIRTString").isExSemantic(MessageKeys.NAMESPACE_NOT_ALLOWED_AT_FIRST_ELEMENT); - testUri.runEx("olingo.odata.test1.SINav").isExSemantic(MessageKeys.NAMESPACE_NOT_ALLOWED_AT_FIRST_ELEMENT); - } - - @Test - public void filterLiteralTypes() throws Exception { - testFilter.runOnETAllPrim("-1000 eq 42") - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral("-1000").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16)) - .root() - .right().isLiteral("42").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.SByte)); - - testFilter.runOnETAllPrim("127 eq 128") - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral("127").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.SByte)) - .root() - .right().isLiteral("128").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Byte)); - - testFilter.runOnETAllPrim("null eq 42.1") - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral("null").isLiteralType(null) - .root() - .right().isLiteral("42.1").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Decimal)); - - testFilter.runOnETAllPrim("15.6E300 eq 3.4E37") - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral("15.6E300") - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Double)) - .root() - .right().isLiteral("3.4E37").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Double)); - - testFilter.runOnETAllPrim("15.55555555555555555555555555555555555555555555 eq -12345678901234567890") - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral("15.55555555555555555555555555555555555555555555") - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Decimal)) - .root() - .right().isLiteral("-12345678901234567890") - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Decimal)); - - testFilter.runOnETAllPrim("duration'PT1H2S' eq duration'PT3602S'") - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral("duration'PT1H2S'") - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Duration)) - .root() - .right().isLiteral("duration'PT3602S'") - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Duration)); - - testFilter.runOnETAllPrim("2013-11-02 ne 2012-12-03") - .isBinary(BinaryOperatorKind.NE) - .left().isLiteral("2013-11-02").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Date)) - .root() - .right().isLiteral("2012-12-03").isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Date)); - - testFilter.runOnETAllPrim("null eq 2012-12-03T07:16:23Z") - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral("null") - .isLiteralType(null) - .root() - .right().isLiteral("2012-12-03T07:16:23Z") - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.DateTimeOffset)); - - testFilter.runOnETAllPrim("07:59:59.999 eq null") - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral("07:59:59.999") - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.TimeOfDay)) - .root() - .right().isLiteral("null").isLiteralType(null); - - testFilter.runOnETAllPrim("null eq 01234567-89ab-cdef-0123-456789abcdef") - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral("null").isLiteralType(null) - .root() - .right().isLiteral("01234567-89ab-cdef-0123-456789abcdef") - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Guid)); - - testFilter.runOnETAllPrim("binary'VGVzdA==' eq null") - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral("binary'VGVzdA=='").isLiteralType( - oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Binary)) - .root() - .right().isLiteral("null").isLiteralType(null); - - testFilter.runOnETAllPrim(Short.MIN_VALUE + " eq " + Short.MAX_VALUE) - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral(Short.toString(Short.MIN_VALUE)) - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16)) - .root() - .right().isLiteral(Short.toString(Short.MAX_VALUE)) - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16)); - - testFilter.runOnETAllPrim(Integer.MIN_VALUE + " eq " + Integer.MAX_VALUE) - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral(Integer.toString(Integer.MIN_VALUE)) - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int32)) - .root() - .right().isLiteral(Integer.toString(Integer.MAX_VALUE)) - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int32)); - - testFilter.runOnETAllPrim(Long.MIN_VALUE + " eq " + Long.MAX_VALUE) - .isBinary(BinaryOperatorKind.EQ) - .left().isLiteral(Long.toString(Long.MIN_VALUE)) - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int64)) - .root() - .right().isLiteral(Long.toString(Long.MAX_VALUE)) - .isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int64)); - } - - @Test - public void alias() throws Exception { - testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString=@A)", "@A='2'").goPath() - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicateAlias(1, "PropertyString", "@A") - .goUpUriValidator().isInAliasToValueMap("@A", "'2'"); - testUri.run("ESAllPrim(PropertyInt16=@p1)", "@p1=1").goPath() - .isKeyPredicateAlias(0, "PropertyInt16", "@p1") - .goUpUriValidator().isInAliasToValueMap("@p1", "1"); - testUri.run("ESAllPrim(@p1)", "@p1=-2").goPath() - .isKeyPredicateAlias(0, "PropertyInt16", "@p1") - .goUpUriValidator().isInAliasToValueMap("@p1", "-2"); - - testFilter.runOnETAllPrim("PropertyInt16 gt @alias&@alias=1") - .right().isAlias("@alias"); - testFilter.runOnETAllPrim("@alias&@alias=@otherAlias&@otherAlias=true") - .isAlias("@alias"); - - testUri.runEx("ESAllPrim(@p1)") - .isExValidation(UriValidationException.MessageKeys.MISSING_ALIAS); - testUri.runEx("ESAllPrim(PropertyInt16=@p1)", "@p1='ewe'").isExSemantic(MessageKeys.UNKNOWN_PART); - testUri.runEx("ESAllPrim(PropertyInt16=@p1)", "@p1='ewe") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - testFilter.runOnETKeyNavEx("PropertyInt16 gt @alias") - .isInAliasToValueMap("@alias", null); - testFilter.runOnETKeyNavEx("PropertyInt16 gt @alias&@alias=@alias") - .isInAliasToValueMap("@alias", "@alias"); - testFilter.runOnETKeyNavEx("@alias&@alias=@alias2&@alias2=true or @alias") - .isInAliasToValueMap("@alias", "@alias2"); - } - - @Test - public void functionImportParameterAlias() throws Exception { - testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=@parameterAlias)", "@parameterAlias=1"); - testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=@parameterAlias)/$count", "@parameterAlias=1"); - testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=@invalidAlias)", "@validAlias=1") - .isExValidation(UriValidationException.MessageKeys.MISSING_ALIAS); - } - - @Test - public void functionsWithComplexParameters() throws Exception { - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1)", "@p1={\"PropertyInt16\":1,\"PropertyString\":\"1\"}") - .goPath() - .at(0).isEntitySet("ESTwoKeyNav") - .at(1).isFunction("BFCESTwoKeyNavRTStringParam").isParameterAlias(0, "ParameterComp", "@p1") - .goUpUriValidator().isInAliasToValueMap("@p1", "{\"PropertyInt16\":1,\"PropertyString\":\"1\"}"); - - // Test JSON String lexer rule =\"3,Int16=abc},\\\nabc&test%test\b\f\r\t\u0022\\}\\{\\)\\(\\]\\[} - final String stringValueEncoded = "=\\\"3,Int16=abc},\\\\\\nabc%26test%25test\\b\\f\\r\\t\\u0022\\\\}\\\\{\\\\)" - + "\\\\(\\\\]\\\\[}"; - final String stringValueDecoded = "=\\\"3,Int16=abc},\\\\\\nabc&test%test\\b\\f\\r\\t\\u0022\\\\}\\\\{\\\\)" - + "\\\\(\\\\]\\\\[}"; - - testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1)", "@p1={\"PropertyInt16\":1,\"PropertyString\":\"" + stringValueEncoded + "\"}") - .goPath() - .at(0).isEntitySet("ESTwoKeyNav") - .at(1).isFunction("BFCESTwoKeyNavRTStringParam").isParameterAlias(0, "ParameterComp", "@p1") - .goUpUriValidator() - .isInAliasToValueMap("@p1", "{\"PropertyInt16\":1,\"PropertyString\":\"" + stringValueDecoded + "\"}"); - - testFilter.runOnETTwoKeyNav("olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp={\"PropertyString\":\"Test\",\"PropertyInt16\":1}) eq 'Test'") - .is("< eq <'Test'>>") - .isBinary(BinaryOperatorKind.EQ) - .left().isParameterText(0, "{\"PropertyString\":\"Test\",\"PropertyInt16\":1}"); - - testFilter.runOnETTwoKeyNav("olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp={\"PropertyString\":\"" + stringValueEncoded + "\",\"PropertyInt16\":1}) eq 'Test'") - .is("< eq <'Test'>>") - .left().isParameterText(0, "{\"PropertyString\":\"" + stringValueDecoded + "\",\"PropertyInt16\":1}"); - - testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":1,\"PropertyString\":\"1\"}"); - - testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":1,\"PropertyString\":null}") - .goFilter().left().isParameterText(0, null); - - testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1) eq '0'&@p1={}"); - - testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[1,2,3],\"PropertyString\":\"1\"}"); - - testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[\"1\",\"2\",\"3\"],\"PropertyString\":\"1\"}"); - - testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[{\"Prop1\":123,\"Prop2\":\"Test\",\"Prop3\":[1,2,3]}," - + "{\"Prop1\":{\"Prop1\":[\"Prop\\\":{]\"]}}],\"PropertyString\":\"1\"}"); - - testUri.run("FINRTByteNineParam(ParameterEnum=null,ParameterDef='x',ParameterComp=@c," - + "ParameterETTwoPrim=@c,CollParameterByte=@e,CollParameterEnum=@e,CollParameterDef=@e," - + "CollParameterComp=@e,CollParameterETTwoPrim=@e)", - "@c={}&@e=[]"); - - testUri.runEx("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1)", "@p1={\"PropertyInt16\":1,\"PropertyString\":'1'}") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - - testUri.runEx("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp={\"PropertyInt16\":1,\"PropertyString\":\"Test\"})") - .isExSemantic(MessageKeys.COMPLEX_PARAMETER_IN_RESOURCE_PATH); - - testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=null)") - .isExValidation(UriValidationException.MessageKeys.MISSING_PARAMETER); - - testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)") - .isExValidation(UriValidationException.MessageKeys.MISSING_ALIAS); - - testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test=null") - .isExValidation(UriValidationException.MessageKeys.MISSING_ALIAS); - - testUri.run("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test='null'"); - - testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test,UnknownParam=1)", "@test='null'") - .isExSemantic(MessageKeys.FUNCTION_NOT_FOUND); - - testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test='null'"); - testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test=null"); - testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)"); - testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=null)"); - - testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test=null&@test='1'") - .isExSyntax(UriParserSyntaxException.MessageKeys.DUPLICATED_ALIAS); - - testFilter.runOnETKeyNavEx("FINRTInt16() eq 0") - .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); - - testUri.runEx("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":1,\"PropertyString\":\"1\"") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - - testUri.runEx("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":1,\"PropertyString\":\"1\"}}") - .isExSemantic(MessageKeys.UNKNOWN_PART); - - testUri.runEx("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[1,2,3]],\"PropertyString\":\"1\"}") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - - testUri.runEx("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[1,2,3,\"PropertyString\":\"1\"}") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - - testUri.runEx("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" - + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[1,2,3},\"PropertyString\":\"1\"}") - .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); - } - - @Test - public void keyPredicatesInExpressions() throws Exception { - testFilter.runOnETTwoKeyNav("NavPropertyETTwoKeyNavMany(PropertyString='1',PropertyInt16=1)" - + "/PropertyInt16 eq 1"); - testUri.runEx("ESTwoKeyNav", "$filter=NavPropertyETTwoKeyNavMany(Prop='22',P=2)/PropertyInt16 eq 0") - .isExValidation(UriValidationException.MessageKeys.INVALID_KEY_PROPERTY); - } -} diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/TestUriParserImpl.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/TestUriParserImpl.java deleted file mode 100644 index 6c7feec58..000000000 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/TestUriParserImpl.java +++ /dev/null @@ -1,1047 +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.server.core.uri.parser; - -import java.util.Arrays; -import java.util.Collections; - -import org.apache.olingo.commons.api.edm.Edm; -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; -import org.apache.olingo.commons.api.edmx.EdmxReference; -import org.apache.olingo.server.api.OData; -import org.apache.olingo.server.api.uri.UriInfoKind; -import org.apache.olingo.server.api.uri.UriResourceKind; -import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind; -import org.apache.olingo.server.core.uri.testutil.FilterValidator; -import org.apache.olingo.server.core.uri.testutil.ResourceValidator; -import org.apache.olingo.server.core.uri.testutil.TestUriValidator; -import org.apache.olingo.server.core.uri.validator.UriValidationException; -import org.apache.olingo.server.tecsvc.provider.ActionProvider; -import org.apache.olingo.server.tecsvc.provider.ComplexTypeProvider; -import org.apache.olingo.server.tecsvc.provider.ContainerProvider; -import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; -import org.apache.olingo.server.tecsvc.provider.EntityTypeProvider; -import org.apache.olingo.server.tecsvc.provider.PropertyProvider; -import org.junit.Test; - -public class TestUriParserImpl { - private static final OData oData = OData.newInstance(); - private final Edm edm = oData.createServiceMetadata( - new EdmTechProvider(), Collections. emptyList()).getEdm(); - private final TestUriValidator testUri = new TestUriValidator().setEdm(edm); - private final ResourceValidator testRes = new ResourceValidator().setEdm(edm); - private final FilterValidator testFilter = new FilterValidator().setEdm(edm); - - private final String PropertyBoolean = "PropertyBoolean=true"; - private final String PropertyByte = "PropertyByte=1"; - private final String PropertyDate = "PropertyDate=2013-09-25"; - private final String PropertyDateTimeOffset = "PropertyDateTimeOffset=2002-10-10T12:00:00-05:00"; - private final String PropertyDecimal = "PropertyDecimal=12"; - private final String PropertyDuration = "PropertyDuration=duration'P50903316DT2H25M4S'"; - private final String PropertyGuid = "PropertyGuid=12345678-1234-1234-1234-123456789012"; - private final String PropertyInt16 = "PropertyInt16=1"; - private final String PropertyInt32 = "PropertyInt32=12"; - private final String PropertyInt64 = "PropertyInt64=64"; - private final String PropertySByte = "PropertySByte=1"; - private final String PropertyString = "PropertyString='ABC'"; - private final String PropertyTimeOfDay = "PropertyTimeOfDay=12:34:55"; - - private final String allKeys = PropertyString + "," + PropertyInt16 + "," + PropertyBoolean + "," + PropertyByte - + "," + PropertySByte + "," + PropertyInt32 + "," + PropertyInt64 + "," + PropertyDecimal + "," + PropertyDate - + "," + PropertyDateTimeOffset + "," + PropertyDuration + "," + PropertyGuid + "," + PropertyTimeOfDay; - - @Test - public void boundFunctionImport_VarParameters() { - // no input - testRes.run("ESKeyNav(1)/olingo.odata.test1.BFCETKeyNavRTETKeyNav()") - .at(0).isUriPathInfoKind(UriResourceKind.entitySet) - .at(1).isUriPathInfoKind(UriResourceKind.function); - - // one input - testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_(ParameterString='ABC')") - .at(0).isUriPathInfoKind(UriResourceKind.entitySet) - .at(1).isUriPathInfoKind(UriResourceKind.function) - .isParameter(0, "ParameterString", "'ABC'"); - - // two input - testRes.run("FICRTCollETMixPrimCollCompTwoParam(ParameterInt16=1,ParameterString='2')") - .at(0) - .isUriPathInfoKind(UriResourceKind.function) - .isParameter(0, "ParameterInt16", "1") - .isParameter(1, "ParameterString", "'2'"); - } - - @Test - public void functionBound_varReturnType() { - final String esTwoKeyNav = "ESTwoKeyNav(PropertyInt16=1,PropertyString='ABC')"; - - // returning primitive - testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTString()") - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .at(1) - .isUriPathInfoKind(UriResourceKind.function) - .isType(PropertyProvider.nameString, false); - - // returning collection of primitive - testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollString()") - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .at(1) - .isUriPathInfoKind(UriResourceKind.function) - .isType(PropertyProvider.nameString, true); - - // returning single complex - testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCTTwoPrim()") - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .at(1) - .isUriPathInfoKind(UriResourceKind.function) - .isType(ComplexTypeProvider.nameCTTwoPrim, false); - - // returning collection of complex - testRes.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTCollCTTwoPrim()") - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, true) - .at(1) - .isUriPathInfoKind(UriResourceKind.function) - .isType(ComplexTypeProvider.nameCTTwoPrim, true); - - // returning single entity - testRes.run( - esTwoKeyNav + "/olingo.odata.test1.ETBaseTwoKeyNav/olingo.odata.test1.BFCETBaseTwoKeyNavRTETTwoKeyNav()") - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) - .at(1) - .isUriPathInfoKind(UriResourceKind.function) - .isType(EntityTypeProvider.nameETTwoKeyNav, false); - - // returning collection of entity (aka entitySet) - testRes.run(esTwoKeyNav + "/olingo.odata.test1.BFCSINavRTESTwoKeyNav()") - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .at(1) - .isUriPathInfoKind(UriResourceKind.function) - .isType(EntityTypeProvider.nameETTwoKeyNav, true); - } - - @Test - public void actionImport_VarReturnType() { - testRes.run(ContainerProvider.AIRT_STRING).isKind(UriInfoKind.resource) - .first() - .isActionImport(ContainerProvider.AIRT_STRING) - .isAction(ActionProvider.nameUARTString.getName()) - .isType(PropertyProvider.nameString, false); - - testRes.run(ContainerProvider.AIRT_COLL_STRING_TWO_PARAM).isKind(UriInfoKind.resource) - .first() - .isActionImport(ContainerProvider.AIRT_COLL_STRING_TWO_PARAM) - .isAction(ActionProvider.nameUARTCollStringTwoParam.getName()) - .isType(PropertyProvider.nameString, true); - - testRes.run(ContainerProvider.AIRTCT_TWO_PRIM_PARAM).isKind(UriInfoKind.resource) - .first() - .isActionImport(ContainerProvider.AIRTCT_TWO_PRIM_PARAM) - .isAction(ActionProvider.nameUARTCTTwoPrimParam.getName()) - .isType(ComplexTypeProvider.nameCTTwoPrim, false); - - testRes.run(ContainerProvider.AIRT_COLL_CT_TWO_PRIM_PARAM).isKind(UriInfoKind.resource) - .first() - .isActionImport(ContainerProvider.AIRT_COLL_CT_TWO_PRIM_PARAM) - .isAction(ActionProvider.nameUARTCollCTTwoPrimParam.getName()) - .isType(ComplexTypeProvider.nameCTTwoPrim, true); - - testRes.run(ContainerProvider.AIRTET_TWO_KEY_TWO_PRIM_PARAM).isKind(UriInfoKind.resource) - .first() - .isActionImport(ContainerProvider.AIRTET_TWO_KEY_TWO_PRIM_PARAM) - .isAction(ActionProvider.nameUARTETTwoKeyTwoPrimParam.getName()) - .isType(EntityTypeProvider.nameETTwoKeyTwoPrim, false); - - testUri.runEx(ContainerProvider.AIRT_STRING + "/invalidElement") - .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); - } - - @Test - public void count() { - // count entity set - testRes.run("ESAllPrim/$count") - .at(0) - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETAllPrim, true) - .at(1) - .isUriPathInfoKind(UriResourceKind.count); - - // count on collection of complex - testRes.run("ESKeyNav(1)/CollPropertyComp/$count") - .at(0) - .isType(EntityTypeProvider.nameETKeyNav) - .at(1) - .isType(ComplexTypeProvider.nameCTPrimComp, true) - .at(2) - .isUriPathInfoKind(UriResourceKind.count); - - // count on collection of primitive - testRes.run("ESCollAllPrim(1)/CollPropertyString/$count") - .at(1) - .isType(PropertyProvider.nameString, true) - .at(2) - .isUriPathInfoKind(UriResourceKind.count); - } - - @Test - public void crossJoin() throws Exception { - testUri.run("$crossjoin(ESAllKey)") - .isKind(UriInfoKind.crossjoin) - .isCrossJoinEntityList(Arrays.asList("ESAllKey")); - - testUri.run("$crossjoin(ESAllKey,ESTwoPrim)") - .isKind(UriInfoKind.crossjoin) - .isCrossJoinEntityList(Arrays.asList("ESAllKey", "ESTwoPrim")); - } - - @Test - public void entityFailOnValidation() throws Exception { - // simple entity set; with qualifiedentityTypeName; with filter - testUri.runEx("$entity/olingo.odata.test1.ETTwoPrim", "$filter=PropertyInt16 eq 123&$id=ESAllPrim(1)") - .isExValidation(UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED); - } - - @Test - public void entity() throws Exception { - // simple entity set - testUri.run("$entity", "$id=ESAllPrim(1)").isKind(UriInfoKind.entityId) - .isKind(UriInfoKind.entityId) - .isIdText("ESAllPrim(1)"); - - // simple entity set; $format before $id - testUri.run("$entity", "$format=xml&$id=ESAllPrim(1)").isKind(UriInfoKind.entityId) - .isFormatText("xml") - .isIdText("ESAllPrim(1)"); - - testUri.run("$entity", "$format=xml&abc=123&$id=ESAllPrim(1)").isKind(UriInfoKind.entityId) - .isFormatText("xml") - .isCustomParameter(0, "abc", "123") - .isIdText("ESAllPrim(1)"); - - // simple entity set; $format after $id - testUri.run("$entity", "$id=ESAllPrim(1)&$format=xml").isKind(UriInfoKind.entityId) - .isIdText("ESAllPrim(1)") - .isFormatText("xml"); - - // simple entity set; $format and custom parameter after $id - testUri.run("$entity", "$id=ESAllPrim(1)&$format=xml&abc=123").isKind(UriInfoKind.entityId) - .isIdText("ESAllPrim(1)") - .isFormatText("xml") - .isCustomParameter(0, "abc", "123"); - - // simple entity set; $format before $id and custom parameter after $id - testUri.run("$entity", "$format=xml&$id=ESAllPrim(1)&abc=123").isKind(UriInfoKind.entityId) - .isFormatText("xml") - .isIdText("ESAllPrim(1)") - .isCustomParameter(0, "abc", "123"); - - // simple entity set; with qualifiedentityTypeName - testUri.run("$entity/olingo.odata.test1.ETTwoPrim", "$id=ESBase(111)") - .isEntityType(EntityTypeProvider.nameETTwoPrim) - .isIdText("ESBase(111)"); - - // simple entity set; with qualifiedentityTypeName; - testUri.run("$entity/olingo.odata.test1.ETBase", "$id=ESTwoPrim(1)") - .isEntityType(EntityTypeProvider.nameETBase) - .isKind(UriInfoKind.entityId) - .isIdText("ESTwoPrim(1)"); - - // simple entity set; with qualifiedentityTypeName; with format - testUri.run("$entity/olingo.odata.test1.ETBase", "$id=ESTwoPrim(1)&$format=atom") - .isKind(UriInfoKind.entityId) - .isEntityType(EntityTypeProvider.nameETBase) - .isIdText("ESTwoPrim(1)") - .isFormatText("atom"); - - // simple entity set; with qualifiedentityTypeName; with select - testUri.run("$entity/olingo.odata.test1.ETBase", "$id=ESTwoPrim(1)&$select=*") - .isKind(UriInfoKind.entityId) - .isEntityType(EntityTypeProvider.nameETBase) - .isIdText("ESTwoPrim(1)") - .isSelectItemStar(0); - - // simple entity set; with qualifiedentityTypeName; with expand - testUri.run("$entity/olingo.odata.test1.ETBase", "$id=ESTwoPrim(1)&$expand=*") - .isKind(UriInfoKind.entityId) - .isEntityType(EntityTypeProvider.nameETBase) - .isIdText("ESTwoPrim(1)") - .goExpand().first().isSegmentStar(); - } - - @Test - public void entitySet() throws Exception { - // plain entity set - testRes.run("ESAllPrim") - .isEntitySet("ESAllPrim") - .isType(EntityTypeProvider.nameETAllPrim); - - // with one key; simple key notation - testRes.run("ESAllPrim(1)") - .isEntitySet("ESAllPrim") - .isType(EntityTypeProvider.nameETAllPrim) - .isKeyPredicate(0, "PropertyInt16", "1"); - - // with one key; name value key notation - testRes.run("ESAllPrim(PropertyInt16=1)") - .isEntitySet("ESAllPrim") - .isKeyPredicate(0, "PropertyInt16", "1"); - - // with two keys - testRes.run("ESTwoKeyTwoPrim(PropertyInt16=1,PropertyString='ABC')") - .isEntitySet("ESTwoKeyTwoPrim") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'ABC'"); - - // with all keys - testRes.run("ESAllKey(" + allKeys + ")") - .isEntitySet("ESAllKey") - .isKeyPredicate(0, "PropertyString", "'ABC'") - .isKeyPredicate(1, "PropertyInt16", "1") - .isKeyPredicate(2, "PropertyBoolean", "true") - .isKeyPredicate(3, "PropertyByte", "1") - .isKeyPredicate(4, "PropertySByte", "1") - .isKeyPredicate(5, "PropertyInt32", "12") - .isKeyPredicate(6, "PropertyInt64", "64") - .isKeyPredicate(7, "PropertyDecimal", "12") - .isKeyPredicate(8, "PropertyDate", "2013-09-25") - .isKeyPredicate(9, "PropertyDateTimeOffset", "2002-10-10T12:00:00-05:00") - .isKeyPredicate(10, "PropertyDuration", "duration'P50903316DT2H25M4S'") - .isKeyPredicate(11, "PropertyGuid", "12345678-1234-1234-1234-123456789012") - .isKeyPredicate(12, "PropertyTimeOfDay", "12:34:55"); - } - - @Test - public void entitySet_NavigationProperty() { - // with navigation property - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne") - .at(0) - .isEntitySet("ESKeyNav") - .isType(EntityTypeProvider.nameETKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(1) - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .isType(EntityTypeProvider.nameETTwoKeyNav); - - // with navigation property -> property - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/PropertyString") - .at(0) - .isEntitySet("ESKeyNav") - .isType(EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(1) - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .at(2) - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - // with navigation property -> navigation property -> navigation property - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/NavPropertyETKeyNavOne") - .at(0) - .isEntitySet("ESKeyNav") - .isType(EntityTypeProvider.nameETKeyNav) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(1) - .isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .isType(EntityTypeProvider.nameETTwoKeyNav) - .at(2) - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .isType(EntityTypeProvider.nameETKeyNav); - - // with navigation property(key) - testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(1)") - .at(0) - .isEntitySet("ESKeyNav") - .at(1) - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1"); - - // with navigation property(key) -> property - testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(1)/PropertyString").at(0) - .at(0) - .isEntitySet("ESKeyNav") - .at(1) - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(2) - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - // with navigation property(key) -> navigation property - testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(1)/NavPropertyETKeyNavOne") - .isEntitySet("ESKeyNav") - .at(1) - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(2) - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false); - - // with navigation property(key) -> navigation property(key) - testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(1)/NavPropertyETKeyNavMany(1)") - .isEntitySet("ESKeyNav") - .isType(EntityTypeProvider.nameETKeyNav) - .at(1) - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(2) - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1"); - - // with navigation property(key) -> navigation property -> property - testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(1)/NavPropertyETKeyNavOne/PropertyString") - .at(0) - .isEntitySet("ESKeyNav") - .isType(EntityTypeProvider.nameETKeyNav) - .at(1) - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(2) - .isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .isType(EntityTypeProvider.nameETKeyNav) - .at(3) - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - // with navigation property(key) -> navigation property(key) -> property - testRes.run("ESKeyNav(1)/NavPropertyETKeyNavMany(1)/NavPropertyETKeyNavMany(1)/PropertyString") - .at(0) - .isEntitySet("ESKeyNav") - .isType(EntityTypeProvider.nameETKeyNav) - .at(1) - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(2) - .isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(3) - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - } - - @Test - public void entitySet_Property() { - // with property - testRes.run("ESAllPrim(1)/PropertyString") - .at(0) - .isEntitySet("ESAllPrim") - .isKeyPredicate(0, "PropertyInt16", "1") - .at(1) - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - // with complex property - testRes.run("ESCompAllPrim(1)/PropertyComp") - .at(0) - .isEntitySet("ESCompAllPrim") - .isKeyPredicate(0, "PropertyInt16", "1") - .at(1) - .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false); - - // with two properties - testRes.run("ESCompAllPrim(1)/PropertyComp/PropertyString") - .at(0) - .isEntitySet("ESCompAllPrim") - .isKeyPredicate(0, "PropertyInt16", "1") - .at(1) - .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTAllPrim, false) - .at(2) - .isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - } - - @Test - public void entitySet_TypeFilter() { - // filter - testRes.run("ESTwoPrim/olingo.odata.test1.ETBase") - .at(0) - .isEntitySet("ESTwoPrim") - .isType(EntityTypeProvider.nameETTwoPrim, true) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBase) - .isTypeFilterOnEntry(null); - - // filter before key predicate - testRes.run("ESTwoPrim/olingo.odata.test1.ETBase(PropertyInt16=1)") - .at(0) - .isEntitySet("ESTwoPrim") - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoPrim) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBase) - .isTypeFilterOnEntry(null) - .at(0) - .isType(EntityTypeProvider.nameETTwoPrim, false) - .isKeyPredicate(0, "PropertyInt16", "1"); - - // filter before key predicate; property of sub type - testRes.run("ESTwoPrim/olingo.odata.test1.ETBase(PropertyInt16=1)/AdditionalPropertyString_5") - .at(0) - .isEntitySet("ESTwoPrim") - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoPrim) - .isTypeFilterOnCollection(EntityTypeProvider.nameETBase) - .isTypeFilterOnEntry(null) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(1) - .isType(PropertyProvider.nameString) - .isPrimitiveProperty("AdditionalPropertyString_5", PropertyProvider.nameString, false); - - // filter after key predicate - testRes.run("ESTwoPrim(PropertyInt16=1)/olingo.odata.test1.ETBase") - .at(0) - .isEntitySet("ESTwoPrim") - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoPrim, false) - .isTypeFilterOnCollection(null) - .isTypeFilterOnEntry(EntityTypeProvider.nameETBase) - .isKeyPredicate(0, "PropertyInt16", "1"); - - // filter after key predicate; property of sub type - testRes.run("ESTwoPrim(PropertyInt16=1)/olingo.odata.test1.ETBase/AdditionalPropertyString_5") - .at(0) - .isEntitySet("ESTwoPrim") - .isUriPathInfoKind(UriResourceKind.entitySet) - .isType(EntityTypeProvider.nameETTwoPrim) - .isTypeFilterOnCollection(null) - .isTypeFilterOnEntry(EntityTypeProvider.nameETBase) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(1) - .isPrimitiveProperty("AdditionalPropertyString_5", PropertyProvider.nameString, false) - .isType(PropertyProvider.nameString); - } - - @Test - public void unary() throws Exception { - testFilter.runOnETAllPrim("not PropertyBoolean").is(">"); - testFilter.runOnETAllPrim("-PropertyInt16 eq PropertyInt16").is("<<- > eq >"); - } - - @Test - public void filterComplexMixedPriority() throws Exception { - testFilter.runOnETAllPrim("PropertyBoolean or true and false") - .is("< or < and >>"); - testFilter.runOnETAllPrim("PropertyBoolean or true and PropertyInt64 eq PropertyByte") - .is("< or < and < eq >>>"); - testFilter.runOnETAllPrim("PropertyBoolean or PropertyInt32 eq PropertyInt64 and true") - .is("< or << eq > and >>"); - testFilter.runOnETAllPrim("PropertyBoolean or PropertyInt32 eq PropertyInt64 and PropertyByte eq PropertySByte") - .is("< or << eq > " - + "and < eq >>>"); - testFilter.runOnETAllPrim("PropertyInt16 eq PropertyInt32 or PropertyBoolean and true") - .is("<< eq > or < and >>"); - testFilter.runOnETAllPrim("PropertyInt16 eq PropertyInt32 or PropertyBoolean and PropertyByte eq PropertySByte") - .is("<< eq > " - + "or < and < eq >>>"); - testFilter.runOnETAllPrim("PropertyInt16 eq PropertyInt32 or PropertyInt64 eq PropertyByte and PropertyBoolean") - .is("<< eq > " - + "or << eq > and >>"); - testFilter.runOnETAllPrim("PropertyInt16 eq PropertyInt32 or PropertyInt64 eq PropertyByte " - + "and PropertySByte eq PropertyDecimal") - .is("<< eq > or << eq > " - + "and < eq >>>"); - } - - @Test - public void filterSimpleSameBinaryBinaryBinaryPriority() throws Exception { - testFilter.runOnETAllPrim("1 add 2 add 3 add 4 ge 0").isCompr("<<<< <1> add <2>> add <3>> add <4>> ge <0>>"); - testFilter.runOnETAllPrim("1 add 2 add 3 div 4 ge 0").isCompr("<<< <1> add <2>> add <<3> div <4>>> ge <0>>"); - testFilter.runOnETAllPrim("1 add 2 div 3 add 4 ge 0").isCompr("<<< <1> add <<2> div <3>>> add <4>> ge <0>>"); - testFilter.runOnETAllPrim("1 add 2 div 3 div 4 ge 0").isCompr("<< <1> add <<<2> div <3>> div <4>>> ge <0>>"); - testFilter.runOnETAllPrim("1 div 2 add 3 add 4 ge 0").isCompr("<<<< <1> div <2>> add <3>> add <4>> ge <0>>"); - testFilter.runOnETAllPrim("1 div 2 add 3 div 4 ge 0").isCompr("<<< <1> div <2>> add <<3> div <4>>> ge <0>>"); - testFilter.runOnETAllPrim("1 div 2 div 3 add 4 ge 0").isCompr("<<<< <1> div <2>> div <3>> add <4>> ge <0>>"); - testFilter.runOnETAllPrim("1 div 2 div 3 div 4 ge 0").isCompr("<<<< <1> div <2>> div <3>> div <4>> ge <0>>"); - } - - @Test - public void functionImport_VarParameters() { - // no input - testRes.run("FINRTInt16()") - .isFunctionImport("FINRTInt16") - .isFunction("UFNRTInt16") - .isType(PropertyProvider.nameInt16); - - // one input - testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)") - .isFunctionImport("FICRTETTwoKeyNavParam") - .isFunction("UFCRTETTwoKeyNavParam") - .isType(EntityTypeProvider.nameETTwoKeyNav); - - // two input - testRes.run("FICRTStringTwoParam(ParameterString='ABC',ParameterInt16=1)") - .isFunctionImport("FICRTStringTwoParam") - .isFunction("UFCRTStringTwoParam") - .isType(PropertyProvider.nameString); - } - - @Test - public void functionImport_VarReturning() { - // returning primitive - testRes.run("FINRTInt16()") - .isFunctionImport("FINRTInt16") - .isFunction("UFNRTInt16") - .isType(PropertyProvider.nameInt16, false); - - // returning collection of primitive - testRes.run("FICRTCollStringTwoParam(ParameterString='ABC',ParameterInt16=1)") - .isFunctionImport("FICRTCollStringTwoParam") - .isFunction("UFCRTCollStringTwoParam") - .isType(PropertyProvider.nameString, true); - - // returning single complex - testRes.run("FICRTCTAllPrimTwoParam(ParameterString='ABC',ParameterInt16=1)") - .isFunctionImport("FICRTCTAllPrimTwoParam") - .isFunction("UFCRTCTAllPrimTwoParam") - .isType(ComplexTypeProvider.nameCTAllPrim, false); - - // returning collection of complex - testRes.run("FICRTCollCTTwoPrim()") - .isFunctionImport("FICRTCollCTTwoPrim") - .isFunction("UFCRTCollCTTwoPrim") - .isType(ComplexTypeProvider.nameCTTwoPrim, true); - - // returning single entity - testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)") - .isFunctionImport("FICRTETTwoKeyNavParam") - .isFunction("UFCRTETTwoKeyNavParam") - .isType(EntityTypeProvider.nameETTwoKeyNav, false); - - // returning collection of entity (aka entitySet) - testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)") - .isFunctionImport("FICRTCollESTwoKeyNavParam") - .isFunction("UFCRTCollETTwoKeyNavParam") - .isType(EntityTypeProvider.nameETTwoKeyNav, true); - } - - @Test - public void functionImportChain() { - // test chain; returning single complex - testRes.run("FICRTCTAllPrimTwoParam(ParameterString='ABC',ParameterInt16=1)/PropertyInt16") - .at(0) - .isFunctionImport("FICRTCTAllPrimTwoParam") - .isFunction("UFCRTCTAllPrimTwoParam") - .isType(ComplexTypeProvider.nameCTAllPrim, false) - .isParameter(0, "ParameterString", "'ABC'") - .isParameter(1, "ParameterInt16", "1") - .at(1) - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - // test chains; returning single entity - testRes.run("FICRTETTwoKeyNavParam(ParameterInt16=1)/PropertyInt16") - .at(0) - .isFunctionImport("FICRTETTwoKeyNavParam") - .isFunction("UFCRTETTwoKeyNavParam") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isParameter(0, "ParameterInt16", "1") - .at(1) - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - // test chains; returning collection of entity (aka entitySet) - testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,PropertyString='ABC')") - .at(0) - .isFunctionImport("FICRTCollESTwoKeyNavParam") - .isFunction("UFCRTCollETTwoKeyNavParam") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isParameter(0, "ParameterInt16", "1") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'ABC'"); - - // test chains; returning collection of entity (aka entitySet) - testRes.run("FICRTCollESTwoKeyNavParam(ParameterInt16=1)(PropertyInt16=1,PropertyString='ABC')/PropertyInt16") - .at(0) - .isFunctionImport("FICRTCollESTwoKeyNavParam") - .isFunction("UFCRTCollETTwoKeyNavParam") - .isType(EntityTypeProvider.nameETTwoKeyNav, false) - .isParameter(0, "ParameterInt16", "1") - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'ABC'") - .at(1) - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - } - - @Test - public void metaData() throws Exception { - // Parsing the fragment may be used if a uri has to be parsed on the consumer side. - // On the producer side this feature is currently not supported, so the context fragment - // part is only available as text. - - testUri.run("$metadata") - .isKind(UriInfoKind.metadata); - - testUri.run("$metadata", "$format=atom") - .isKind(UriInfoKind.metadata) - .isFormatText("atom"); - - // with context (client usage) - - testUri.run("$metadata", null, "$ref") - .isKind(UriInfoKind.metadata) - .isFragmentText("$ref"); - - testUri.run("$metadata", "$format=atom", "$ref") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("$ref"); - - testUri.run("$metadata", "$format=atom", "Collection($ref)") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("Collection($ref)"); - - testUri.run("$metadata", "$format=atom", "Collection(Edm.EntityType)") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("Collection(Edm.EntityType)"); - - testUri.run("$metadata", "$format=atom", "Collection(Edm.ComplexType)") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("Collection(Edm.ComplexType)"); - - testUri.run("$metadata", "$format=atom", "SINav") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("SINav"); - - testUri.run("$metadata", "$format=atom", "SINav/PropertyInt16") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("SINav/PropertyInt16"); - - testUri.run("$metadata", "$format=atom", "SINav/NavPropertyETKeyNavOne") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("SINav/NavPropertyETKeyNavOne"); - - testUri.run("$metadata", "$format=atom", "SINav/NavPropertyETKeyNavMany(1)") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("SINav/NavPropertyETKeyNavMany(1)"); - - testUri.run("$metadata", "$format=atom", "SINav/NavPropertyETKeyNavOne/PropertyInt16") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("SINav/NavPropertyETKeyNavOne/PropertyInt16"); - - testUri.run("$metadata", "$format=atom", "SINav/NavPropertyETKeyNavMany(1)/PropertyInt16") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("SINav/NavPropertyETKeyNavMany(1)/PropertyInt16"); - - testUri.run("$metadata", "$format=atom", "SINav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavOne/PropertyInt16") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("SINav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavOne/PropertyInt16"); - - testUri.run("$metadata", "$format=atom", - "SINav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavMany(1)/PropertyInt16") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("SINav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavMany(1)/PropertyInt16"); - - testUri.run("$metadata", "$format=atom", "olingo.odata.test1.ETAllKey") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("olingo.odata.test1.ETAllKey"); - - testUri.run("$metadata", "$format=atom", "ESTwoPrim/$deletedEntity") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESTwoPrim/$deletedEntity"); - - testUri.run("$metadata", "$format=atom", "ESTwoPrim/$link") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESTwoPrim/$link"); - - testUri.run("$metadata", "$format=atom", "ESTwoPrim/$deletedLink") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESTwoPrim/$deletedLink"); - - testUri.run("$metadata", "$format=atom", "ESKeyNav") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav"); - - testUri.run("$metadata", "$format=atom", "ESKeyNav/PropertyInt16") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav/PropertyInt16"); - - testUri.run("$metadata", "$format=atom", "ESKeyNav/NavPropertyETKeyNavOne") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav/NavPropertyETKeyNavOne"); - - testUri.run("$metadata", "$format=atom", "ESKeyNav/NavPropertyETKeyNavMany(1)") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav/NavPropertyETKeyNavMany(1)"); - - testUri.run("$metadata", "$format=atom", "ESKeyNav/NavPropertyETKeyNavOne/PropertyInt16") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav/NavPropertyETKeyNavOne/PropertyInt16"); - - testUri.run("$metadata", "$format=atom", "ESKeyNav/NavPropertyETKeyNavMany(1)/PropertyInt16") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav/NavPropertyETKeyNavMany(1)/PropertyInt16"); - - testUri.run("$metadata", "$format=atom", - "ESKeyNav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavOne/PropertyInt16") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavOne/PropertyInt16"); - - testUri.run( - "$metadata", "$format=atom", "ESKeyNav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavMany(1)/PropertyInt16") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavMany(1)/PropertyInt16"); - - testUri.run("$metadata", "$format=atom", "ESKeyNav(PropertyInt16,PropertyString)") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav(PropertyInt16,PropertyString)"); - - testUri.run("$metadata", "$format=atom", "ESKeyNav/$entity") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav/$entity"); - - testUri.run("$metadata", "$format=atom", "ESKeyNav/$delta") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav/$delta"); - - testUri.run("$metadata", "$format=atom", "ESKeyNav/(PropertyInt16,PropertyString)/$delta") - .isKind(UriInfoKind.metadata) - .isFormatText("atom") - .isFragmentText("ESKeyNav/(PropertyInt16,PropertyString)/$delta"); - - } - - @Test - public void ref() throws Exception { - testUri.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/$ref"); - } - - @Test - public void singleton() { - // plain singleton - testRes.run("SINav") - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav); - } - - @Test - public void navigationProperty() { - // with navigation property - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne") - .at(0).isEntitySet("ESKeyNav") - .at(1).isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false); - - // with navigation property -> property - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/PropertyString") - .at(0).isEntitySet("ESKeyNav") - .at(1).isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .at(2).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - // with navigation property -> navigation property -> navigation property - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/NavPropertyETKeyNavOne") - .at(0).isEntitySet("ESKeyNav") - .at(1).isNavProperty("NavPropertyETTwoKeyNavOne", EntityTypeProvider.nameETTwoKeyNav, false) - .at(2).isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false); - - // with navigation property(key) - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')") - .at(0).isEntitySet("ESKeyNav") - .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'1'"); - - // with navigation property(key) -> property - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')/PropertyString") - .at(0).isEntitySet("ESKeyNav") - .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'1'") - .at(2).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - // with navigation property(key) -> navigation property - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')/NavPropertyETKeyNavOne") - .at(0).isEntitySet("ESKeyNav") - .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'1'") - .at(2).isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false); - - // with navigation property(key) -> navigation property(key) - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')" - + "/NavPropertyETKeyNavMany(1)") - .at(0).isEntitySet("ESKeyNav") - .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'1'") - .at(2).isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1"); - - // with navigation property(key) -> navigation property -> property - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')" - + "/NavPropertyETKeyNavOne/PropertyString") - .at(0).isEntitySet("ESKeyNav") - .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'1'") - .at(2).isNavProperty("NavPropertyETKeyNavOne", EntityTypeProvider.nameETKeyNav, false) - .at(3).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - - // with navigation property(key) -> navigation property(key) -> property - testRes.run("ESKeyNav(1)/NavPropertyETTwoKeyNavMany(PropertyInt16=1,PropertyString='1')" - + "/NavPropertyETKeyNavMany(1)/PropertyString") - .at(0).isEntitySet("ESKeyNav") - .at(1).isNavProperty("NavPropertyETTwoKeyNavMany", EntityTypeProvider.nameETTwoKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .isKeyPredicate(1, "PropertyString", "'1'") - .at(2).isNavProperty("NavPropertyETKeyNavMany", EntityTypeProvider.nameETKeyNav, false) - .isKeyPredicate(0, "PropertyInt16", "1") - .at(3).isPrimitiveProperty("PropertyString", PropertyProvider.nameString, false); - } - - @Test - public void singleton_Property() { - // with property - testRes.run("SINav/PropertyInt16") - .at(0) - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .at(1) - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - // with complex property - testRes.run("SINav/PropertyComp") - .at(0) - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .at(1) - .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false); - - // with two properties - testRes.run("SINav/PropertyComp/PropertyInt16") - .at(0) - .isSingleton("SINav") - .isType(EntityTypeProvider.nameETTwoKeyNav) - .at(1) - .isComplexProperty("PropertyComp", ComplexTypeProvider.nameCTPrimComp, false) - .at(2) - .isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false); - - } - - @Test - public void value() throws Exception { - testUri.run("ESAllPrim(1)/PropertyString/$value"); - } - - @Test - public void memberStartingWithCastFailOnValidation1() throws Exception { - // on EntityType entry - testUri.runEx("ESTwoKeyNav(Property16=1,PropertyString='ABC')", - "$filter=olingo.odata.test1.ETBaseTwoKeyNav/PropertyDate") - .isExValidation(UriValidationException.MessageKeys.INVALID_KEY_PROPERTY); - } - - @Test - public void memberStartingWithCastFailOnValidation2() throws Exception { - testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString='2')", - "$filter=olingo.odata.test1.CTBase/AdditionalPropString") - .isExSemantic(UriParserSemanticException.MessageKeys.TYPES_NOT_COMPATIBLE); - } - - @Test - public void memberStartingWithCast() throws Exception { - // on EntityType collection - testFilter.runOnETTwoKeyNav("olingo.odata.test1.ETBaseTwoKeyNav/PropertyDate eq null") - .left() - .isMember() - .isMemberStartType(EntityTypeProvider.nameETBaseTwoKeyNav).goPath() - .at(0).isType(PropertyProvider.nameDate); - - // on Complex collection - testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString='2')", - "$filter=olingo.odata.test1.CTBase/AdditionalPropString eq null") - .goFilter().left().isMember() - .isMemberStartType(ComplexTypeProvider.nameCTBase).goPath() - .at(0).isType(PropertyProvider.nameString); - } - - @Test - public void complexTypeCastFollowingAsCollection() throws Exception { - testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString='2')/olingo.odata.test1.CTBase"); - } - - @Test - public void alias() throws Exception { - testFilter.runOnETAllPrim("PropertyInt16 eq @p1&@p1=1") - .is("< eq <@p1>>"); - } - - @Test - public void lambda() throws Exception { - testFilter.runOnETTwoKeyNav("CollPropertyComp/all(l:true)") - .is(">>"); - - testFilter.runOnETTwoKeyNav("CollPropertyComp/all(x:x/PropertyInt16 eq 2)") - .is(" eq <2>>>>"); - - testFilter.runOnETTwoKeyNav("CollPropertyComp/any(l:true)") - .is(">>"); - testFilter.runOnETTwoKeyNav("CollPropertyComp/any()") - .is(">"); - } - - @Test - public void customQueryOption() throws Exception { - testUri.run("ESTwoKeyNav", "custom") - .isCustomParameter(0, "custom", ""); - testUri.run("ESTwoKeyNav", "custom=ABC") - .isCustomParameter(0, "custom", "ABC"); - } - - @Test - public void geo() throws Exception { - testFilter.runOnETAllPrim("geo.distance(geometry'SRID=0;Point(0 0)',geometry'SRID=0;Point(1 1)') lt 1.5") - .left().isMethod(MethodKind.GEODISTANCE, 2) - .goParameter(0).isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.GeometryPoint)) - .root().left() - .goParameter(1).isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.GeometryPoint)); - testFilter.runOnETAllPrim("geo.length(geometry'SRID=0;LineString(0 0,1 1)') lt 1.5") - .left().isMethod(MethodKind.GEOLENGTH, 1) - .goParameter(0).isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.GeometryLineString)); - testFilter.runOnETAllPrim("geo.intersects(geometry'SRID=0;Point(0 0)',null)") - .isMethod(MethodKind.GEOINTERSECTS, 2) - .goParameter(0).isLiteralType(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.GeometryPoint)); - } -} diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/UriParserTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/UriParserTest.java new file mode 100644 index 000000000..87a702ccb --- /dev/null +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/UriParserTest.java @@ -0,0 +1,843 @@ +/* + * 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.uri.parser; + +import java.util.Arrays; +import java.util.Collections; + +import org.apache.olingo.commons.api.edm.Edm; +import org.apache.olingo.commons.api.edmx.EdmxReference; +import org.apache.olingo.commons.api.format.ContentType; +import org.apache.olingo.server.api.OData; +import org.apache.olingo.server.api.uri.UriInfoKind; +import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind; +import org.apache.olingo.server.core.uri.parser.UriParserSemanticException.MessageKeys; +import org.apache.olingo.server.core.uri.testutil.FilterValidator; +import org.apache.olingo.server.core.uri.testutil.ResourceValidator; +import org.apache.olingo.server.core.uri.testutil.TestUriValidator; +import org.apache.olingo.server.core.uri.validator.UriValidationException; +import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; +import org.apache.olingo.server.tecsvc.provider.EntityTypeProvider; +import org.apache.olingo.server.tecsvc.provider.PropertyProvider; +import org.junit.Test; + +/** Tests of the URI parser as a whole - please put more specific tests elsewhere. */ +public class UriParserTest { + + private static final Edm edm = OData.newInstance().createServiceMetadata( + new EdmTechProvider(), Collections. emptyList()).getEdm(); + + private final TestUriValidator testUri = new TestUriValidator().setEdm(edm); + private final ResourceValidator testRes = new ResourceValidator().setEdm(edm); + private final FilterValidator testFilter = new FilterValidator().setEdm(edm); + + + @Test + public void misc() throws Exception { + testUri.run("") + .isKind(UriInfoKind.service); + testUri.run("/") + .isKind(UriInfoKind.service); + + testUri.run("$all") + .isKind(UriInfoKind.all); + + testUri.run("$batch") + .isKind(UriInfoKind.batch); + + testUri.runEx("//").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("$metadata/").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("//$metadata").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("ESKeyNav//$count").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + + testUri.runEx("$metadata/$ref").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("$batch/$ref").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("$all/$ref").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("$entity/olingo.odata.test1.ETKeyNav/$ref") + .isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + + testUri.runEx("$wrong").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testUri.runEx("", "$wrong").isExSyntax(UriParserSyntaxException.MessageKeys.UNKNOWN_SYSTEM_QUERY_OPTION); + + testUri.runEx("ESKeyNav()").isExSemantic(MessageKeys.WRONG_NUMBER_OF_KEY_PROPERTIES); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") + .isEntitySet("ESTwoKeyNav") + .n().isFunction("BFC_RTESTwoKeyNav_"); + + testRes.run("ESAllPrim/olingo.odata.test1.BAESAllPrimRTETAllPrim") + .isEntitySet("ESAllPrim") + .n().isAction("BAESAllPrimRTETAllPrim"); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") + .isEntitySet("ESTwoKeyNav") + .n().isFunction("BFC_RTESTwoKeyNav_"); + + testRes.run("ESMedia(1)/$value") + .isEntitySet("ESMedia") + .n().isValue(); + + testRes.run("ESAllPrim/olingo.odata.test1.BAESAllPrimRTETAllPrim") + .isEntitySet("ESAllPrim") + .n().isAction("BAESAllPrimRTETAllPrim"); + + testRes.run("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_()") + .isEntitySet("ESTwoKeyNav") + .n().isFunction("BFC_RTESTwoKeyNav_"); + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav") + .isEntitySet("ESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav); + + testRes.run("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBaseTwoKeyNav/$ref") + .isEntitySet("ESTwoKeyNav") + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicate(1, "PropertyString", "'2'") + .isType(EntityTypeProvider.nameETTwoKeyNav) + .isTypeFilterOnEntry(EntityTypeProvider.nameETBaseTwoKeyNav) + .n().isRef(); + } + + @Test + public void enumAndTypeDefAsKey() throws Exception { + testRes + .run("ESMixEnumDefCollComp(PropertyEnumString=olingo.odata.test1.ENString'String1',PropertyDefString='abc')") + .isEntitySet("ESMixEnumDefCollComp") + .isKeyPredicate(0, "PropertyEnumString", "olingo.odata.test1.ENString'String1'") + .isKeyPredicate(1, "PropertyDefString", "'abc'"); + + testFilter.runOnETMixEnumDefCollComp("PropertyEnumString has Namespace1_Alias.ENString'String1'") + .is("< has >>"); + + testRes + .run("ESMixEnumDefCollComp(PropertyEnumString=Namespace1_Alias.ENString'String1',PropertyDefString='abc')") + .isEntitySet("ESMixEnumDefCollComp") + .isKeyPredicate(0, "PropertyEnumString", "Namespace1_Alias.ENString'String1'") + .isKeyPredicate(1, "PropertyDefString", "'abc'"); + } + + @Test + public void crossjoin() throws Exception { + testUri.run("$crossjoin(ESKeyNav)") + .isKind(UriInfoKind.crossjoin) + .isCrossJoinEntityList(Arrays.asList("ESKeyNav")); + + testUri.run("$crossjoin(ESKeyNav,ESTwoKeyNav)") + .isKind(UriInfoKind.crossjoin) + .isCrossJoinEntityList(Arrays.asList("ESKeyNav", "ESTwoKeyNav")); + } + + @Test + public void crossjoinFilter() throws Exception { + testUri.run("$crossjoin(ESTwoPrim,ESMixPrimCollComp)", + "$filter=ESTwoPrim/PropertyString eq ESMixPrimCollComp/PropertyComp/PropertyString") + .goFilter() + .isBinary(BinaryOperatorKind.EQ) + .is("< eq >"); + } + + @Test + public void crossjoinExpand() throws Exception { + testUri.run("$crossjoin(ESTwoPrim,ESAllPrim)", + "$expand=ESTwoPrim") + .goExpand() + .first().goPath().first().isEntitySet("ESTwoPrim"); + + testUri.run("$crossjoin(ESTwoPrim,ESAllPrim)", + "$expand=ESTwoPrim,ESAllPrim") + .goExpand() + .first().goPath().first().isEntitySet("ESTwoPrim") + .goUpExpandValidator().next().goPath().first().isEntitySet("ESAllPrim"); + + // TODO: Once crossjoin is implemented these tests should no longer result in errors +// testUri.run("$crossjoin(ESTwoPrim,ESAllPrim)", +// "$expand=ESAllPrim/NavPropertyETTwoPrimOne") +// .goExpand() +// .first().goPath().at(0).isEntitySet("ESAllPrim") +// .at(1).isNavProperty("NavPropertyETTwoPrimOne", EntityTypeProvider.nameETTwoPrim, false); + } + + @Test + public void crossjoinError() throws Exception { + testUri.runEx("$crossjoin").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testUri.runEx("$crossjoin/error").isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("$crossjoin()").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testUri.runEx("$crossjoin(ESKeyNav, ESTwoKeyNav)/invalid") + .isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + testUri.runEx("$crossjoin(ESKeyNav)/$ref") + .isExSyntax(UriParserSyntaxException.MessageKeys.MUST_BE_LAST_SEGMENT); + } + + @Test + public void entityId() throws Exception { + // simple entity set + testUri.run("$entity", "$id=ESAllPrim(1)").isKind(UriInfoKind.entityId) + .isKind(UriInfoKind.entityId) + .isIdText("ESAllPrim(1)"); + + // simple entity set; $format before $id + testUri.run("$entity", "$format=xml&$id=ESAllPrim(1)").isKind(UriInfoKind.entityId) + .isFormatText("xml") + .isIdText("ESAllPrim(1)"); + + testUri.run("$entity", "$format=xml&abc=123&$id=ESAllPrim(1)").isKind(UriInfoKind.entityId) + .isFormatText("xml") + .isCustomParameter(0, "abc", "123") + .isIdText("ESAllPrim(1)"); + + // simple entity set; $format after $id + testUri.run("$entity", "$id=ESAllPrim(1)&$format=xml").isKind(UriInfoKind.entityId) + .isIdText("ESAllPrim(1)") + .isFormatText("xml"); + + // simple entity set; $format and custom parameter after $id + testUri.run("$entity", "$id=ESAllPrim(1)&$format=xml&abc=123").isKind(UriInfoKind.entityId) + .isIdText("ESAllPrim(1)") + .isFormatText("xml") + .isCustomParameter(0, "abc", "123"); + + // simple entity set; $format before $id and custom parameter after $id + testUri.run("$entity", "$format=xml&$id=ESAllPrim(1)&abc=123").isKind(UriInfoKind.entityId) + .isFormatText("xml") + .isIdText("ESAllPrim(1)") + .isCustomParameter(0, "abc", "123"); + + // simple entity set; with qualifiedentityTypeName + testUri.run("$entity/olingo.odata.test1.ETTwoPrim", "$id=ESBase(111)") + .isEntityType(EntityTypeProvider.nameETTwoPrim) + .isIdText("ESBase(111)"); + + // simple entity set; with qualifiedentityTypeName; + testUri.run("$entity/olingo.odata.test1.ETBase", "$id=ESTwoPrim(1)") + .isEntityType(EntityTypeProvider.nameETBase) + .isKind(UriInfoKind.entityId) + .isIdText("ESTwoPrim(1)"); + + // simple entity set; with qualifiedentityTypeName; with format + testUri.run("$entity/olingo.odata.test1.ETBase", "$id=ESTwoPrim(1)&$format=atom") + .isKind(UriInfoKind.entityId) + .isEntityType(EntityTypeProvider.nameETBase) + .isIdText("ESTwoPrim(1)") + .isFormatText("atom"); + + // simple entity set; with qualifiedentityTypeName; with select + testUri.run("$entity/olingo.odata.test1.ETBase", "$id=ESTwoPrim(1)&$select=*") + .isKind(UriInfoKind.entityId) + .isEntityType(EntityTypeProvider.nameETBase) + .isIdText("ESTwoPrim(1)") + .isSelectItemStar(0); + + // simple entity set; with qualifiedentityTypeName; with expand + testUri.run("$entity/olingo.odata.test1.ETBase", "$id=ESTwoPrim(1)&$expand=*") + .isKind(UriInfoKind.entityId) + .isEntityType(EntityTypeProvider.nameETBase) + .isIdText("ESTwoPrim(1)") + .goExpand().first().isSegmentStar(); + } + + @Test + public void entityIdFailOnValidation() throws Exception { + testUri.runEx("$entity/olingo.odata.test1.ETTwoPrim", "$filter=PropertyInt16 eq 123&$id=ESAllPrim(1)") + .isExValidation(UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED); + } + + @Test + public void resourcePathWithApostrophe() throws Exception { + testUri.runEx("ESAllPrim'").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testUri.runEx("ESAllPrim'InvalidStuff").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testFilter.runOnETKeyNavEx("PropertyInt16' eq 0").isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); + testFilter.runOnETKeyNavEx("PropertyInt16 eq' 0").isExSemantic(MessageKeys.TYPES_NOT_COMPATIBLE); + testFilter.runOnETKeyNavEx("PropertyInt16 eq 0'") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + testFilter.runOnETKeyNavEx("PropertyInt16 eq 'dsd''") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + } + + @Test + public void metaData() throws Exception { + // Parsing the fragment may be used if a uri has to be parsed on the consumer side. + // On the producer side this feature is currently not supported, so the context fragment + // part is only available as text. + + testUri.run("$metadata") + .isKind(UriInfoKind.metadata); + + testUri.run("$metadata", "$format=atom") + .isKind(UriInfoKind.metadata) + .isFormatText("atom"); + + // with context (client usage) + testUri.run("$metadata", null, "$ref") + .isKind(UriInfoKind.metadata) + .isFragmentText("$ref"); + + testUri.run("$metadata", "$format=atom", "$ref") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("$ref"); + + testUri.run("$metadata", "$format=atom", "Collection($ref)") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("Collection($ref)"); + + testUri.run("$metadata", "$format=atom", "Collection(Edm.EntityType)") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("Collection(Edm.EntityType)"); + + testUri.run("$metadata", "$format=atom", "Collection(Edm.ComplexType)") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("Collection(Edm.ComplexType)"); + + testUri.run("$metadata", "$format=atom", "SINav") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("SINav"); + + testUri.run("$metadata", "$format=atom", "SINav/PropertyInt16") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("SINav/PropertyInt16"); + + testUri.run("$metadata", "$format=atom", "SINav/NavPropertyETKeyNavOne") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("SINav/NavPropertyETKeyNavOne"); + + testUri.run("$metadata", "$format=atom", "SINav/NavPropertyETKeyNavMany(1)") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("SINav/NavPropertyETKeyNavMany(1)"); + + testUri.run("$metadata", "$format=atom", "SINav/NavPropertyETKeyNavOne/PropertyInt16") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("SINav/NavPropertyETKeyNavOne/PropertyInt16"); + + testUri.run("$metadata", "$format=atom", "SINav/NavPropertyETKeyNavMany(1)/PropertyInt16") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("SINav/NavPropertyETKeyNavMany(1)/PropertyInt16"); + + testUri.run("$metadata", "$format=atom", "SINav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavOne/PropertyInt16") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("SINav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavOne/PropertyInt16"); + + testUri.run("$metadata", "$format=atom", + "SINav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavMany(1)/PropertyInt16") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("SINav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavMany(1)/PropertyInt16"); + + testUri.run("$metadata", "$format=atom", "olingo.odata.test1.ETAllKey") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("olingo.odata.test1.ETAllKey"); + + testUri.run("$metadata", "$format=atom", "ESTwoPrim/$deletedEntity") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESTwoPrim/$deletedEntity"); + + testUri.run("$metadata", "$format=atom", "ESTwoPrim/$link") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESTwoPrim/$link"); + + testUri.run("$metadata", "$format=atom", "ESTwoPrim/$deletedLink") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESTwoPrim/$deletedLink"); + + testUri.run("$metadata", "$format=atom", "ESKeyNav") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav"); + + testUri.run("$metadata", "$format=atom", "ESKeyNav/PropertyInt16") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav/PropertyInt16"); + + testUri.run("$metadata", "$format=atom", "ESKeyNav/NavPropertyETKeyNavOne") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav/NavPropertyETKeyNavOne"); + + testUri.run("$metadata", "$format=atom", "ESKeyNav/NavPropertyETKeyNavMany(1)") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav/NavPropertyETKeyNavMany(1)"); + + testUri.run("$metadata", "$format=atom", "ESKeyNav/NavPropertyETKeyNavOne/PropertyInt16") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav/NavPropertyETKeyNavOne/PropertyInt16"); + + testUri.run("$metadata", "$format=atom", "ESKeyNav/NavPropertyETKeyNavMany(1)/PropertyInt16") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav/NavPropertyETKeyNavMany(1)/PropertyInt16"); + + testUri.run("$metadata", "$format=atom", + "ESKeyNav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavOne/PropertyInt16") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavOne/PropertyInt16"); + + testUri.run( + "$metadata", "$format=atom", "ESKeyNav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavMany(1)/PropertyInt16") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav/olingo.odata.test1.ETTwoPrim/NavPropertyETKeyNavMany(1)/PropertyInt16"); + + testUri.run("$metadata", "$format=atom", "ESKeyNav(PropertyInt16,PropertyString)") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav(PropertyInt16,PropertyString)"); + + testUri.run("$metadata", "$format=atom", "ESKeyNav/$entity") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav/$entity"); + + testUri.run("$metadata", "$format=atom", "ESKeyNav/$delta") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav/$delta"); + + testUri.run("$metadata", "$format=atom", "ESKeyNav/(PropertyInt16,PropertyString)/$delta") + .isKind(UriInfoKind.metadata) + .isFormatText("atom") + .isFragmentText("ESKeyNav/(PropertyInt16,PropertyString)/$delta"); + } + + @Test + public void top() throws Exception { + testUri.run("ESKeyNav", "$top=1") + .isKind(UriInfoKind.resource) + .goPath().isEntitySet("ESKeyNav") + .goUpUriValidator().isTopText("1"); + + testUri.run("ESKeyNav", "$top=0") + .isKind(UriInfoKind.resource) + .goPath().isEntitySet("ESKeyNav") + .goUpUriValidator().isTopText("0"); + + testUri.runEx("ESKeyNav", "$top=undefined") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + testUri.runEx("ESKeyNav", "$top=") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + testUri.runEx("ESKeyNav", "$top=-3") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + } + + @Test + public void format() throws Exception { + testUri.run("ESKeyNav(1)", "$format=atom") + .isKind(UriInfoKind.resource) + .isFormatText("atom"); + testUri.run("ESKeyNav(1)", "$format=json") + .isKind(UriInfoKind.resource) + .isFormatText("json"); + testUri.run("ESKeyNav(1)", "$format=xml") + .isKind(UriInfoKind.resource) + .isFormatText("xml"); + testUri.run("ESKeyNav(1)", "$format=IANA_content_type/must_contain_a_slash") + .isKind(UriInfoKind.resource) + .isFormatText("IANA_content_type/must_contain_a_slash"); + testUri.run("ESKeyNav(1)", "$format=Test_all_valid_signsSpecified_for_format_signs%26-._~$@%27/Aa123%26-._~$@%27") + .isKind(UriInfoKind.resource) + .isFormatText("Test_all_valid_signsSpecified_for_format_signs&-._~$@'/Aa123&-._~$@'"); + testUri.run("ESKeyNav(1)", "$format=" + ContentType.APPLICATION_ATOM_XML_ENTRY_UTF8) + .isKind(UriInfoKind.resource) + .isFormatText(ContentType.APPLICATION_ATOM_XML_ENTRY_UTF8.toContentTypeString()); + testUri.runEx("ESKeyNav(1)", "$format=noSlash") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT); + testUri.runEx("ESKeyNav(1)", "$format=slashAtEnd/") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT); + testUri.runEx("ESKeyNav(1)", "$format=/startsWithSlash") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT); + testUri.runEx("ESKeyNav(1)", "$format=two/Slashes/tooMuch") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT); + testUri.runEx("ESKeyNav(1)", "$format=") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION_FORMAT); + } + + @Test + public void count() throws Exception { + testUri.run("ESAllPrim", "$count=true") + .isKind(UriInfoKind.resource) + .isInlineCountText("true"); + testUri.run("ESAllPrim", "$count=false") + .isKind(UriInfoKind.resource) + .isInlineCountText("false"); + testUri.runEx("ESAllPrim", "$count=undefined") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + testUri.runEx("ESAllPrim", "$count=") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + } + + @Test + public void skip() throws Exception { + testUri.run("ESAllPrim", "$skip=3") + .isKind(UriInfoKind.resource) + .isSkipText("3"); + testUri.run("ESAllPrim", "$skip=0") + .isKind(UriInfoKind.resource) + .isSkipText("0"); + + testUri.runEx("ESAllPrim", "$skip=F") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + testUri.runEx("ESAllPrim", "$skip=") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + testUri.runEx("ESAllPrim", "$skip=-3") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + } + + @Test + public void skiptoken() throws Exception { + testUri.run("ESAllPrim", "$skiptoken=foo") + .isKind(UriInfoKind.resource) + .isSkipTokenText("foo"); + + testUri.runEx("ESAllPrim", "$skiptoken=") + .isExSyntax(UriParserSyntaxException.MessageKeys.WRONG_VALUE_FOR_SYSTEM_QUERY_OPTION); + } + + @Test + public void notExistingSystemQueryOption() throws Exception { + testUri.runEx("ESAllPrim", "$wrong=error") + .isExSyntax(UriParserSyntaxException.MessageKeys.UNKNOWN_SYSTEM_QUERY_OPTION); + } + + @Test + public void errors() { + testUri.runEx("FICRTString(wrong1='ABC')/olingo.odata.test1.BFCStringRTESTwoKeyNav()") + .isExSemantic(MessageKeys.FUNCTION_NOT_FOUND); + testUri.runEx("FICRTString(wrong1='ABC',wrong2=1)/olingo.odata.test1.BFCStringRTESTwoKeyNav()") + .isExSemantic(MessageKeys.FUNCTION_NOT_FOUND); + + // type filter for entity incompatible + testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/olingo.odata.test1.ETBase") + .isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER); + + // type filter for entity double on entry + testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')" + + "/olingo.odata.test1.ETBaseTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav") + .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); + // type filter for entity double on collection + testUri.runEx("ESTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav") + .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); + // type filter for entity double on non key pred + testUri.runEx("SINav/olingo.odata.test1.ETBaseTwoKeyNav/olingo.odata.test1.ETBaseTwoKeyNav") + .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); + + // type filter for complex incompatible + testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyCompTwoPrim" + + "/olingo.odata.test1.CTCollAllPrim") + .isExSemantic(MessageKeys.INCOMPATIBLE_TYPE_FILTER); + + // type filter for complex double on entry + testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString='2')" + + "/olingo.odata.test1.CTBase/olingo.odata.test1.CTBase") + .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); + + // type filter for complex double on collection + testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString='2')" + + "/olingo.odata.test1.CTBase/olingo.odata.test1.CTBase") + .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); + + // type filter for complex double on non key pred + testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyCompTwoPrim" + + "/olingo.odata.test1.CTBase/olingo.odata.test1.CTBase") + .isExSemantic(MessageKeys.TYPE_FILTER_NOT_CHAINABLE); + + testUri.runEx("ESTwoKeyNav/olingo.odata.test1.BFC_RTESTwoKeyNav_") + .isExSemantic(MessageKeys.UNKNOWN_TYPE); + + // $ref + testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyCompTwoPrim/$ref") + .isExSemantic(MessageKeys.ONLY_FOR_ENTITY_TYPES); + + // $count + testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/PropertyCompTwoPrim/$count") + .isExSemantic(MessageKeys.ONLY_FOR_COLLECTIONS); + + // Actions must not be followed by anything. + testUri.runEx("ESTwoKeyNav(PropertyInt16=1,PropertyString='2')/" + + "olingo.odata.test1.BA_RTETTwoKeyNav/olingo.odata.test1.ETTwoKeyNav") + .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); + testUri.runEx("ESTwoKeyNav/olingo.odata.test1.BAESTwoKeyNavRTESTwoKeyNav/$count") + .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); + } + + @Test + public void doublePercentDecoding() throws Exception { + testUri.runEx("ESAllPrim%252832767%29").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + } + + @Test + public void multipleKeysInResourcePath() throws Exception { + // See OLINGO-730 + testUri.runEx("ESAllPrim(32767)(1)(2)").isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + } + + @Test + public void startElementsInsteadOfNavigationProperties() { + testUri.runEx("ESAllPrim(0)/ESAllPrim(0)/ESAllPrim(0)").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("ESAllPrim(0)/SINav").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("ESAllPrim(0)/FICRTString()").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("ESAllPrim(0)/AIRTString").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("SI/ESAllPrim(0)").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("SI/SINav").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("SI/FICRTString()").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("SI/AIRTString").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("FICRTETKeyNav()/ESAllPrim(0)").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("FICRTETKeyNav()/SINav").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("FICRTETKeyNav()/FICRTString()").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("FICRTETKeyNav()/AIRTString").isExSemantic(MessageKeys.PROPERTY_NOT_IN_TYPE); + testUri.runEx("AIRTESAllPrimParam/ESAllPrim(0)") + .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); + testUri.runEx("AIRTESAllPrimParam/SINav") + .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); + testUri.runEx("AIRTESAllPrimParam/FICRTString()") + .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); + testUri.runEx("AIRTESAllPrimParam/AIRTString") + .isExValidation(UriValidationException.MessageKeys.UNALLOWED_RESOURCE_PATH); + } + + @Test + public void firstResourcePathWithNamespace() { + testUri.runEx("olingo.odata.test1.ESAllPrim").isExSemantic(MessageKeys.NAMESPACE_NOT_ALLOWED_AT_FIRST_ELEMENT); + testUri.runEx("olingo.odata.test1.ESAllPrim(0)").isExSemantic(MessageKeys.NAMESPACE_NOT_ALLOWED_AT_FIRST_ELEMENT); + testUri.runEx("olingo.odata.test1.FINRTInt16()").isExSemantic(MessageKeys.NAMESPACE_NOT_ALLOWED_AT_FIRST_ELEMENT); + testUri.runEx("olingo.odata.test1.AIRTString").isExSemantic(MessageKeys.NAMESPACE_NOT_ALLOWED_AT_FIRST_ELEMENT); + testUri.runEx("olingo.odata.test1.SINav").isExSemantic(MessageKeys.NAMESPACE_NOT_ALLOWED_AT_FIRST_ELEMENT); + } + + @Test + public void alias() throws Exception { + testUri.run("ESTwoKeyNav(PropertyInt16=1,PropertyString=@A)", "@A='2'").goPath() + .isKeyPredicate(0, "PropertyInt16", "1") + .isKeyPredicateAlias(1, "PropertyString", "@A") + .goUpUriValidator().isInAliasToValueMap("@A", "'2'"); + testUri.run("ESAllPrim(PropertyInt16=@p1)", "@p1=1").goPath() + .isKeyPredicateAlias(0, "PropertyInt16", "@p1") + .goUpUriValidator().isInAliasToValueMap("@p1", "1"); + testUri.run("ESAllPrim(@p1)", "@p1=-2").goPath() + .isKeyPredicateAlias(0, "PropertyInt16", "@p1") + .goUpUriValidator().isInAliasToValueMap("@p1", "-2"); + + testFilter.runOnETAllPrim("PropertyInt16 gt @alias&@alias=1") + .is("< gt <@alias>>") + .right().isAlias("@alias"); + testFilter.runOnETAllPrim("@alias&@alias=@otherAlias&@otherAlias=true") + .isAlias("@alias"); + + testUri.runEx("ESAllPrim(@p1)") + .isExValidation(UriValidationException.MessageKeys.MISSING_ALIAS); + testUri.runEx("ESAllPrim(PropertyInt16=@p1)", "@p1='ewe'").isExSemantic(MessageKeys.UNKNOWN_PART); + testUri.runEx("ESAllPrim(PropertyInt16=@p1)", "@p1='ewe") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + testFilter.runOnETKeyNavEx("PropertyInt16 gt @alias") + .isInAliasToValueMap("@alias", null); + testFilter.runOnETKeyNavEx("PropertyInt16 gt @alias&@alias=@alias") + .isInAliasToValueMap("@alias", "@alias"); + testFilter.runOnETKeyNavEx("@alias&@alias=@alias2&@alias2=true or @alias") + .isInAliasToValueMap("@alias", "@alias2"); + } + + @Test + public void functionImportParameterAlias() throws Exception { + testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=@parameterAlias)", "@parameterAlias=1"); + testUri.run("FICRTCollESTwoKeyNavParam(ParameterInt16=@parameterAlias)/$count", "@parameterAlias=1"); + testUri.runEx("FICRTCollESTwoKeyNavParam(ParameterInt16=@invalidAlias)", "@validAlias=1") + .isExValidation(UriValidationException.MessageKeys.MISSING_ALIAS); + } + + @Test + public void functionsWithComplexParameters() throws Exception { + testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1)", "@p1={\"PropertyInt16\":1,\"PropertyString\":\"1\"}") + .goPath() + .first().isEntitySet("ESTwoKeyNav") + .n().isFunction("BFCESTwoKeyNavRTStringParam").isParameterAlias(0, "ParameterComp", "@p1") + .goUpUriValidator().isInAliasToValueMap("@p1", "{\"PropertyInt16\":1,\"PropertyString\":\"1\"}"); + + // Test JSON String lexer rule =\"3,Int16=abc},\\\nabc&test%test\b\f\r\t\u0022\\}\\{\\)\\(\\]\\[} + final String stringValueEncoded = "=\\\"3,Int16=abc},\\\\\\nabc%26test%25test\\b\\f\\r\\t\\u0022\\\\}\\\\{\\\\)" + + "\\\\(\\\\]\\\\[}"; + final String stringValueDecoded = "=\\\"3,Int16=abc},\\\\\\nabc&test%test\\b\\f\\r\\t\\u0022\\\\}\\\\{\\\\)" + + "\\\\(\\\\]\\\\[}"; + + testUri.run("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1)", "@p1={\"PropertyInt16\":1,\"PropertyString\":\"" + stringValueEncoded + "\"}") + .goPath() + .first().isEntitySet("ESTwoKeyNav") + .n().isFunction("BFCESTwoKeyNavRTStringParam").isParameterAlias(0, "ParameterComp", "@p1") + .goUpUriValidator() + .isInAliasToValueMap("@p1", "{\"PropertyInt16\":1,\"PropertyString\":\"" + stringValueDecoded + "\"}"); + + testFilter.runOnETTwoKeyNav("olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp={\"PropertyString\":\"Test\",\"PropertyInt16\":1}) eq 'Test'") + .is("< eq <'Test'>>") + .isBinary(BinaryOperatorKind.EQ) + .left().isParameterText(0, "{\"PropertyString\":\"Test\",\"PropertyInt16\":1}"); + + testFilter.runOnETTwoKeyNav("olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp={\"PropertyString\":\"" + stringValueEncoded + "\",\"PropertyInt16\":1}) eq 'Test'") + .is("< eq <'Test'>>") + .left().isParameterText(0, "{\"PropertyString\":\"" + stringValueDecoded + "\",\"PropertyInt16\":1}"); + + testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":1,\"PropertyString\":\"1\"}"); + + testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":1,\"PropertyString\":null}") + .goFilter().left().isParameterText(0, null); + + testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1) eq '0'&@p1={}"); + + testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[1,2,3],\"PropertyString\":\"1\"}"); + + testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[\"1\",\"2\",\"3\"],\"PropertyString\":\"1\"}"); + + testUri.run("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[{\"Prop1\":123,\"Prop2\":\"Test\",\"Prop3\":[1,2,3]}," + + "{\"Prop1\":{\"Prop1\":[\"Prop\\\":{]\"]}}],\"PropertyString\":\"1\"}"); + + testUri.run("FINRTByteNineParam(ParameterEnum=null,ParameterDef='x',ParameterComp=@c," + + "ParameterETTwoPrim=@c,CollParameterByte=@e,CollParameterEnum=@e,CollParameterDef=@e," + + "CollParameterComp=@e,CollParameterETTwoPrim=@e)", + "@c={}&@e=[]"); + + testUri.runEx("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1)", "@p1={\"PropertyInt16\":1,\"PropertyString\":'1'}") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + + testUri.runEx("ESTwoKeyNav/olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp={\"PropertyInt16\":1,\"PropertyString\":\"Test\"})") + .isExSemantic(MessageKeys.COMPLEX_PARAMETER_IN_RESOURCE_PATH); + + testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=null)") + .isExValidation(UriValidationException.MessageKeys.MISSING_PARAMETER); + + testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)") + .isExValidation(UriValidationException.MessageKeys.MISSING_ALIAS); + + testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test=null") + .isExValidation(UriValidationException.MessageKeys.MISSING_ALIAS); + + testUri.run("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test='null'"); + + testUri.runEx("FICRTCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test,UnknownParam=1)", "@test='null'") + .isExSemantic(MessageKeys.FUNCTION_NOT_FOUND); + + testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test='null'"); + testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test=null"); + testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)"); + testUri.run("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=null)"); + + testUri.runEx("FICRTCollCTTwoPrimTwoParam(ParameterInt16=1,ParameterString=@test)", "@test=null&@test='1'") + .isExSyntax(UriParserSyntaxException.MessageKeys.DUPLICATED_ALIAS); + + testFilter.runOnETKeyNavEx("FINRTInt16() eq 0") + .isExSemantic(MessageKeys.EXPRESSION_PROPERTY_NOT_IN_TYPE); + + testUri.runEx("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":1,\"PropertyString\":\"1\"") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + + testUri.runEx("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":1,\"PropertyString\":\"1\"}}") + .isExSemantic(MessageKeys.UNKNOWN_PART); + + testUri.runEx("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[1,2,3]],\"PropertyString\":\"1\"}") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + + testUri.runEx("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[1,2,3,\"PropertyString\":\"1\"}") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + + testUri.runEx("ESTwoKeyNav", "$filter=olingo.odata.test1.BFCESTwoKeyNavRTStringParam" + + "(ParameterComp=@p1) eq '0'&@p1={\"PropertyInt16\":[1,2,3},\"PropertyString\":\"1\"}") + .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX); + } + + @Test + public void allowedSystemQueryOptionsOnAll() throws Exception { + testUri.run("$all", "$count=true&$format=json&$search=abc&$skip=5&$top=5&$skiptoken=abc") + .isKind(UriInfoKind.all) + .isInlineCountText("true") + .isFormatText("json") + .isSearchSerialized("'abc'") + .isSkipText("5") + .isTopText("5") + .isSkipTokenText("abc"); + } + + @Test + public void allowedSystemQueryOptionsOnCrossjoin() throws Exception { + testUri.run("$crossjoin(ESAllPrim,ESTwoPrim)", "$count=true&$expand=ESAllPrim" + + "&$filter=ESAllPrim/PropertyInt16 eq 2&$format=json&$orderby=ESAllPrim/PropertyInt16" + + "&$search=abc&$skip=5&$top=5&$skiptoken=abc") + .isKind(UriInfoKind.crossjoin) + .isInlineCountText("true") + .goExpand().goPath().isEntitySet("ESAllPrim") + .goUpExpandValidator().goUpToUriValidator() + .goFilter().left().goPath().first().isEntitySet("ESAllPrim") + .n().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false) + .goUpFilterValidator().goUpToUriValidator() + .isFormatText("json") + .isSearchSerialized("'abc'") + .isSkipText("5") + .isTopText("5") + .isSkipTokenText("abc"); + } + + @Test + public void trimQueryOptionsValue() throws Exception { + // OLINGO-846 trim query option value + testUri.run("ESAllPrim", "$filter= PropertyInt16 eq 12 ") + .isKind(UriInfoKind.resource).goPath() + .first().isEntitySet("ESAllPrim"); + // OLINGO-846 trim query option value + testUri.run("ESAllPrim", "$filter= PropertyInt16 eq 12 ") + .isKind(UriInfoKind.resource).goFilter().isBinary(BinaryOperatorKind.EQ).is("< eq <12>>"); + } + + @Test + public void customQueryOption() throws Exception { + testUri.run("ESTwoKeyNav", "custom") + .isCustomParameter(0, "custom", ""); + testUri.run("ESTwoKeyNav", "custom=ABC") + .isCustomParameter(0, "custom", "ABC"); + } +} diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ResourceValidator.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ResourceValidator.java index 2bcdbc1ef..658f2c0be 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ResourceValidator.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/ResourceValidator.java @@ -23,8 +23,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import java.util.List; - import org.apache.olingo.commons.api.edm.Edm; import org.apache.olingo.commons.api.edm.EdmElement; import org.apache.olingo.commons.api.edm.EdmType; @@ -38,7 +36,6 @@ import org.apache.olingo.server.api.uri.UriInfoResource; import org.apache.olingo.server.api.uri.UriParameter; import org.apache.olingo.server.api.uri.UriResource; import org.apache.olingo.server.api.uri.UriResourceAction; -import org.apache.olingo.server.api.uri.UriResourceComplexProperty; import org.apache.olingo.server.api.uri.UriResourceEntitySet; import org.apache.olingo.server.api.uri.UriResourceFunction; import org.apache.olingo.server.api.uri.UriResourceKind; @@ -46,8 +43,9 @@ import org.apache.olingo.server.api.uri.UriResourceLambdaAll; import org.apache.olingo.server.api.uri.UriResourceLambdaAny; import org.apache.olingo.server.api.uri.UriResourceNavigation; import org.apache.olingo.server.api.uri.UriResourcePartTyped; -import org.apache.olingo.server.api.uri.UriResourcePrimitiveProperty; +import org.apache.olingo.server.api.uri.UriResourceProperty; import org.apache.olingo.server.api.uri.UriResourceSingleton; +import org.apache.olingo.server.core.uri.UriResourceTypedImpl; import org.apache.olingo.server.core.uri.UriResourceWithKeysImpl; import org.apache.olingo.server.core.uri.parser.Parser; import org.apache.olingo.server.core.uri.validator.UriValidationException; @@ -57,7 +55,7 @@ public class ResourceValidator implements TestValidator { private final OData odata = OData.newInstance(); private Edm edm; private TestValidator invokedBy; - private UriInfo uriInfo = null; + private UriInfoResource uriInfo = null; private UriResource uriPathInfo = null; private int uriResourceIndex; @@ -75,10 +73,8 @@ public class ResourceValidator implements TestValidator { } public ResourceValidator setUriInfoPath(final UriInfoResource uriInfoPath) { - uriInfo = (UriInfo) uriInfoPath; - if (!uriInfo.getUriResourceParts().isEmpty()) { - last(); - } + uriInfo = uriInfoPath; + first(); return this; } @@ -86,7 +82,6 @@ public class ResourceValidator implements TestValidator { public ResourceValidator run(final String path) { UriInfo uriInfoTmp = null; - uriPathInfo = null; try { uriInfoTmp = new Parser(edm, odata).parseUri(path, null, null); } catch (final ODataLibraryException e) { @@ -101,10 +96,10 @@ public class ResourceValidator implements TestValidator { + " Message: " + e.getMessage()); } - uriInfo = uriInfoTmp; - isKind(UriInfoKind.resource); + assertEquals("Invalid UriInfoKind: " + uriInfoTmp.getKind().toString(), + UriInfoKind.resource, uriInfoTmp.getKind()); - first(); + setUriInfoPath(uriInfoTmp.asUriInfoResource()); return this; } @@ -123,12 +118,10 @@ public class ResourceValidator implements TestValidator { } public FilterValidator goParameter(final int index) { - assertEquals(UriResourceKind.function, uriPathInfo.getKind()); - UriResourceFunction function = (UriResourceFunction) uriPathInfo; - + isUriPathInfoKind(UriResourceKind.function); return new FilterValidator() .setEdm(edm) - .setExpression(function.getParameters().get(index).getExpression()) + .setExpression(((UriResourceFunction) uriPathInfo).getParameters().get(index).getExpression()) .setValidator(this); } @@ -148,10 +141,6 @@ public class ResourceValidator implements TestValidator { return at(0); } - public ResourceValidator last() { - return at(uriInfo.getUriResourceParts().size() - 1); - } - public ResourceValidator n() { return at(uriResourceIndex + 1); } @@ -166,33 +155,21 @@ public class ResourceValidator implements TestValidator { // --- Validation --- public ResourceValidator isLambdaVar(final String var) { - String actualVar = null; - if (uriPathInfo.getKind() == UriResourceKind.lambdaAll) { - actualVar = ((UriResourceLambdaAll) uriPathInfo).getLambdaVariable(); - } else if (uriPathInfo.getKind() == UriResourceKind.lambdaAny) { - actualVar = ((UriResourceLambdaAny) uriPathInfo).getLambdaVariable(); - } else { - fail("invalid resource kind: " + uriPathInfo.getKind().toString()); - } - + assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), + uriPathInfo.getKind() == UriResourceKind.lambdaAll + || uriPathInfo.getKind() == UriResourceKind.lambdaAny); + final String actualVar = uriPathInfo.getKind() == UriResourceKind.lambdaAll ? + ((UriResourceLambdaAll) uriPathInfo).getLambdaVariable() : + ((UriResourceLambdaAny) uriPathInfo).getLambdaVariable(); assertEquals(var, actualVar); return this; } public ResourceValidator isTypeFilter(final FullQualifiedName expectedType) { - - if (uriPathInfo.getKind() != UriResourceKind.complexProperty && - uriPathInfo.getKind() != UriResourceKind.singleton) { - fail("invalid resource kind: " + uriPathInfo.getKind().toString()); - } - - EdmType actualType = null; - if (uriPathInfo instanceof UriResourceComplexProperty) { - actualType = ((UriResourceComplexProperty) uriPathInfo).getComplexTypeFilter(); - } else if (uriPathInfo instanceof UriResourceSingleton) { - actualType = ((UriResourceSingleton) uriPathInfo).getEntityTypeFilter(); - } - + assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), + uriPathInfo.getKind() == UriResourceKind.complexProperty + || uriPathInfo.getKind() == UriResourceKind.singleton); + final EdmType actualType = ((UriResourceTypedImpl) uriPathInfo).getTypeFilter(); assertNotNull("type information not set", actualType); assertEquals(expectedType, actualType.getFullQualifiedName()); return this; @@ -202,9 +179,7 @@ public class ResourceValidator implements TestValidator { assertTrue("invalid resource kind: " + (uriPathInfo.getKind() == null ? "null" : uriPathInfo.getKind().toString()), uriPathInfo instanceof UriResourcePartTyped); - UriResourcePartTyped uriPathInfoTyped = (UriResourcePartTyped) uriPathInfo; - - EdmType actualType = uriPathInfoTyped.getType(); + final EdmType actualType = ((UriResourcePartTyped) uriPathInfo).getType(); assertNotNull("type information not set", actualType); assertEquals(type, actualType.getFullQualifiedName()); return this; @@ -217,141 +192,101 @@ public class ResourceValidator implements TestValidator { } public ResourceValidator isTypeFilterOnEntry(final FullQualifiedName type) { - assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), - uriPathInfo instanceof UriResourceWithKeysImpl); - UriResourceWithKeysImpl uriPathInfoKeyPred = (UriResourceWithKeysImpl) uriPathInfo; - - // input parameter type may be null in order to assert that the singleTypeFilter is not set - EdmType actualType = uriPathInfoKeyPred.getTypeFilterOnEntry(); - if(actualType == null && type != null){ - fail("Expected an entry type filter of type: " + type.getFullQualifiedNameAsString()); - } - assertEquals(type, type == null ? actualType : actualType.getFullQualifiedName()); - - return this; + return isTypeFilter(false, type); } - public ResourceValidator isTypeFilterOnCollection(final FullQualifiedName expectedType) { + public ResourceValidator isTypeFilterOnCollection(final FullQualifiedName type) { + return isTypeFilter(true, type); + } + + private ResourceValidator isTypeFilter(final boolean onCollection, final FullQualifiedName type) { assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), uriPathInfo instanceof UriResourceWithKeysImpl); UriResourceWithKeysImpl uriPathInfoKeyPred = (UriResourceWithKeysImpl) uriPathInfo; - // input parameter type may be null in order to assert that the collectionTypeFilter is not set - EdmType actualType = uriPathInfoKeyPred.getTypeFilterOnCollection(); - if(actualType == null && expectedType != null){ - fail("Expected an collection type filter of type: " + expectedType.getFullQualifiedNameAsString()); - } - assertEquals(expectedType, - expectedType == null || actualType == null ? actualType : actualType.getFullQualifiedName()); + // input parameter type may be null in order to assert that the type filter is not set + final EdmType actualType = onCollection ? + uriPathInfoKeyPred.getTypeFilterOnCollection() : + uriPathInfoKeyPred.getTypeFilterOnEntry(); + assertTrue("Expected a type filter of type: " + (type == null ? null : type.getFullQualifiedNameAsString()), + type == null || actualType != null); + assertEquals(type, type == null || actualType == null ? actualType : actualType.getFullQualifiedName()); return this; } // other functions public ResourceValidator isKeyPredicateRef(final int index, final String name, final String referencedProperty) { - assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), - uriPathInfo instanceof UriResourceWithKeysImpl); - UriResourceWithKeysImpl info = (UriResourceWithKeysImpl) uriPathInfo; - List keyPredicates = info.getKeyPredicates(); - assertEquals(name, keyPredicates.get(index).getName()); - assertEquals(referencedProperty, keyPredicates.get(index).getReferencedProperty()); + final UriParameter keyPredicate = getKeyPredicate(index); + assertEquals(name, keyPredicate.getName()); + assertEquals(referencedProperty, keyPredicate.getReferencedProperty()); return this; } public ResourceValidator isKeyPredicateAlias(final int index, final String name, final String alias) { - assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), - uriPathInfo instanceof UriResourceWithKeysImpl); - UriResourceWithKeysImpl info = (UriResourceWithKeysImpl) uriPathInfo; - List keyPredicates = info.getKeyPredicates(); - assertEquals(name, keyPredicates.get(index).getName()); - assertEquals(alias, keyPredicates.get(index).getAlias()); + final UriParameter keyPredicate = getKeyPredicate(index); + assertEquals(name, keyPredicate.getName()); + assertEquals(alias, keyPredicate.getAlias()); return this; - } public ResourceValidator isKeyPredicate(final int index, final String name, final String text) { + final UriParameter keyPredicate = getKeyPredicate(index); + assertEquals(name, keyPredicate.getName()); + assertEquals(text, keyPredicate.getText()); + return this; + } + + private UriParameter getKeyPredicate(final int index) { assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), uriPathInfo instanceof UriResourceWithKeysImpl); - UriResourceWithKeysImpl info = (UriResourceWithKeysImpl) uriPathInfo; - List keyPredicates = info.getKeyPredicates(); - assertEquals(name, keyPredicates.get(index).getName()); - assertEquals(text, keyPredicates.get(index).getText()); - return this; - + return ((UriResourceWithKeysImpl) uriPathInfo).getKeyPredicates().get(index); } public ResourceValidator isParameter(final int index, final String name, final String text) { - assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), - uriPathInfo instanceof UriResourceFunction); - UriResourceFunction info = (UriResourceFunction) uriPathInfo; - List keyPredicates = info.getParameters(); - assertEquals(name, keyPredicates.get(index).getName()); - assertEquals(text, keyPredicates.get(index).getText()); + isUriPathInfoKind(UriResourceKind.function); + final UriParameter parameter = ((UriResourceFunction) uriPathInfo).getParameters().get(index); + assertEquals(name, parameter.getName()); + assertEquals(text, parameter.getText()); return this; - } public ResourceValidator isParameterAlias(final int index, final String name, final String alias) { - assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), - uriPathInfo instanceof UriResourceFunction); - UriResourceFunction info = (UriResourceFunction) uriPathInfo; - List keyPredicates = info.getParameters(); - assertEquals(name, keyPredicates.get(index).getName()); - assertEquals(alias, keyPredicates.get(index).getAlias()); - return this; - - } - - public ResourceValidator isKind(final UriInfoKind kind) { - assertEquals("Invalid UriInfoKind: " + uriInfo.getKind().toString(), - kind, uriInfo.getKind()); + isUriPathInfoKind(UriResourceKind.function); + final UriParameter parameter = ((UriResourceFunction) uriPathInfo).getParameters().get(index); + assertEquals(name, parameter.getName()); + assertEquals(alias, parameter.getAlias()); return this; } - public ResourceValidator isPrimitiveProperty(final String name, - final FullQualifiedName type, final boolean isCollection) { - assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), - uriPathInfo instanceof UriResourcePrimitiveProperty); - UriResourcePrimitiveProperty uriPathInfoProp = (UriResourcePrimitiveProperty) uriPathInfo; - - EdmElement property = uriPathInfoProp.getProperty(); - - assertEquals(name, property.getName()); - assertEquals(type, property.getType().getFullQualifiedName()); - assertEquals(isCollection, property.isCollection()); - return this; + public ResourceValidator isPrimitiveProperty(final String name, final FullQualifiedName type, + final boolean isCollection) { + return isProperty(UriResourceKind.primitiveProperty, name, type, isCollection); } public ResourceValidator isComplexProperty(final String name, final FullQualifiedName type, final boolean isCollection) { - assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), - uriPathInfo instanceof UriResourceComplexProperty); - UriResourceComplexProperty uriPathInfoProp = (UriResourceComplexProperty) uriPathInfo; - - EdmElement property = uriPathInfoProp.getProperty(); - - assertEquals(name, property.getName()); - assertEquals(type, property.getType().getFullQualifiedName()); - assertEquals(isCollection, property.isCollection()); - return this; + return isProperty(UriResourceKind.complexProperty, name, type, isCollection); } public ResourceValidator isNavProperty(final String name, final FullQualifiedName type, final boolean isCollection) { - assertTrue("invalid resource kind: " + uriPathInfo.getKind().toString(), - uriPathInfo instanceof UriResourceNavigation); - UriResourceNavigation uriPathInfoProp = (UriResourceNavigation) uriPathInfo; - - EdmElement property = uriPathInfoProp.getProperty(); + return isProperty(UriResourceKind.navigationProperty, name, type, isCollection); + } + private ResourceValidator isProperty(final UriResourceKind kind, + final String name, final FullQualifiedName type, final boolean isCollection) { + isUriPathInfoKind(kind); + final EdmElement property = kind == UriResourceKind.navigationProperty ? + ((UriResourceNavigation) uriPathInfo).getProperty() : + ((UriResourceProperty) uriPathInfo).getProperty(); assertEquals(name, property.getName()); - assertEquals(type, property.getType().getFullQualifiedName()); - assertEquals(isCollection, uriPathInfoProp.isCollection()); + isType(type, isCollection); return this; } public ResourceValidator isUriPathInfoKind(final UriResourceKind infoType) { assertNotNull(uriPathInfo); - assertEquals(infoType, uriPathInfo.getKind()); + assertEquals("invalid resource kind: " + uriPathInfo.getKind().toString(), infoType, uriPathInfo.getKind()); return this; } @@ -361,6 +296,12 @@ public class ResourceValidator implements TestValidator { return this; } + public ResourceValidator isActionImport(final String name) { + isUriPathInfoKind(UriResourceKind.action); + assertEquals(name, ((UriResourceAction) uriPathInfo).getActionImport().getName()); + return this; + } + public ResourceValidator isFunction(final String name) { isUriPathInfoKind(UriResourceKind.function); assertEquals(name, ((UriResourceFunction) uriPathInfo).getFunction().getName()); @@ -379,12 +320,6 @@ public class ResourceValidator implements TestValidator { return this; } - public ResourceValidator isComplex(final String name) { - isUriPathInfoKind(UriResourceKind.complexProperty); - assertEquals(name, ((UriResourceComplexProperty) uriPathInfo).getProperty().getName()); - return this; - } - public ResourceValidator isSingleton(final String name) { isUriPathInfoKind(UriResourceKind.singleton); assertEquals(name, ((UriResourceSingleton) uriPathInfo).getSingleton().getName()); @@ -403,12 +338,6 @@ public class ResourceValidator implements TestValidator { return isUriPathInfoKind(UriResourceKind.ref); } - public ResourceValidator isActionImport(final String actionName) { - isUriPathInfoKind(UriResourceKind.action); - assertEquals(actionName, ((UriResourceAction) uriPathInfo).getActionImport().getName()); - return this; - } - public ResourceValidator isIt() { return isUriPathInfoKind(UriResourceKind.it); }