/// <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); }
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")); }
/// <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); }
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))); }
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")); }