Ejemplo n.º 1
0
        /// <summary>Implements the visitor pattern for the function.</summary>
        /// <returns>The implemented visitor pattern.</returns>
        /// <param name="functionMetadata">The function metadata.</param>
        protected override EdmFunction VisitFunction(EdmFunction functionMetadata)
        {
            List <TypeUsage> typeUsageList = new List <TypeUsage>(functionMetadata.Parameters.Count);

            foreach (FunctionParameter parameter in functionMetadata.Parameters)
            {
                TypeUsage typeUsage = this.VisitTypeUsage(parameter.TypeUsage);
                typeUsageList.Add(typeUsage);
            }
            if (DataSpace.SSpace == functionMetadata.DataSpace)
            {
                EdmFunction function = (EdmFunction)null;
                if (this._metadata.TryGetFunction(functionMetadata.Name, functionMetadata.NamespaceName, typeUsageList.ToArray(), false, functionMetadata.DataSpace, out function) && function != null)
                {
                    return(function);
                }
            }
            else
            {
                IList <EdmFunction> functionOverloads;
                if (this._perspective.TryGetFunctionByName(functionMetadata.NamespaceName, functionMetadata.Name, false, out functionOverloads))
                {
                    bool        isAmbiguous;
                    EdmFunction edmFunction = FunctionOverloadResolver.ResolveFunctionOverloads(functionOverloads, (IList <TypeUsage>)typeUsageList, false, out isAmbiguous);
                    if (!isAmbiguous && edmFunction != null)
                    {
                        return(edmFunction);
                    }
                }
            }
            throw new ArgumentException(Strings.Cqt_Copier_FunctionNotFound((object)TypeHelpers.GetFullName(functionMetadata.NamespaceName, functionMetadata.Name)));
        }
        public void ActionSuccessfullyResolvedWithDerivedType()
        {
            var parameters = new string[] { };

            IEdmOperation function;

            FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.Move", parameters, HardCodedTestModel.GetManagerType(), HardCodedTestModel.TestModel, out function, ODataUriResolver.Default).Should().BeTrue();
            function.Should().BeSameAs(HardCodedTestModel.GetMoveOverloadForEmployee());
        }
        public void SingleFunctionSuccessfullyResolved()
        {
            var parameters = new[] { "inOffice" };

            IEdmOperation function;

            FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.HasDog", parameters, HardCodedTestModel.GetPersonType(), HardCodedTestModel.TestModel, out function, ODataUriResolver.Default).Should().BeTrue();
            function.Should().BeSameAs(HardCodedTestModel.GetHasDogOverloadForPeopleWithTwoParameters());
        }
        public void SingleServiceOperationSuccessfullyResolved()
        {
            var parameters = new string[] { };

            IEdmOperationImport function;

            FunctionOverloadResolver.ResolveOperationImportFromList("GetCoolPeople", parameters, HardCodedTestModel.TestModel, out function, ODataUriResolver.Default).Should().BeTrue();
            function.Should().BeSameAs(HardCodedTestModel.GetFunctionImportForGetCoolPeople());
        }
        public void ActionWithMultipleOverloadsForTheSameBindingParameter()
        {
            var model      = ModelBuildingHelpers.GetModelWithIllegalActionOverloads();
            var parameters = new string[] { };

            IEdmOperationImport function;
            Action resolve = () => FunctionOverloadResolver.ResolveOperationImportFromList("Action", parameters, model, out function, ODataUriResolver.Default);

            resolve.ShouldThrow <ODataException>().WithMessage(ODataErrorStrings.FunctionOverloadResolver_MultipleActionImportOverloads("Action"));
        }
        public void ActionWithParametersInURLShouldThrowError()
        {
            var model      = HardCodedTestModel.TestModel;
            var parameters = new string[] { "123 bob st." };

            IEdmOperation function;
            Action        test = () => FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.Move", parameters, HardCodedTestModel.GetPersonType(), model, out function, ODataUriResolver.Default);

            test.ShouldThrow <ODataException>().WithMessage(ODataErrorStrings.RequestUriProcessor_SegmentDoesNotSupportKeyPredicates("Fully.Qualified.Namespace.Move"));
        }
        public void ModelWithMultipleOverloadedActionsShouldThrow()
        {
            var model      = ModelBuildingHelpers.GetModelWithMixedActionsAndFunctionsWithSameName();
            var parameters = new string[0];

            IEdmOperationImport function;
            Action test = () => FunctionOverloadResolver.ResolveOperationImportFromList("Foo", parameters, model, out function, ODataUriResolver.Default);

            test.ShouldThrow <ODataException>().WithMessage(ODataErrorStrings.FunctionOverloadResolver_MultipleOperationImportOverloads("Foo"));
        }
        public void SingleServiceOperationSuccessfullyResolved()
        {
            var parameters = new string[] { };

            IEdmOperationImport function;
            var result = FunctionOverloadResolver.ResolveOperationImportFromList("GetCoolPeople", parameters, HardCodedTestModel.TestModel, out function, DefaultUriResolver);

            Assert.True(result);
            Assert.Same(HardCodedTestModel.GetFunctionImportForGetCoolPeople(), function);
        }
        public void ActionSuccessfullyResolvedWithDerivedType()
        {
            var parameters = new string[] { };

            IEdmOperation function;
            var           result = FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.Move", parameters, HardCodedTestModel.GetManagerType(), HardCodedTestModel.TestModel, out function, DefaultUriResolver);

            Assert.True(result);
            Assert.Same(HardCodedTestModel.GetMoveOverloadForEmployee(), function);
        }
        public void SingleFunctionSuccessfullyResolved()
        {
            var parameters = new[] { "inOffice" };

            IEdmOperation function;
            var           result = FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.HasDog", parameters, HardCodedTestModel.GetPersonType(), HardCodedTestModel.TestModel, out function, DefaultUriResolver);

            Assert.True(result);
            Assert.Same(HardCodedTestModel.GetHasDogOverloadForPeopleWithTwoParameters(), function);
        }
Ejemplo n.º 11
0
        public void OperationOverloadsWithSameNameWithoutBindingType()
        {
            var model      = ModelBuildingHelpers.GetModelWithOperationOverloadsWithSameName();
            var parameters = new string[] {};

            IEdmOperation operation;
            Action        resolve = () => FunctionOverloadResolver.ResolveOperationFromList("Test.Action", parameters, null, model, out operation, DefaultUriResolver);

            resolve.Throws <ODataException>(ODataErrorStrings.FunctionOverloadResolver_MultipleActionOverloads("Test.Action"));
        }
Ejemplo n.º 12
0
        /// <summary>Implements the visitor pattern for the function.</summary>
        /// <returns>The implemented visitor pattern.</returns>
        /// <param name="functionMetadata">The function metadata.</param>
        protected override EdmFunction VisitFunction(EdmFunction functionMetadata)
        {
            var paramTypes = new List <TypeUsage>(functionMetadata.Parameters.Count);

            foreach (var funcParam in functionMetadata.Parameters)
            {
                var mappedParamType = VisitTypeUsage(funcParam.TypeUsage);
                paramTypes.Add(mappedParamType);
            }

            if (DataSpace.SSpace
                == functionMetadata.DataSpace)
            {
                EdmFunction foundFunc = null;
                if (_metadata.TryGetFunction(
                        functionMetadata.Name,
                        functionMetadata.NamespaceName,
                        paramTypes.ToArray(),
                        false /* ignoreCase */,
                        functionMetadata.DataSpace,
                        out foundFunc)
                    &&
                    foundFunc != null)
                {
                    return(foundFunc);
                }
            }
            else
            {
                // Find the function or function import.
                IList <EdmFunction> candidateFunctions;
                if (_perspective.TryGetFunctionByName(
                        functionMetadata.NamespaceName, functionMetadata.Name, /*ignoreCase:*/ false, out candidateFunctions))
                {
                    Debug.Assert(
                        null != candidateFunctions && candidateFunctions.Count > 0,
                        "Perspective.TryGetFunctionByName returned true with null/empty function result list");

                    bool isAmbiguous;
                    var  retFunc = FunctionOverloadResolver.ResolveFunctionOverloads(
                        candidateFunctions, paramTypes, /*isGroupAggregateFunction:*/ false, out isAmbiguous);
                    if (!isAmbiguous
                        &&
                        retFunc != null)
                    {
                        return(retFunc);
                    }
                }
            }

            throw new ArgumentException(
                      Strings.Cqt_Copier_FunctionNotFound(TypeHelpers.GetFullName(functionMetadata.NamespaceName, functionMetadata.Name)));
        }
        public void OverloadServiceOperationSuccessfullyResolved()
        {
            var model = new EdmModel();

            // Add function without parameter.
            var int32TypeReference       = EdmCoreModel.Instance.GetInt32(false);
            var functionWithoutParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference);

            model.AddElement(functionWithoutParameter);

            // Add function with parameter.
            var functionWithParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference);

            functionWithParameter.AddParameter("Parameter", int32TypeReference);
            model.AddElement(functionWithParameter);

            // Add function with two parameters.
            var functionWithTwoParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference);

            functionWithTwoParameter.AddParameter("Parameter", int32TypeReference);
            functionWithTwoParameter.AddParameter("Parameter2", int32TypeReference);
            model.AddElement(functionWithTwoParameter);

            // Add function import.
            var container = new EdmEntityContainer("Fully.Qualified.Namespace", "Container");

            model.AddElement(container);
            var functionImportWithoutParameter = container.AddFunctionImport("FunctionImport", functionWithoutParameter);
            var functionImportWithParameter    = container.AddFunctionImport("FunctionImport", functionWithParameter);
            var functionImportWithTwoParameter = container.AddFunctionImport("FunctionImport", functionWithTwoParameter);

            IEdmOperationImport functionImport;

            // Resolve overload function import without parameter.
            var parameters = new string[] { };

            FunctionOverloadResolver.ResolveOperationImportFromList("FunctionImport", parameters, model, out functionImport, ODataUriResolver.Default).Should().BeTrue();
            functionImport.Should().BeSameAs(functionImportWithoutParameter);

            // Resolve overload function import with parameter.
            parameters = new string[] { "Parameter" };
            FunctionOverloadResolver.ResolveOperationImportFromList("FunctionImport", parameters, model, out functionImport, ODataUriResolver.Default).Should().BeTrue();
            functionImport.Should().BeSameAs(functionImportWithParameter);

            // Resolve overload function import with parameter.
            parameters = new string[] { "Parameter", "Parameter2" };
            FunctionOverloadResolver.ResolveOperationImportFromList("FunctionImport", parameters, model, out functionImport, ODataUriResolver.Default).Should().BeTrue();
            functionImport.Should().BeSameAs(functionImportWithTwoParameter);
        }
        public void OverloadBoundFunctionsWithAllOptionalParametersSuccessfullyResolved()
        {
            var model = new EdmModel();

            var int32TypeReference = EdmCoreModel.Instance.GetInt32(false);

            // Add function with all optional parameters.
            var functionWithAllOptionalParameters = new EdmFunction("NS", "Function", int32TypeReference, true, null, true);

            functionWithAllOptionalParameters.AddParameter("BindingParameter", int32TypeReference);
            functionWithAllOptionalParameters.AddOptionalParameter("Parameter1", int32TypeReference);
            functionWithAllOptionalParameters.AddOptionalParameter("Parameter2", int32TypeReference);
            model.AddElement(functionWithAllOptionalParameters);

            // Add an overload function without parameter.
            var functionWithoutParameter = new EdmFunction("NS", "Function", int32TypeReference, true, null, true);

            functionWithoutParameter.AddParameter("BindingParameter", int32TypeReference);
            model.AddElement(functionWithoutParameter);

            IEdmOperation function;

            // Resolve overload function without parameter. Be noted, it picks the one with no optional parameters.
            var parameters = new string[] { };
            var result     = FunctionOverloadResolver.ResolveOperationFromList("NS.Function", parameters, int32TypeReference.Definition, model, out function, DefaultUriResolver);

            Assert.True(result);
            Assert.Same(functionWithoutParameter, function);

            // Resolve overload function with one bound and two optional parameters (one omitted).
            parameters = new string[] { "Parameter1" };
            result     = FunctionOverloadResolver.ResolveOperationFromList("NS.Function", parameters, int32TypeReference.Definition, model, out function, DefaultUriResolver);
            Assert.True(result);
            Assert.Same(functionWithAllOptionalParameters, function);

            // Resolve overload function with one bound and two optional parameters (both specified).
            parameters = new string[] { "Parameter1", "Parameter2" };
            result     = FunctionOverloadResolver.ResolveOperationFromList("NS.Function", parameters, int32TypeReference.Definition, model, out function, DefaultUriResolver);
            Assert.True(result);
            Assert.Same(functionWithAllOptionalParameters, function);

            // Return false if no match.
            parameters = new string[] { "Parameter1", "Parameter4" };
            result     = FunctionOverloadResolver.ResolveOperationFromList("NS.Function", parameters, int32TypeReference.Definition, model, out function, DefaultUriResolver);
            Assert.False(result);
        }
Ejemplo n.º 15
0
        public void OverloadBoundFunctionsSuccessfullyResolved()
        {
            var model = new EdmModel();

            // Add function without parameter.
            var int32TypeReference       = EdmCoreModel.Instance.GetInt32(false);
            var functionWithoutParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference, true, null, true);

            functionWithoutParameter.AddParameter("BindingParameter", int32TypeReference);
            model.AddElement(functionWithoutParameter);

            // Add function with parameter.
            var functionWithParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference, true, null, true);

            functionWithParameter.AddParameter("BindingParameter", int32TypeReference);
            functionWithParameter.AddParameter("Parameter", int32TypeReference);
            model.AddElement(functionWithParameter);

            // Add function with two parameters.
            var functionWithTwoParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference, true, null, true);

            functionWithTwoParameter.AddParameter("BindingParameter", int32TypeReference);
            functionWithTwoParameter.AddParameter("Parameter", int32TypeReference);
            functionWithTwoParameter.AddParameter("Parameter2", int32TypeReference);
            model.AddElement(functionWithTwoParameter);

            // Add function with two required and two optional parameters.
            var functionWithTwoRequiredOneOptionalParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference, true, null, true);

            functionWithTwoRequiredOneOptionalParameter.AddParameter("BindingParameter", int32TypeReference);
            functionWithTwoRequiredOneOptionalParameter.AddParameter("Parameter", int32TypeReference);
            functionWithTwoRequiredOneOptionalParameter.AddParameter("Parameter2", int32TypeReference);
            functionWithTwoRequiredOneOptionalParameter.AddOptionalParameter("Parameter3", int32TypeReference);
            functionWithTwoRequiredOneOptionalParameter.AddOptionalParameter("Parameter4", int32TypeReference);
            model.AddElement(functionWithTwoRequiredOneOptionalParameter);

            // Add function with one required and one optional parameters.
            var functionWithOneRequiredOneOptionalParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference, true, null, true);

            functionWithOneRequiredOneOptionalParameter.AddParameter("BindingParameter", int32TypeReference);
            functionWithOneRequiredOneOptionalParameter.AddParameter("Parameter1", int32TypeReference);
            functionWithOneRequiredOneOptionalParameter.AddOptionalParameter("Parameter3", int32TypeReference);
            model.AddElement(functionWithOneRequiredOneOptionalParameter);

            // Add function with one required and two optional parameters.
            var functionWithOneRequiredTwoOptionalParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference, true, null, true);

            functionWithOneRequiredTwoOptionalParameter.AddParameter("BindingParameter", int32TypeReference);
            functionWithOneRequiredTwoOptionalParameter.AddParameter("Parameter1", int32TypeReference);
            functionWithOneRequiredTwoOptionalParameter.AddOptionalParameter("Parameter3", int32TypeReference);
            functionWithOneRequiredTwoOptionalParameter.AddOptionalParameter("Parameter4", int32TypeReference);
            model.AddElement(functionWithOneRequiredTwoOptionalParameter);

            // Add function with one required and two optional parameters.
            var functionWithOneRequiredThreeOptionalParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference, true, null, true);

            functionWithOneRequiredThreeOptionalParameter.AddParameter("BindingParameter", int32TypeReference);
            functionWithOneRequiredThreeOptionalParameter.AddParameter("Parameter1", int32TypeReference);
            functionWithOneRequiredThreeOptionalParameter.AddOptionalParameter("Parameter3", int32TypeReference);
            functionWithOneRequiredThreeOptionalParameter.AddOptionalParameter("Parameter4", int32TypeReference);
            functionWithOneRequiredThreeOptionalParameter.AddOptionalParameter("Parameter5", int32TypeReference);
            model.AddElement(functionWithOneRequiredThreeOptionalParameter);

            IEdmOperation function;

            // Resolve overload function without parameter.
            var parameters = new string[] { };

            FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.Function", parameters, int32TypeReference.Definition, model, out function, DefaultUriResolver).Should().BeTrue();
            function.Should().BeSameAs(functionWithoutParameter);

            // Resolve overload function with parameter.
            parameters = new string[] { "Parameter" };
            FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.Function", parameters, int32TypeReference.Definition, model, out function, DefaultUriResolver).Should().BeTrue();
            function.Should().BeSameAs(functionWithParameter);

            // Resolve overload function with parameter.
            parameters = new string[] { "Parameter", "Parameter2" };
            FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.Function", parameters, int32TypeReference.Definition, model, out function, DefaultUriResolver).Should().BeTrue();
            function.Should().BeSameAs(functionWithTwoParameter);

            // Resolve overload function with two required and one optional parameter.
            parameters = new string[] { "Parameter", "Parameter2", "Parameter3" };
            FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.Function", parameters, int32TypeReference.Definition, model, out function, DefaultUriResolver).Should().BeTrue();
            function.Should().BeSameAs(functionWithTwoRequiredOneOptionalParameter);

            // Resolve overload function with one required and two optional parameters (one omitted).
            parameters = new string[] { "Parameter1", "Parameter3" };
            FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.Function", parameters, int32TypeReference.Definition, model, out function, DefaultUriResolver).Should().BeTrue();
            function.Should().BeSameAs(functionWithOneRequiredOneOptionalParameter);

            // Resolve overload function with one required and three optional parameters (one omitted).
            parameters = new string[] { "Parameter1", "Parameter3", "Parameter5" };
            FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.Function", parameters, int32TypeReference.Definition, model, out function, DefaultUriResolver).Should().BeTrue();
            function.Should().BeSameAs(functionWithOneRequiredThreeOptionalParameter);

            // Raise exception if more than one match.
            parameters = new string[] { "Parameter1", "Parameter4" };
            Action resolve = () => FunctionOverloadResolver.ResolveOperationFromList("Fully.Qualified.Namespace.Function", parameters, int32TypeReference.Definition, model, out function, DefaultUriResolver).Should().BeTrue();

            resolve.ShouldThrow <ODataException>().WithMessage(ODataErrorStrings.FunctionOverloadResolver_NoSingleMatchFound("Fully.Qualified.Namespace.Function", string.Join(",", parameters)));
        }
Ejemplo n.º 16
0
        public void OverloadServiceOperationSuccessfullyResolved()
        {
            var model = new EdmModel();

            // Add function without parameter.
            var int32TypeReference       = EdmCoreModel.Instance.GetInt32(false);
            var functionWithoutParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference);

            model.AddElement(functionWithoutParameter);

            // Add function with parameter.
            var functionWithParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference);

            functionWithParameter.AddParameter("Parameter", int32TypeReference);
            model.AddElement(functionWithParameter);

            // Add function with two parameters.
            var functionWithTwoParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference);

            functionWithTwoParameter.AddParameter("Parameter", int32TypeReference);
            functionWithTwoParameter.AddParameter("Parameter2", int32TypeReference);
            model.AddElement(functionWithTwoParameter);

            // Add function with two required and two optional parameters.
            var functionWithTwoRequiredOneOptionalParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference);

            functionWithTwoRequiredOneOptionalParameter.AddParameter("Parameter", int32TypeReference);
            functionWithTwoRequiredOneOptionalParameter.AddParameter("Parameter2", int32TypeReference);
            functionWithTwoRequiredOneOptionalParameter.AddOptionalParameter("Parameter3", int32TypeReference);
            functionWithTwoRequiredOneOptionalParameter.AddOptionalParameter("Parameter4", int32TypeReference);
            model.AddElement(functionWithTwoRequiredOneOptionalParameter);

            // Add function with one required and one optional parameters.
            var functionWithOneRequiredOneOptionalParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference);

            functionWithOneRequiredOneOptionalParameter.AddParameter("Parameter1", int32TypeReference);
            functionWithOneRequiredOneOptionalParameter.AddOptionalParameter("Parameter3", int32TypeReference);
            model.AddElement(functionWithOneRequiredOneOptionalParameter);

            // Add function with one required and two optional parameters.
            var functionWithOneRequiredTwoOptionalParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference);

            functionWithOneRequiredTwoOptionalParameter.AddParameter("Parameter1", int32TypeReference);
            functionWithOneRequiredTwoOptionalParameter.AddOptionalParameter("Parameter3", int32TypeReference);
            functionWithOneRequiredTwoOptionalParameter.AddOptionalParameter("Parameter4", int32TypeReference);
            model.AddElement(functionWithOneRequiredTwoOptionalParameter);

            // Add function with one required and two optional parameters.
            var functionWithOneRequiredThreeOptionalParameter = new EdmFunction("Fully.Qualified.Namespace", "Function", int32TypeReference, true, null, true);

            functionWithOneRequiredThreeOptionalParameter.AddParameter("BindingParameter", int32TypeReference);
            functionWithOneRequiredThreeOptionalParameter.AddParameter("Parameter1", int32TypeReference);
            functionWithOneRequiredThreeOptionalParameter.AddOptionalParameter("Parameter3", int32TypeReference);
            functionWithOneRequiredThreeOptionalParameter.AddOptionalParameter("Parameter4", int32TypeReference);
            functionWithOneRequiredThreeOptionalParameter.AddOptionalParameter("Parameter5", int32TypeReference);
            model.AddElement(functionWithOneRequiredThreeOptionalParameter);

            // Add function import.
            var container = new EdmEntityContainer("Fully.Qualified.Namespace", "Container");

            model.AddElement(container);
            var functionImportWithoutParameter = container.AddFunctionImport("FunctionImport", functionWithoutParameter);
            var functionImportWithParameter    = container.AddFunctionImport("FunctionImport", functionWithParameter);
            var functionImportWithTwoParameter = container.AddFunctionImport("FunctionImport", functionWithTwoParameter);
            var functionImportWithTwoRequiredOneOptionalParameter   = container.AddFunctionImport("FunctionImport", functionWithTwoRequiredOneOptionalParameter);
            var functionImportWithOneRequiredOneOptionalParameter   = container.AddFunctionImport("FunctionImport", functionWithOneRequiredOneOptionalParameter);
            var functionImportWithOneRequiredTwoOptionalParameter   = container.AddFunctionImport("FunctionImport", functionWithOneRequiredTwoOptionalParameter);
            var functionImportWithOneRequiredThreeOptionalParameter = container.AddFunctionImport("FunctionImport", functionWithOneRequiredThreeOptionalParameter);

            IEdmOperationImport functionImport;

            // Resolve overload function import without parameter.
            var parameters = new string[] { };

            FunctionOverloadResolver.ResolveOperationImportFromList("FunctionImport", parameters, model, out functionImport, DefaultUriResolver).Should().BeTrue();
            functionImport.Should().BeSameAs(functionImportWithoutParameter);

            // Resolve overload function import with parameter.
            parameters = new string[] { "Parameter" };
            FunctionOverloadResolver.ResolveOperationImportFromList("FunctionImport", parameters, model, out functionImport, DefaultUriResolver).Should().BeTrue();
            functionImport.Should().BeSameAs(functionImportWithParameter);

            // Resolve overload function import with parameter.
            parameters = new string[] { "Parameter", "Parameter2" };
            FunctionOverloadResolver.ResolveOperationImportFromList("FunctionImport", parameters, model, out functionImport, DefaultUriResolver).Should().BeTrue();
            functionImport.Should().BeSameAs(functionImportWithTwoParameter);

            // Resolve overload function with two required and one optional parameter.
            parameters = new string[] { "Parameter", "Parameter2", "Parameter3" };
            FunctionOverloadResolver.ResolveOperationImportFromList("FunctionImport", parameters, model, out functionImport, DefaultUriResolver).Should().BeTrue();
            functionImport.Should().BeSameAs(functionImportWithTwoRequiredOneOptionalParameter);

            // Resolve overload function with one required and two optional parameters.
            parameters = new string[] { "Parameter1", "Parameter3" };
            FunctionOverloadResolver.ResolveOperationImportFromList("FunctionImport", parameters, model, out functionImport, DefaultUriResolver).Should().BeTrue();
            functionImport.Should().BeSameAs(functionImportWithOneRequiredOneOptionalParameter);

            // Resolve overload function with one required and three optional parameters (one omitted).
            parameters = new string[] { "Parameter1", "Parameter3", "Parameter5" };
            FunctionOverloadResolver.ResolveOperationImportFromList("FunctionImport", parameters, model, out functionImport, DefaultUriResolver).Should().BeTrue();
            functionImport.Should().BeSameAs(functionImportWithOneRequiredThreeOptionalParameter);

            // Raise exception if more than one match.
            parameters = new string[] { "Parameter1", "Parameter4" };
            Action resolve = () => FunctionOverloadResolver.ResolveOperationImportFromList("FunctionImport", parameters, model, out functionImport, DefaultUriResolver);

            resolve.ShouldThrow <ODataException>().WithMessage(ODataErrorStrings.FunctionOverloadResolver_MultipleOperationImportOverloads("FunctionImport"));
        }