public void TryTranslateFunctionSegmentTemplate_ReturnsFalse_WithOptionalParameterMisMatch()
        {
            // Arrange
            EdmModel model = new EdmModel();

            _edmFunction.AddOptionalParameter("min", IntType);
            _edmFunction.AddOptionalParameter("max", IntType);
            model.AddElement(_edmFunction);

            IDictionary <string, string> parameters = new Dictionary <string, string>
            {
                { "name", "{name}" },
                { "title", "{title}" },
                { "min", "{min}" },
            };
            FunctionSegmentTemplate template = new FunctionSegmentTemplate(parameters, _edmFunction, null);

            RouteValueDictionary          routeValues = new RouteValueDictionary(new { name = "'pt'", title = "'abc'", min = "42,max=5" });
            ODataTemplateTranslateContext context     = new ODataTemplateTranslateContext
            {
                RouteValues = routeValues,
                Model       = model
            };

            // Act
            bool ok = template.TryTranslate(context);

            // Assert
            Assert.False(ok);
            Assert.Empty(context.Segments);
        }
        public void CtorFunctionSegmentTemplate_SetsProperties()
        {
            // Arrange & Act
            FunctionSegmentTemplate segment = new FunctionSegmentTemplate(_edmFunction, null);

            // Assert
            Assert.Same(_edmFunction, segment.Function);
            Assert.Null(segment.NavigationSource);
            Assert.Collection(segment.ParameterMappings,
                              e =>
            {
                Assert.Equal("name", e.Key);
                Assert.Equal("name", e.Value);
            },
                              e =>
            {
                Assert.Equal("title", e.Key);
                Assert.Equal("title", e.Value);
            });

            // Arrange
            OperationSegment operationSegment = new OperationSegment(_edmFunction, null);

            // Act
            segment = new FunctionSegmentTemplate(operationSegment);

            // Assert
            Assert.Same(_edmFunction, segment.Function);
            Assert.Null(segment.NavigationSource);
        }
        public void TryTranslateFunctionImportSegmentTemplate_ReturnsTemplates_ForEmptyParameter()
        {
            // Arrange
            EdmModel    edmModel = new EdmModel();
            EdmFunction function = new EdmFunction("NS", "MyFunction", IntType, true, null, false);

            function.AddParameter("bindingParameter", IntType);
            edmModel.AddElement(function);

            FunctionSegmentTemplate       template = new FunctionSegmentTemplate(function, null);
            ODataTemplateTranslateContext context  = new ODataTemplateTranslateContext
            {
                RouteValues = new RouteValueDictionary(),
                Model       = edmModel
            };

            // Act
            bool ok = template.TryTranslate(context);

            // Assert
            Assert.True(ok);
            ODataPathSegment actual          = Assert.Single(context.Segments);
            OperationSegment functionSegment = Assert.IsType <OperationSegment>(actual);

            Assert.Same(function, functionSegment.Operations.First());
            Assert.Empty(functionSegment.Parameters);
        }
        public void GetTemplatesFunctionImportSegmentTemplate_ReturnsTemplates_ForEmptyParameter()
        {
            // Arrange
            EdmFunction function = new EdmFunction("NS", "MyFunction", IntType, true, null, false);

            function.AddParameter("bindingParameter", IntType);
            FunctionSegmentTemplate functionSegment = new FunctionSegmentTemplate(function, null);

            // Act & Assert
            IEnumerable <string> templates = functionSegment.GetTemplates();

            Assert.Collection(templates,
                              e =>
            {
                Assert.Equal("/NS.MyFunction()", e);
            },
                              e =>
            {
                Assert.Equal("/MyFunction()", e);
            });

            // Act & Assert
            templates = functionSegment.GetTemplates(new ODataRouteOptions
            {
                EnableNonParenthesisForEmptyParameterFunction = true,
                EnableQualifiedOperationCall = false
            });
            string template = Assert.Single(templates);

            Assert.Equal("/MyFunction", template);
        }
Ejemplo n.º 5
0
        public void CommonFunctionTemplateProperties_ReturnsAsExpected_WithParameters()
        {
            // Assert
            var         primitive = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.Int32, false);
            EdmFunction function  = new EdmFunction("NS", "MyFunction", primitive, true, null, false);

            function.AddParameter("bindingParameter", primitive);
            function.AddParameter("name", primitive);
            function.AddParameter("title", primitive);
            function.AddOptionalParameter("option1", primitive);
            function.AddOptionalParameter("option2", primitive);
            IDictionary <string, string> parameters = new Dictionary <string, string>
            {
                { "name", "{nameTemp}" },
                { "title", "{titleTemp}" },
                { "option2", "{option2Temp}" },
            };

            FunctionSegmentTemplate functionSegment = new FunctionSegmentTemplate(parameters, function, null);

            // Act & Assert
            Assert.Equal("NS.MyFunction({nameTemp;titleTemp;option2Temp})", functionSegment.Literal);
            Assert.Equal(ODataSegmentKind.Function, functionSegment.Kind);
            Assert.True(functionSegment.IsSingle);
            Assert.Same(primitive.Definition, functionSegment.EdmType);
            Assert.Null(functionSegment.NavigationSource);
        }
        public void TryTranslateFunctionSegmentTemplate_ThrowsArgumentNull_Context()
        {
            // Arrange
            FunctionSegmentTemplate template = new FunctionSegmentTemplate(_edmFunction, null);

            // Act & Assert
            ExceptionAssert.ThrowsArgumentNull(() => template.TryTranslate(null), "context");
        }
        public void TryTranslateFunctionSegmentTemplate_ReturnsODataFunctionSegment_WithOptionalParameters()
        {
            // Arrange
            EdmModel model = new EdmModel();

            _edmFunction.AddOptionalParameter("min", IntType);
            _edmFunction.AddOptionalParameter("max", IntType);
            model.AddElement(_edmFunction);

            IDictionary <string, string> parameters = new Dictionary <string, string>
            {
                { "name", "{nameTemp}" },
                { "title", "{titleTemp}" },
                { "min", "{minTemp}" },
            };
            FunctionSegmentTemplate template = new FunctionSegmentTemplate(parameters, _edmFunction, null);

            RouteValueDictionary          routeValues = new RouteValueDictionary(new { nameTemp = "'pt'", titleTemp = "'abc'", minTemp = "42" });
            ODataTemplateTranslateContext context     = new ODataTemplateTranslateContext
            {
                RouteValues = routeValues,
                Model       = model
            };

            // Act
            bool ok = template.TryTranslate(context);

            // Assert
            Assert.True(ok);

            ODataPathSegment actual          = Assert.Single(context.Segments);
            OperationSegment functionSegment = Assert.IsType <OperationSegment>(actual);

            Assert.Same(_edmFunction, functionSegment.Operations.First());
            Assert.Equal(3, functionSegment.Parameters.Count());
            Assert.Collection(functionSegment.Parameters,
                              e =>
            {
                Assert.Equal("name", e.Name);
                Assert.Equal("pt", e.Value);
            },
                              e =>
            {
                Assert.Equal("title", e.Name);
                Assert.Equal("abc", e.Value);
            },
                              e =>
            {
                Assert.Equal("min", e.Name);
                Assert.Equal(42, e.Value);
            });
        }
        public void TryTranslateFunctionSegmentTemplate_ReturnsODataFunctionSegment(bool hasRouteData)
        {
            // Arrange
            var         primitive = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.Int32, false);
            EdmFunction function  = new EdmFunction("NS", "MyFunction", primitive, true, null, false);

            function.AddParameter("bindingParameter", primitive);
            function.AddParameter("age", primitive);
            function.AddParameter("price", primitive);

            FunctionSegmentTemplate template = new FunctionSegmentTemplate(function, null);
            EdmModel edmModel = new EdmModel();

            edmModel.AddElement(function);

            RouteValueDictionary routeValue;

            if (hasRouteData)
            {
                routeValue = new RouteValueDictionary(new { age = "34", price = "9" });
            }
            else
            {
                routeValue = new RouteValueDictionary(); // Empty
            }

            ODataTemplateTranslateContext context = new ODataTemplateTranslateContext
            {
                RouteValues = routeValue,
                Model       = edmModel
            };

            // Act
            bool ok = template.TryTranslate(context);

            // Assert
            if (hasRouteData)
            {
                Assert.True(ok);
                ODataPathSegment actual          = Assert.Single(context.Segments);
                OperationSegment functionSegment = Assert.IsType <OperationSegment>(actual);
                Assert.Same(function, functionSegment.Operations.First());
                Assert.Equal(2, functionSegment.Parameters.Count());
                Assert.Equal(new[] { "age", "price" }, functionSegment.Parameters.Select(p => p.Name));
            }
            else
            {
                Assert.False(ok);
                Assert.Empty(context.Segments);
            }
        }
Ejemplo n.º 9
0
        public void Translate_ReturnsODataFunctionSegment(bool hasRouteData)
        {
            // Arrange
            var         primitive = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.Int32, false);
            EdmFunction function  = new EdmFunction("NS", "MyFunction", primitive, true, null, false);

            function.AddParameter("bindingParameter", primitive);
            function.AddParameter("age", primitive);
            function.AddParameter("price", primitive);

            FunctionSegmentTemplate template    = new FunctionSegmentTemplate(function, null);
            HttpContext             httpContext = new Mock <HttpContext>().Object;
            EdmModel edmModel = new EdmModel();

            edmModel.AddElement(function);

            RouteValueDictionary routeValue;

            if (hasRouteData)
            {
                // routeValue = new RouteValueDictionary(new { age = "34", price = "9" });
                routeValue = new RouteValueDictionary
                {
                    { "age;price", "age=34,price=9" }
                };
            }
            else
            {
                routeValue = new RouteValueDictionary(); // Empty
            }

            ODataTemplateTranslateContext context = new ODataTemplateTranslateContext(httpContext, routeValue, edmModel);

            // Act
            ODataPathSegment actual = template.Translate(context);

            // Assert
            if (hasRouteData)
            {
                Assert.NotNull(actual);
                OperationSegment functionSegment = Assert.IsType <OperationSegment>(actual);
                Assert.Same(function, functionSegment.Operations.First());
                Assert.Equal(2, functionSegment.Parameters.Count());
                Assert.Equal(new[] { "age", "price" }, functionSegment.Parameters.Select(p => p.Name));
            }
            else
            {
                Assert.Null(actual);
            }
        }
        public void GetTemplatesFunctionSegmentTemplate_ReturnsTemplates()
        {
            // Assert
            _edmFunction.AddOptionalParameter("option1", IntType);
            _edmFunction.AddOptionalParameter("option2", IntType);
            IDictionary <string, string> parameters = new Dictionary <string, string>
            {
                { "name", "{nameTemp}" },
                { "title", "{titleTemp}" },
                { "option2", "{option2Temp}" },
            };

            FunctionSegmentTemplate functionSegment = new FunctionSegmentTemplate(parameters, _edmFunction, null);

            // Act & Assert
            IEnumerable <string> templates = functionSegment.GetTemplates();

            Assert.Collection(templates,
                              e =>
            {
                Assert.Equal("/NS.MyFunction(name={nameTemp},title={titleTemp},option2={option2Temp})", e);
            },
                              e =>
            {
                Assert.Equal("/MyFunction(name={nameTemp},title={titleTemp},option2={option2Temp})", e);
            });

            // Act & Assert
            templates = functionSegment.GetTemplates(new ODataRouteOptions
            {
                EnableUnqualifiedOperationCall = false
            });

            string template = Assert.Single(templates);

            Assert.Equal("/NS.MyFunction(name={nameTemp},title={titleTemp},option2={option2Temp})", template);

            // Act & Assert
            templates = functionSegment.GetTemplates(new ODataRouteOptions
            {
                EnableQualifiedOperationCall = false
            });

            template = Assert.Single(templates);
            Assert.Equal("/MyFunction(name={nameTemp},title={titleTemp},option2={option2Temp})", template);
        }
        public void FunctionCommonProperties_ReturnsAsExpected()
        {
            // Assert
            var         primitive = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.Int32, false);
            EdmFunction function  = new EdmFunction("NS", "MyFunction", primitive, true, null, false);

            function.AddParameter("bindingParameter", primitive);
            function.AddParameter("name", primitive);
            function.AddParameter("title", primitive);

            FunctionSegmentTemplate functionSegment = new FunctionSegmentTemplate(function, null);

            // Act & Assert
            Assert.Equal("NS.MyFunction(name={name},title={title})", functionSegment.Literal);
            Assert.Equal(ODataSegmentKind.Function, functionSegment.Kind);
            Assert.True(functionSegment.IsSingle);
            Assert.Same(primitive.Definition, functionSegment.EdmType);
            Assert.Null(functionSegment.NavigationSource);
        }
Ejemplo n.º 12
0
        public void ParseODataUriTemplate_ForFunctions(string template, int count)
        {
            // Arrange
            // function with optional parameters
            EdmFunction getSalaray = new EdmFunction("NS", "GetWholeSalary", IntType, isBound: true, entitySetPathExpression: null, isComposable: false);

            getSalaray.AddParameter("entityset", new EdmCollectionTypeReference(new EdmCollectionType(new EdmEntityTypeReference(_customerType, false))));
            getSalaray.AddParameter("minSalary", IntType);
            getSalaray.AddOptionalParameter("maxSalary", IntType);
            getSalaray.AddOptionalParameter("aveSalary", IntType, "129");
            _edmModel.AddElement(getSalaray);

            IODataPathTemplateParser parser = new DefaultODataPathTemplateParser();
            MockServiceProvider      sp     = null;

            if (!template.Contains("NS."))
            {
                sp = new MockServiceProvider(_edmModel);
            }

            // Act
            ODataPathTemplate path = parser.Parse(_edmModel, template, sp);

            // Assert
            Assert.NotNull(path);
            Assert.Equal(2, path.Count);
            FunctionSegmentTemplate functionSegment = Assert.IsType <FunctionSegmentTemplate>(path[1]);

            Assert.Equal(count, functionSegment.ParameterMappings.Count);

            if (count == 2)
            {
                Assert.Equal(new[] { "minSalary", "maxSalary" }, functionSegment.ParameterMappings.Keys);
                Assert.Equal(new[] { "min", "max" }, functionSegment.ParameterMappings.Values);
            }
            else
            {
                Assert.Equal(new[] { "minSalary", "maxSalary", "aveSalary" }, functionSegment.ParameterMappings.Keys);
                Assert.Equal(new[] { "min", "max", "ave" }, functionSegment.ParameterMappings.Values);
            }
        }
        public void TryTranslateFunctionSegmentTemplate_ReturnsODataFunctionSegment_UsingEscapedString()
        {
            // Arrange
            var         primitive = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.String, false);
            EdmFunction function  = new EdmFunction("NS", "MyFunction", primitive, true, null, false);

            function.AddParameter("bindingParameter", primitive);
            function.AddParameter("name", primitive);

            FunctionSegmentTemplate template = new FunctionSegmentTemplate(function, null);
            EdmModel edmModel = new EdmModel();

            edmModel.AddElement(function);

            RouteValueDictionary routeValue = new RouteValueDictionary(new { name = "'Ji%2FChange%23%20T'" });

            ODataTemplateTranslateContext context = new ODataTemplateTranslateContext
            {
                RouteValues = routeValue,
                Model       = edmModel
            };

            // Act
            bool ok = template.TryTranslate(context);

            // Assert
            Assert.True(ok);
            ODataPathSegment actual          = Assert.Single(context.Segments);
            OperationSegment functionSegment = Assert.IsType <OperationSegment>(actual);

            Assert.Same(function, functionSegment.Operations.First());
            var parameter = Assert.Single(functionSegment.Parameters);

            Assert.Equal("name", parameter.Name);
            Assert.Equal("Ji/Change# T", parameter.Value.ToString());
        }
Ejemplo n.º 14
0
 public static ODataOperationSegment ConvertTo(this FunctionSegmentTemplate function)
 {
     return(new ODataOperationSegment(function.Function));
 }
Ejemplo n.º 15
0
        public static ODataPath Translate(this ODataPathTemplate pathTemplate)
        {
            if (pathTemplate.Count == 0)
            {
                // It's service root, so far, let's skip it.
                return(null);
            }

            IList <ODataSegment> newSegments = new List <ODataSegment>();

            foreach (var segment in pathTemplate)
            {
                switch (segment.Kind)
                {
                case ODataSegmentKind.Metadata:
                    newSegments.Add(new ODataMetadataSegment());
                    break;

                case ODataSegmentKind.EntitySet:
                    EntitySetSegmentTemplate entitySet = (EntitySetSegmentTemplate)segment;
                    newSegments.Add(entitySet.ConvertTo());
                    break;

                case ODataSegmentKind.Singleton:
                    SingletonSegmentTemplate singleton = (SingletonSegmentTemplate)segment;
                    newSegments.Add(singleton.ConvertTo());
                    break;

                case ODataSegmentKind.Key:
                    KeySegmentTemplate key = (KeySegmentTemplate)segment;
                    newSegments.Add(key.ConvertTo());
                    break;

                case ODataSegmentKind.Cast:
                    CastSegmentTemplate cast = (CastSegmentTemplate)segment;
                    newSegments.Add(cast.ConvertTo());
                    break;

                case ODataSegmentKind.Property:
                    // TODO:
                    return(null);

                //PropertySegmentTemplate property = (PropertySegmentTemplate)segment;
                //newSegments.Add(property.ConvertTo());
                //break;

                case ODataSegmentKind.Navigation:
                    NavigationSegmentTemplate navigation = (NavigationSegmentTemplate)segment;
                    newSegments.Add(navigation.ConvertTo());
                    break;

                case ODataSegmentKind.Function:
                    FunctionSegmentTemplate function = (FunctionSegmentTemplate)segment;
                    newSegments.Add(function.ConvertTo());
                    break;

                case ODataSegmentKind.Action:
                    ActionSegmentTemplate action = (ActionSegmentTemplate)segment;
                    newSegments.Add(action.ConvertTo());
                    break;

                case ODataSegmentKind.FunctionImport:
                    FunctionImportSegmentTemplate functionImport = (FunctionImportSegmentTemplate)segment;
                    newSegments.Add(functionImport.ConvertTo());
                    break;

                case ODataSegmentKind.ActionImport:
                    ActionImportSegmentTemplate actionImport = (ActionImportSegmentTemplate)segment;
                    newSegments.Add(actionImport.ConvertTo());
                    break;

                case ODataSegmentKind.Value:
                    return(null);

                //ValueSegmentTemplate value = (ValueSegmentTemplate)segment;
                //newSegments.Add(value.ConvertTo());
                //break;

                case ODataSegmentKind.Ref:
                    return(null);

                //KeySegmentTemplate key = (KeySegmentTemplate)segment;
                //newSegments.Add(key.ConvertTo());
                //break;

                case ODataSegmentKind.NavigationLink:
                    return(null);

                //NavigationLinkSegmentTemplate navigationLink = (NavigationLinkSegmentTemplate)segment;
                //newSegments.Add(navigationLink.ConvertTo());
                //break;

                case ODataSegmentKind.Count:
                    CountSegmentTemplate count = (CountSegmentTemplate)segment;
                    newSegments.Add(count.ConvertTo());
                    break;

                case ODataSegmentKind.PathTemplate:
                    return(null);

                //KeySegmentTemplate key = (KeySegmentTemplate)segment;
                //newSegments.Add(key.ConvertTo());
                //break;

                case ODataSegmentKind.Dynamic:
                    return(null);

                //KeySegmentTemplate key = (KeySegmentTemplate)segment;
                //newSegments.Add(key.ConvertTo());
                //break;

                default:
                    throw new NotSupportedException();
                }
            }

            return(new ODataPath(newSegments));
        }