From 6892a2cbe0fd53a5e7e73be17a703f1b351b1921 Mon Sep 17 00:00:00 2001 From: Linh Phan Date: Tue, 27 Jan 2026 23:26:32 -0800 Subject: [PATCH 1/6] Make param look up based on serialized names. Fix template for URI path with multiple placeholders --- .../src/Providers/ClientProvider.cs | 85 ++++++++++++++++++- .../src/Providers/RestClientProvider.cs | 43 ++++------ 2 files changed, 102 insertions(+), 26 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientProvider.cs index 864ae37ac8e..326b95580b1 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientProvider.cs @@ -658,9 +658,11 @@ private MethodBodyStatement[] BuildPrimaryConstructorBody(IReadOnlyList Args) ConvertUriTemplateToFormattableString( + string uriTemplate, + IReadOnlyList parameters) + { + // Build a lookup for parameters by name (case-insensitive) + var paramsByName = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var param in parameters) + { + paramsByName[param.Name] = param; + } + + // Also add the endpoint parameter explicitly (it may have a different name) + if (!paramsByName.ContainsKey(_endpointParameter.Name)) + { + paramsByName[_endpointParameter.Name] = _endpointParameter; + } + + // Also add fields from _additionalClientFields + foreach (var field in _additionalClientFields.Value) + { + // Field names are like "_apiVersion", parameter names are like "ApiVersion" + var paramName = field.Name.TrimStart('_'); + if (!paramsByName.ContainsKey(paramName)) + { + paramsByName[paramName] = field.AsParameter; + } + } + + var args = new List(); + var result = new System.Text.StringBuilder(); + var templateSpan = uriTemplate.AsSpan(); + + while (templateSpan.Length > 0) + { + var openBrace = templateSpan.IndexOf('{'); + if (openBrace < 0) + { + // No more placeholders, append the rest + result.Append(templateSpan); + break; + } + + // Append literal part before the placeholder + result.Append(templateSpan.Slice(0, openBrace)); + templateSpan = templateSpan.Slice(openBrace + 1); + + var closeBrace = templateSpan.IndexOf('}'); + if (closeBrace < 0) + { + // Malformed template, append remaining as-is + result.Append('{'); + result.Append(templateSpan); + break; + } + + var paramName = templateSpan.Slice(0, closeBrace).ToString(); + templateSpan = templateSpan.Slice(closeBrace + 1); + + // Find the corresponding parameter or field + if (paramsByName.TryGetValue(paramName, out var param)) + { + result.Append('{'); + result.Append(args.Count); + result.Append('}'); + args.Add(param.Field ?? (ValueExpression)param); + } + else + { + // Parameter not found - this is a configuration error + throw new InvalidOperationException( + $"URI template placeholder '{{{paramName}}}' in '{uriTemplate}' could not be resolved. " + + $"Available parameters: {string.Join(", ", paramsByName.Keys)}"); + } + } + + return (result.ToString(), args); + } + private IReadOnlyList GetSubClients() { var subClients = new List(_inputClient.Children.Count); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs index 521cd137c20..cc937d529ae 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs @@ -192,10 +192,10 @@ private MethodBodyStatements BuildMessage( var operation = serviceMethod.Operation; var classifier = GetClassifier(operation); - var paramMap = new Dictionary(signature.Parameters.ToDictionary(p => p.Name)); + var paramMap = new Dictionary(signature.Parameters.ToDictionary(p => p.WireInfo.SerializedName)); foreach (var param in ClientProvider.ClientParameters) { - paramMap[param.Name] = param; + paramMap[param.WireInfo.SerializedName] = param; } InputPagingServiceMethod? pagingServiceMethod = serviceMethod as InputPagingServiceMethod; @@ -282,9 +282,9 @@ private Dictionary GetReinjectedParametersMap( foreach (var param in nextLink.ReInjectedParameters) { var reinjectedParameter = ScmCodeModelGenerator.Instance.TypeFactory.CreateParameter(param); - if (reinjectedParameter != null && paramMap.TryGetValue(reinjectedParameter.Name, out var paramInSignature)) + if (reinjectedParameter != null && paramMap.TryGetValue(reinjectedParameter.WireInfo.SerializedName, out var paramInSignature)) { - reinjectedParamsMap[param.Name] = paramInSignature; + reinjectedParamsMap[param.SerializedName] = paramInSignature; } } } @@ -298,9 +298,9 @@ private Dictionary GetReinjectedParametersMap( if (pageSizeParameter != null) { var pageSizeParam = ScmCodeModelGenerator.Instance.TypeFactory.CreateParameter(pageSizeParameter); - if (pageSizeParam != null && paramMap.TryGetValue(pageSizeParam.Name, out var paramInSignature)) + if (pageSizeParam != null && paramMap.TryGetValue(pageSizeParam.WireInfo.SerializedName, out var paramInSignature)) { - reinjectedParamsMap[pageSizeParameter.Name] = paramInSignature; + reinjectedParamsMap[pageSizeParameter.SerializedName] = paramInSignature; } } } @@ -648,36 +648,29 @@ private void AddUriSegments( /* when the parameter is in operation.uri, it is client parameter * It is not operation parameter and not in inputParamHash list. */ - var isClientParameter = ClientProvider.ClientParameters.Any(p => p.Name == paramName); + var clientParam = ClientProvider.ClientParameters.FirstOrDefault(p => p.WireInfo.SerializedName == paramName); CSharpType? type; SerializationFormat? serializationFormat; ValueExpression? valueExpression; InputParameter? inputParam = null; - if (isClientParameter) + if (clientParam != null) { - GetParamInfo(paramMap[paramName], out type, out serializationFormat, out valueExpression); + GetParamInfo(clientParam, out type, out serializationFormat, out valueExpression); } else { - if (isClientParameter) + inputParam = inputParamMap[paramName]; + if (inputParam is InputPathParameter || inputParam is InputEndpointParameter) { - GetParamInfo(paramMap[paramName], out type, out serializationFormat, out valueExpression); + GetParamInfo(paramMap, operation, inputParam, out type, out serializationFormat, out valueExpression); + if (valueExpression == null) + { + break; + } } else { - inputParam = inputParamMap[paramName]; - if (inputParam is InputPathParameter || inputParam is InputEndpointParameter) - { - GetParamInfo(paramMap, operation, inputParam, out type, out serializationFormat, out valueExpression); - if (valueExpression == null) - { - break; - } - } - else - { - throw new InvalidOperationException($"The location of parameter {inputParam.Name} should be path or uri"); - } + throw new InvalidOperationException($"The location of parameter {inputParam.SerializedName} should be path or uri"); } } string? format = serializationFormat?.ToFormatSpecifier(); @@ -738,7 +731,7 @@ private static void GetParamInfo(Dictionary paramMap, } else { - if (paramMap.TryGetValue(inputParam.Name, out var paramProvider)) + if (paramMap.TryGetValue(inputParam.SerializedName, out var paramProvider)) { GetParamInfo(paramProvider, out type, out serializationFormat, out valueExpression); } From d9b1b6700379cc118ae71563b30dee3523c36fba Mon Sep 17 00:00:00 2001 From: Linh Phan Date: Mon, 2 Feb 2026 11:16:26 -0800 Subject: [PATCH 2/6] Fix paramName lookup --- .../src/Providers/RestClientProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs index cc937d529ae..76ac9dc7465 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs @@ -648,7 +648,7 @@ private void AddUriSegments( /* when the parameter is in operation.uri, it is client parameter * It is not operation parameter and not in inputParamHash list. */ - var clientParam = ClientProvider.ClientParameters.FirstOrDefault(p => p.WireInfo.SerializedName == paramName); + var clientParam = ClientProvider.ClientParameters.FirstOrDefault(p => p.WireInfo.SerializedName == paramName || p.Name == paramName); CSharpType? type; SerializationFormat? serializationFormat; ValueExpression? valueExpression; From 5e143eefb607f78172008086407943a688f2508d Mon Sep 17 00:00:00 2001 From: Linh Phan Date: Mon, 2 Feb 2026 12:46:51 -0800 Subject: [PATCH 3/6] fix paramMap reference --- .../src/Providers/RestClientProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs index 76ac9dc7465..3defac07ebd 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs @@ -731,7 +731,7 @@ private static void GetParamInfo(Dictionary paramMap, } else { - if (paramMap.TryGetValue(inputParam.SerializedName, out var paramProvider)) + if (paramMap.TryGetValue(inputParam.Name, out var paramProvider)) { GetParamInfo(paramProvider, out type, out serializationFormat, out valueExpression); } From 3514b834426ecec6618f1c6df587c452a6237020 Mon Sep 17 00:00:00 2001 From: Linh Phan Date: Tue, 3 Feb 2026 11:29:00 -0800 Subject: [PATCH 4/6] Make paramMap lookup case-insensitive instead --- .../src/Providers/RestClientProvider.cs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs index 3defac07ebd..fa817aadfa1 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs @@ -192,10 +192,10 @@ private MethodBodyStatements BuildMessage( var operation = serviceMethod.Operation; var classifier = GetClassifier(operation); - var paramMap = new Dictionary(signature.Parameters.ToDictionary(p => p.WireInfo.SerializedName)); + var paramMap = new Dictionary(signature.Parameters.ToDictionary(p => p.Name), StringComparer.OrdinalIgnoreCase); foreach (var param in ClientProvider.ClientParameters) { - paramMap[param.WireInfo.SerializedName] = param; + paramMap[param.Name] = param; } InputPagingServiceMethod? pagingServiceMethod = serviceMethod as InputPagingServiceMethod; @@ -282,9 +282,9 @@ private Dictionary GetReinjectedParametersMap( foreach (var param in nextLink.ReInjectedParameters) { var reinjectedParameter = ScmCodeModelGenerator.Instance.TypeFactory.CreateParameter(param); - if (reinjectedParameter != null && paramMap.TryGetValue(reinjectedParameter.WireInfo.SerializedName, out var paramInSignature)) + if (reinjectedParameter != null && paramMap.TryGetValue(reinjectedParameter.Name, out var paramInSignature)) { - reinjectedParamsMap[param.SerializedName] = paramInSignature; + reinjectedParamsMap[param.Name] = paramInSignature; } } } @@ -298,9 +298,9 @@ private Dictionary GetReinjectedParametersMap( if (pageSizeParameter != null) { var pageSizeParam = ScmCodeModelGenerator.Instance.TypeFactory.CreateParameter(pageSizeParameter); - if (pageSizeParam != null && paramMap.TryGetValue(pageSizeParam.WireInfo.SerializedName, out var paramInSignature)) + if (pageSizeParam != null && paramMap.TryGetValue(pageSizeParam.Name, out var paramInSignature)) { - reinjectedParamsMap[pageSizeParameter.SerializedName] = paramInSignature; + reinjectedParamsMap[pageSizeParameter.Name] = paramInSignature; } } } @@ -648,14 +648,14 @@ private void AddUriSegments( /* when the parameter is in operation.uri, it is client parameter * It is not operation parameter and not in inputParamHash list. */ - var clientParam = ClientProvider.ClientParameters.FirstOrDefault(p => p.WireInfo.SerializedName == paramName || p.Name == paramName); + var isClientParameter = ClientProvider.ClientParameters.Any(p => p.WireInfo.SerializedName == paramName || p.Name == paramName); CSharpType? type; SerializationFormat? serializationFormat; ValueExpression? valueExpression; InputParameter? inputParam = null; - if (clientParam != null) + if (isClientParameter) { - GetParamInfo(clientParam, out type, out serializationFormat, out valueExpression); + GetParamInfo(paramMap[paramName], out type, out serializationFormat, out valueExpression); } else { @@ -670,7 +670,7 @@ private void AddUriSegments( } else { - throw new InvalidOperationException($"The location of parameter {inputParam.SerializedName} should be path or uri"); + throw new InvalidOperationException($"The location of parameter {inputParam.Name} should be path or uri"); } } string? format = serializationFormat?.ToFormatSpecifier(); From cb74e47ef869d6bc008e43fc9fcf82a0f77a0c9d Mon Sep 17 00:00:00 2001 From: Linh Phan Date: Tue, 3 Feb 2026 11:35:13 -0800 Subject: [PATCH 5/6] Remove unneeded change --- .../src/Providers/RestClientProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs index fa817aadfa1..8674dec5fef 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs @@ -648,7 +648,7 @@ private void AddUriSegments( /* when the parameter is in operation.uri, it is client parameter * It is not operation parameter and not in inputParamHash list. */ - var isClientParameter = ClientProvider.ClientParameters.Any(p => p.WireInfo.SerializedName == paramName || p.Name == paramName); + var isClientParameter = ClientProvider.ClientParameters.Any(p => p.WireInfo.SerializedName == paramName); CSharpType? type; SerializationFormat? serializationFormat; ValueExpression? valueExpression; From 01cb4d218b31e448e0dbdb4cb267f76e99500f7e Mon Sep 17 00:00:00 2001 From: Linh Phan Date: Wed, 4 Feb 2026 08:17:58 -0800 Subject: [PATCH 6/6] added test cases --- .../src/Providers/RestClientProvider.cs | 2 +- .../ClientProviders/ClientProviderTests.cs | 103 ++++++++++++++++++ .../RestClientProviderTests.cs | 49 ++++++++- 3 files changed, 152 insertions(+), 2 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs index 8674dec5fef..88f2ecc939d 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs @@ -648,7 +648,7 @@ private void AddUriSegments( /* when the parameter is in operation.uri, it is client parameter * It is not operation parameter and not in inputParamHash list. */ - var isClientParameter = ClientProvider.ClientParameters.Any(p => p.WireInfo.SerializedName == paramName); + var isClientParameter = ClientProvider.ClientParameters.Any(p => string.Equals(p.Name, paramName, StringComparison.OrdinalIgnoreCase)); CSharpType? type; SerializationFormat? serializationFormat; ValueExpression? valueExpression; diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs index a2b1caf8ed1..615aec0e5a6 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs @@ -2916,5 +2916,108 @@ public void ServerTemplateEqualsEndpoint_OnlyAppendsOperationPath() Assert.IsTrue(fullText.Contains("/items"), "Should append the operation path /items"); } + + [TestCase("{endpoint}")] + [TestCase("{Endpoint}")] + [TestCase("{ENDPOINT}")] + public void ConvertUriTemplate_CaseInsensitiveEndpointLookup(string serverTemplate) + { + // Tests that the parameter lookup in ConvertUriTemplateToFormattableString is case-insensitive + MockHelpers.LoadMockGenerator(); + var client = InputFactory.Client( + TestClientName, + parameters: [InputFactory.EndpointParameter( + "endpoint", + InputPrimitiveType.String, + isRequired: true, + scope: InputParameterScope.Client, + serverUrlTemplate: serverTemplate, + isEndpoint: true)]); + var clientProvider = new ClientProvider(client); + var constructor = clientProvider.Constructors.FirstOrDefault( + c => c.Signature.Initializer == null && c.Signature?.Modifiers == MethodSignatureModifiers.Public); + + Assert.IsNotNull(constructor); + // Should not throw and should contain the Uri assignment + var bodyText = constructor!.BodyStatements!.ToDisplayString(); + Assert.IsTrue(bodyText.Contains("_endpoint = new global::System.Uri($\"")); + } + + [Test] + public void ConvertUriTemplate_CaseInsensitivePathParameterLookup() + { + // Tests template with mixed case placeholders like "{Endpoint}/services/{ApiVersion}" + MockHelpers.LoadMockGenerator(); + + var serverTemplate = "{Endpoint}/{ApiVersion}"; + var client = InputFactory.Client( + TestClientName, + methods: [InputFactory.BasicServiceMethod("Test", InputFactory.Operation("test", uri: serverTemplate))], + parameters: [ + InputFactory.EndpointParameter( + "endpoint", // lowercase parameter name + InputPrimitiveType.String, + isRequired: true, + scope: InputParameterScope.Client, + serverUrlTemplate: serverTemplate, + isEndpoint: true), + InputFactory.PathParameter( + "apiVersion", // lowercase parameter name + InputPrimitiveType.String, + isRequired: true, + scope: InputParameterScope.Client) + ]); + var clientProvider = new ClientProvider(client); + var constructor = clientProvider.Constructors.FirstOrDefault( + c => c.Signature.Initializer == null && c.Signature?.Modifiers == MethodSignatureModifiers.Public); + + Assert.IsNotNull(constructor); + // Should not throw - case-insensitive lookup should find parameters + var bodyText = constructor!.BodyStatements!.ToDisplayString(); + Assert.IsNotNull(bodyText); + // Verify that the Uri is built according to the server template with case-insensitive parameter matching + Assert.IsTrue(bodyText.Contains("$\"{endpoint}/{_apiVersion}\"")); + } + + [Test] + public void ConvertUriTemplate_WithMultiplePlaceholders() + { + // Tests template with multiple placeholders: "{endpoint}/{apiVersion}/services/{subscriptionId}" + MockHelpers.LoadMockGenerator(); + + var serverTemplate = "{endpoint}/{apiVersion}/services/{subscriptionId}"; + var client = InputFactory.Client( + TestClientName, + methods: [InputFactory.BasicServiceMethod("Test", InputFactory.Operation("test", uri: serverTemplate))], + parameters: [ + InputFactory.EndpointParameter( + "endpoint", + InputPrimitiveType.String, + isRequired: true, + scope: InputParameterScope.Client, + serverUrlTemplate: serverTemplate, + isEndpoint: true), + InputFactory.PathParameter( + "apiVersion", + InputPrimitiveType.String, + isRequired: true, + scope: InputParameterScope.Client), + InputFactory.PathParameter( + "subscriptionId", + InputPrimitiveType.String, + isRequired: true, + scope: InputParameterScope.Client) + ]); + var clientProvider = new ClientProvider(client); + var constructor = clientProvider.Constructors.FirstOrDefault( + c => c.Signature.Initializer == null && c.Signature?.Modifiers == MethodSignatureModifiers.Public); + + Assert.IsNotNull(constructor); + var bodyText = constructor!.BodyStatements!.ToDisplayString(); + Assert.IsNotNull(bodyText); + // Verify that the Uri is built according to the server template + Assert.IsTrue(bodyText.Contains("$\"{endpoint}/{_apiVersion}/services/{_subscriptionId}\"")); + } } } + diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/RestClientProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/RestClientProviderTests.cs index a3d2bf26fee..55cdd8a58c9 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/RestClientProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/RestClientProviderTests.cs @@ -1164,6 +1164,14 @@ private static IEnumerable ValidateApiVersionPathParameterTestCase scope: InputParameterScope.Client, isApiVersion: true); + InputMethodParameter pascalCaseApiVersionParameter = InputFactory.MethodParameter( + "ApiVersion", + InputPrimitiveType.String, + location: InputRequestLocation.Uri, + isRequired: true, + scope: InputParameterScope.Client, + isApiVersion: true); + InputMethodParameter enumApiVersionParameter = InputFactory.MethodParameter( "apiVersion", InputFactory.StringEnum( @@ -1191,7 +1199,7 @@ private static IEnumerable ValidateApiVersionPathParameterTestCase uri: "{endpoint}/{apiVersion}")) ], parameters: [endpointParameter, stringApiVersionParameter])); - + yield return new TestCaseData( InputFactory.Client( "TestClient", @@ -1204,6 +1212,45 @@ private static IEnumerable ValidateApiVersionPathParameterTestCase uri: "{endpoint}/{apiVersion}")) ], parameters: [endpointParameter, enumApiVersionParameter])); + + yield return new TestCaseData( + InputFactory.Client( + "TestClient", + methods: + [ + InputFactory.BasicServiceMethod( + "TestServiceMethod", + InputFactory.Operation( + "TestOperation", + uri: "{endpoint}/{ApiVersion}")) + ], + parameters: [endpointParameter, stringApiVersionParameter])); + + yield return new TestCaseData( + InputFactory.Client( + "TestClient", + methods: + [ + InputFactory.BasicServiceMethod( + "TestServiceMethod", + InputFactory.Operation( + "TestOperation", + uri: "{endpoint}/{apiVersion}")) + ], + parameters: [endpointParameter, pascalCaseApiVersionParameter])); + + yield return new TestCaseData( + InputFactory.Client( + "TestClient", + methods: + [ + InputFactory.BasicServiceMethod( + "TestServiceMethod", + InputFactory.Operation( + "TestOperation", + uri: "{endpoint}/{ApiVersion}")) + ], + parameters: [endpointParameter, pascalCaseApiVersionParameter])); } } }