diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientOptionsProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientOptionsProvider.cs index 3f2a1aed342..975c2492146 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientOptionsProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientOptionsProvider.cs @@ -10,7 +10,6 @@ using Microsoft.TypeSpec.Generator.Input.Extensions; using Microsoft.TypeSpec.Generator.Primitives; using Microsoft.TypeSpec.Generator.Providers; -using Microsoft.TypeSpec.Generator.Shared; using Microsoft.TypeSpec.Generator.Snippets; using Microsoft.TypeSpec.Generator.Statements; using Microsoft.TypeSpec.Generator.Utilities; @@ -134,8 +133,10 @@ private static bool UseSingletonInstance(InputClient inputClient) var properties = new Dictionary(_serviceVersionsEnums.Count); foreach (var (inputEnum, enumProvider) in _serviceVersionsEnums) { + // For multi-service clients, use the full namespace to guarantee uniqueness + // (the last segment alone can collide when services share a namespace). var versionPropertyName = _inputClient.IsMultiServiceClient - ? ClientHelper.BuildNameForService(inputEnum.Namespace, ServicePrefix, ApiVersionSuffix) + ? $"{inputEnum.Namespace.ToIdentifierName()}{ApiVersionSuffix}" : VersionSuffix; var versionProperty = new PropertyProvider( @@ -256,10 +257,7 @@ protected override ConstructorProvider[] BuildConstructors() FormattableString versionParamDescription = $"The service version"; if (_inputClient.IsMultiServiceClient) { - versionParameterName = ClientHelper.BuildNameForService( - serviceVersionEnum.Name, - ServicePrefix, - VersionSuffix).ToVariableName(); + versionParameterName = serviceVersionEnum.Name.ToVariableName(); versionParamDescription = $"The {serviceVersionEnum.Name} service version"; } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientOptionsProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientOptionsProviderTests.cs index 2fe18535d4e..f65378c270f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientOptionsProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientOptionsProviderTests.cs @@ -713,6 +713,47 @@ public void MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedClient Assert.AreEqual(Helpers.GetExpectedFromFile(), file.Content); } + [Test] + public void MultiServiceClient_SameLastSegment_ProducesUniqueVersionEnums() + { + // Regression test: when two services have different full namespaces but the same last + // segment, the generated service version enums should still have distinct names. + List serviceOneVersions = ["1.0", "2.0"]; + List serviceTwoVersions = ["3.0", "4.0"]; + + var serviceOneEnumValues = serviceOneVersions.Select(a => (a, a)); + var serviceTwoEnumValues = serviceTwoVersions.Select(a => (a, a)); + + // Different full namespaces, same last segment ("Tests") + var serviceOneEnum = InputFactory.StringEnum( + "ServiceOneVersions", + serviceOneEnumValues, + usage: InputModelTypeUsage.ApiVersionEnum, + clientNamespace: "Azure.ServiceOne.Tests"); + var serviceTwoEnum = InputFactory.StringEnum( + "ServiceTwoVersions", + serviceTwoEnumValues, + usage: InputModelTypeUsage.ApiVersionEnum, + clientNamespace: "Azure.ServiceTwo.Tests"); + + var client = InputFactory.Client("TestClient", isMultiServiceClient: true); + + MockHelpers.LoadMockGenerator( + apiVersions: () => [.. serviceOneVersions, .. serviceTwoVersions], + clients: () => [client], + inputEnums: () => [serviceOneEnum, serviceTwoEnum]); + + var clientProvider = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(client); + var clientOptionsProvider = clientProvider?.ClientOptions; + + Assert.IsNotNull(clientOptionsProvider); + + // Validate nested service version enums have unique names + var nestedTypes = clientOptionsProvider!.NestedTypes; + Assert.AreEqual(2, nestedTypes.Count); + CollectionAssert.AllItemsAreUnique(nestedTypes.Select(t => t.Name).ToList()); + } + [Test] public void TestConfigurationSectionConstructorBody_WithBoolProperty() { 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 566fbb0fb65..aad50052792 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 @@ -3678,12 +3678,12 @@ public void GetApiVersionFieldForService_MultiService_ReturnsMatchingField() // Should return the matching field for ServiceA var fieldA = clientProvider!.GetApiVersionFieldForService("Sample.ServiceA"); Assert.IsNotNull(fieldA); - Assert.AreEqual("_serviceAApiVersion", fieldA!.Name); + Assert.AreEqual("_sampleServiceAApiVersion", fieldA!.Name); // Should return the matching field for ServiceB var fieldB = clientProvider.GetApiVersionFieldForService("Sample.ServiceB"); Assert.IsNotNull(fieldB); - Assert.AreEqual("_serviceBApiVersion", fieldB!.Name); + Assert.AreEqual("_sampleServiceBApiVersion", fieldB!.Name); } [Test] @@ -3814,11 +3814,86 @@ public void GetApiVersionFieldForService_MultiService_CaseInsensitiveMatch() // Should match case-insensitively var fieldLowerCase = clientProvider!.GetApiVersionFieldForService("sample.serviceA"); Assert.IsNotNull(fieldLowerCase); - Assert.AreEqual("_serviceAApiVersion", fieldLowerCase!.Name); + Assert.AreEqual("_sampleServiceAApiVersion", fieldLowerCase!.Name); var fieldUpperCase = clientProvider.GetApiVersionFieldForService("SAMPLE.SERVICEa"); Assert.IsNotNull(fieldUpperCase); - Assert.AreEqual("_serviceAApiVersion", fieldUpperCase!.Name); + Assert.AreEqual("_sampleServiceAApiVersion", fieldUpperCase!.Name); + } + + [Test] + public void GetApiVersionFieldForService_MultiService_SameLastSegment_ProducesUniqueFields() + { + // Regression test: when two services have different full namespaces but the same last + // segment, using only the last segment would produce duplicate field names. The fix + // uses the full namespace to guarantee uniqueness. + List serviceOneVersions = ["1.0", "2.0"]; + List serviceTwoVersions = ["3.0", "4.0"]; + + var serviceOneEnumValues = serviceOneVersions.Select(a => (a, a)); + var serviceTwoEnumValues = serviceTwoVersions.Select(a => (a, a)); + + // Different full namespaces, same last segment ("Tests") — would collide with last-segment-only naming + var serviceOneEnum = InputFactory.StringEnum( + "ServiceOneVersions", + serviceOneEnumValues, + usage: InputModelTypeUsage.ApiVersionEnum, + clientNamespace: "Azure.ServiceOne.Tests"); + var serviceTwoEnum = InputFactory.StringEnum( + "ServiceTwoVersions", + serviceTwoEnumValues, + usage: InputModelTypeUsage.ApiVersionEnum, + clientNamespace: "Azure.ServiceTwo.Tests"); + + InputParameter apiVersionParameter = InputFactory.QueryParameter( + "apiVersion", + InputPrimitiveType.String, + isRequired: true, + scope: InputParameterScope.Client, + isApiVersion: true); + + var serviceOneOperation = InputFactory.Operation( + "ServiceOneOperation", + parameters: [apiVersionParameter], + ns: "Azure.ServiceOne.Tests"); + + var serviceTwoOperation = InputFactory.Operation( + "ServiceTwoOperation", + parameters: [apiVersionParameter], + ns: "Azure.ServiceTwo.Tests"); + + var client = InputFactory.Client( + TestClientName, + methods: + [ + InputFactory.BasicServiceMethod("ServiceOneMethod", serviceOneOperation), + InputFactory.BasicServiceMethod("ServiceTwoMethod", serviceTwoOperation) + ], + parameters: [apiVersionParameter], + isMultiServiceClient: true); + + MockHelpers.LoadMockGenerator( + apiVersions: () => [.. serviceOneVersions, .. serviceTwoVersions], + clients: () => [client], + inputEnums: () => [serviceOneEnum, serviceTwoEnum]); + + var clientProvider = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(client); + Assert.IsNotNull(clientProvider); + + // This should not crash — previously it threw due to duplicate field names + Assert.DoesNotThrow(() => _ = clientProvider!.Fields); + + // Verify we have two distinct api version fields using the full namespace + var apiVersionFields = clientProvider!.Fields + .Where(f => f.Name.Contains("ApiVersion", StringComparison.OrdinalIgnoreCase)) + .OrderBy(f => f.Name) + .ToList(); + Assert.AreEqual(2, apiVersionFields.Count); + Assert.AreNotEqual(apiVersionFields[0].Name, apiVersionFields[1].Name); + + // Full namespace produces unique names: "Azure.ServiceOne.Tests" → "AzureServiceOneTests" + Assert.AreEqual("_azureServiceOneTestsApiVersion", apiVersionFields[0].Name); + Assert.AreEqual("_azureServiceTwoTestsApiVersion", apiVersionFields[1].Name); } [TestCase("{endpoint}")] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceClient_GeneratesExpectedClient.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceClient_GeneratesExpectedClient.cs index 7aa404c1406..1c2e1a29911 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceClient_GeneratesExpectedClient.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceClient_GeneratesExpectedClient.cs @@ -14,8 +14,8 @@ public partial class TestClient { private readonly global::System.Uri _endpoint; private readonly string _subscriptionId; - private readonly string _serviceAApiVersion; - private readonly string _serviceBApiVersion; + private readonly string _sampleServiceAApiVersion; + private readonly string _sampleServiceBApiVersion; private global::Sample.ServiceA.ServiceA _cachedServiceA; private global::Sample.ServiceB.ServiceB _cachedServiceB; @@ -44,8 +44,8 @@ internal TestClient(global::System.ClientModel.Primitives.AuthenticationPolicy a { Pipeline = global::System.ClientModel.Primitives.ClientPipeline.Create(options, Array.Empty(), new global::System.ClientModel.Primitives.PipelinePolicy[] { new global::System.ClientModel.Primitives.UserAgentPolicy(typeof(global::Sample.TestClient).Assembly) }, Array.Empty()); } - _serviceAApiVersion = options.ServiceAApiVersion; - _serviceBApiVersion = options.ServiceBApiVersion; + _sampleServiceAApiVersion = options.SampleServiceAApiVersion; + _sampleServiceBApiVersion = options.SampleServiceBApiVersion; } public TestClient(global::System.Uri endpoint, string subscriptionId, global::Sample.TestClientOptions options) : this(null, endpoint, subscriptionId, options) @@ -56,12 +56,12 @@ public TestClient(global::System.Uri endpoint, string subscriptionId, global::Sa public virtual global::Sample.ServiceA.ServiceA GetServiceAClient() { - return (global::System.Threading.Volatile.Read(ref _cachedServiceA) ?? (global::System.Threading.Interlocked.CompareExchange(ref _cachedServiceA, new global::Sample.ServiceA.ServiceA(Pipeline, _endpoint, _serviceAApiVersion, _subscriptionId), null) ?? _cachedServiceA)); + return (global::System.Threading.Volatile.Read(ref _cachedServiceA) ?? (global::System.Threading.Interlocked.CompareExchange(ref _cachedServiceA, new global::Sample.ServiceA.ServiceA(Pipeline, _endpoint, _sampleServiceAApiVersion, _subscriptionId), null) ?? _cachedServiceA)); } public virtual global::Sample.ServiceB.ServiceB GetServiceBClient() { - return (global::System.Threading.Volatile.Read(ref _cachedServiceB) ?? (global::System.Threading.Interlocked.CompareExchange(ref _cachedServiceB, new global::Sample.ServiceB.ServiceB(Pipeline, _endpoint, _serviceBApiVersion, _subscriptionId), null) ?? _cachedServiceB)); + return (global::System.Threading.Volatile.Read(ref _cachedServiceB) ?? (global::System.Threading.Interlocked.CompareExchange(ref _cachedServiceB, new global::Sample.ServiceB.ServiceB(Pipeline, _endpoint, _sampleServiceBApiVersion, _subscriptionId), null) ?? _cachedServiceB)); } } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceClient_WithThreeServices_GeneratesExpectedClient.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceClient_WithThreeServices_GeneratesExpectedClient.cs index def2e6d7a73..bc0774b1cce 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceClient_WithThreeServices_GeneratesExpectedClient.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceClient_WithThreeServices_GeneratesExpectedClient.cs @@ -15,9 +15,9 @@ public partial class TestClient { private readonly global::System.Uri _endpoint; private readonly string _subscriptionId; - private readonly string _serviceComputeApiVersion; - private readonly string _serviceKeyVaultApiVersion; - private readonly string _serviceStorageApiVersion; + private readonly string _sampleComputeApiVersion; + private readonly string _sampleKeyVaultApiVersion; + private readonly string _sampleStorageApiVersion; private global::Sample.KeyVault.KeyVault _cachedKeyVault; private global::Sample.Storage.Storage _cachedStorage; private global::Sample.Compute.Compute _cachedCompute; @@ -47,9 +47,9 @@ internal TestClient(global::System.ClientModel.Primitives.AuthenticationPolicy a { Pipeline = global::System.ClientModel.Primitives.ClientPipeline.Create(options, Array.Empty(), new global::System.ClientModel.Primitives.PipelinePolicy[] { new global::System.ClientModel.Primitives.UserAgentPolicy(typeof(global::Sample.TestClient).Assembly) }, Array.Empty()); } - _serviceComputeApiVersion = options.ServiceComputeApiVersion; - _serviceKeyVaultApiVersion = options.ServiceKeyVaultApiVersion; - _serviceStorageApiVersion = options.ServiceStorageApiVersion; + _sampleComputeApiVersion = options.SampleComputeApiVersion; + _sampleKeyVaultApiVersion = options.SampleKeyVaultApiVersion; + _sampleStorageApiVersion = options.SampleStorageApiVersion; } public TestClient(global::System.Uri endpoint, string subscriptionId, global::Sample.TestClientOptions options) : this(null, endpoint, subscriptionId, options) @@ -60,17 +60,17 @@ public TestClient(global::System.Uri endpoint, string subscriptionId, global::Sa public virtual global::Sample.KeyVault.KeyVault GetKeyVaultClient() { - return (global::System.Threading.Volatile.Read(ref _cachedKeyVault) ?? (global::System.Threading.Interlocked.CompareExchange(ref _cachedKeyVault, new global::Sample.KeyVault.KeyVault(Pipeline, _endpoint, _serviceKeyVaultApiVersion, _subscriptionId), null) ?? _cachedKeyVault)); + return (global::System.Threading.Volatile.Read(ref _cachedKeyVault) ?? (global::System.Threading.Interlocked.CompareExchange(ref _cachedKeyVault, new global::Sample.KeyVault.KeyVault(Pipeline, _endpoint, _sampleKeyVaultApiVersion, _subscriptionId), null) ?? _cachedKeyVault)); } public virtual global::Sample.Storage.Storage GetStorageClient() { - return (global::System.Threading.Volatile.Read(ref _cachedStorage) ?? (global::System.Threading.Interlocked.CompareExchange(ref _cachedStorage, new global::Sample.Storage.Storage(Pipeline, _endpoint, _serviceStorageApiVersion, _subscriptionId), null) ?? _cachedStorage)); + return (global::System.Threading.Volatile.Read(ref _cachedStorage) ?? (global::System.Threading.Interlocked.CompareExchange(ref _cachedStorage, new global::Sample.Storage.Storage(Pipeline, _endpoint, _sampleStorageApiVersion, _subscriptionId), null) ?? _cachedStorage)); } public virtual global::Sample.Compute.Compute GetComputeClient() { - return (global::System.Threading.Volatile.Read(ref _cachedCompute) ?? (global::System.Threading.Interlocked.CompareExchange(ref _cachedCompute, new global::Sample.Compute.Compute(Pipeline, _endpoint, _serviceComputeApiVersion, _subscriptionId), null) ?? _cachedCompute)); + return (global::System.Threading.Volatile.Read(ref _cachedCompute) ?? (global::System.Threading.Interlocked.CompareExchange(ref _cachedCompute, new global::Sample.Compute.Compute(Pipeline, _endpoint, _sampleComputeApiVersion, _subscriptionId), null) ?? _cachedCompute)); } } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceCombinedClient_GeneratesExpectedClient.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceCombinedClient_GeneratesExpectedClient.cs index 56c1c6cf460..cd29a07eb89 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceCombinedClient_GeneratesExpectedClient.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceCombinedClient_GeneratesExpectedClient.cs @@ -13,8 +13,8 @@ namespace Sample public partial class TestClient { private readonly global::System.Uri _endpoint; - private readonly string _serviceAApiVersion; - private readonly string _serviceBApiVersion; + private readonly string _sampleServiceAApiVersion; + private readonly string _sampleServiceBApiVersion; protected TestClient() { @@ -39,8 +39,8 @@ internal TestClient(global::System.ClientModel.Primitives.AuthenticationPolicy a { Pipeline = global::System.ClientModel.Primitives.ClientPipeline.Create(options, Array.Empty(), new global::System.ClientModel.Primitives.PipelinePolicy[] { new global::System.ClientModel.Primitives.UserAgentPolicy(typeof(global::Sample.TestClient).Assembly) }, Array.Empty()); } - _serviceAApiVersion = options.ServiceAApiVersion; - _serviceBApiVersion = options.ServiceBApiVersion; + _sampleServiceAApiVersion = options.SampleServiceAApiVersion; + _sampleServiceBApiVersion = options.SampleServiceBApiVersion; } public TestClient(global::System.Uri endpoint, global::Sample.TestClientOptions options) : this(null, endpoint, options) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedClient.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedClient.cs index 4096b627bc1..f9684cf2336 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedClient.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedClient.cs @@ -13,9 +13,9 @@ namespace Sample public partial class TestClient { private readonly global::System.Uri _endpoint; - private readonly string _serviceComputeApiVersion; - private readonly string _serviceKeyVaultApiVersion; - private readonly string _serviceStorageApiVersion; + private readonly string _sampleComputeApiVersion; + private readonly string _sampleKeyVaultApiVersion; + private readonly string _sampleStorageApiVersion; protected TestClient() { @@ -40,9 +40,9 @@ internal TestClient(global::System.ClientModel.Primitives.AuthenticationPolicy a { Pipeline = global::System.ClientModel.Primitives.ClientPipeline.Create(options, Array.Empty(), new global::System.ClientModel.Primitives.PipelinePolicy[] { new global::System.ClientModel.Primitives.UserAgentPolicy(typeof(global::Sample.TestClient).Assembly) }, Array.Empty()); } - _serviceComputeApiVersion = options.ServiceComputeApiVersion; - _serviceKeyVaultApiVersion = options.ServiceKeyVaultApiVersion; - _serviceStorageApiVersion = options.ServiceStorageApiVersion; + _sampleComputeApiVersion = options.SampleComputeApiVersion; + _sampleKeyVaultApiVersion = options.SampleKeyVaultApiVersion; + _sampleStorageApiVersion = options.SampleStorageApiVersion; } public TestClient(global::System.Uri endpoint, global::Sample.TestClientOptions options) : this(null, endpoint, options) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/TestData/RestClientProviderTests/MultiServiceCombinedClient_GeneratesExpectedRestClient.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/TestData/RestClientProviderTests/MultiServiceCombinedClient_GeneratesExpectedRestClient.cs index c083bf8f50e..a0a9bd218e1 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/TestData/RestClientProviderTests/MultiServiceCombinedClient_GeneratesExpectedRestClient.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/TestData/RestClientProviderTests/MultiServiceCombinedClient_GeneratesExpectedRestClient.cs @@ -16,7 +16,7 @@ public partial class TestClient { global::Sample.ClientUriBuilder uri = new global::Sample.ClientUriBuilder(); uri.Reset(_endpoint); - uri.AppendQuery("apiVersion", _serviceAApiVersion, true); + uri.AppendQuery("apiVersion", _sampleServiceAApiVersion, true); global::System.ClientModel.Primitives.PipelineMessage message = Pipeline.CreateMessage(uri.ToUri(), "GET", PipelineMessageClassifier200); global::System.ClientModel.Primitives.PipelineRequest request = message.Request; message.Apply(options); @@ -27,7 +27,7 @@ public partial class TestClient { global::Sample.ClientUriBuilder uri = new global::Sample.ClientUriBuilder(); uri.Reset(_endpoint); - uri.AppendQuery("apiVersion", _serviceBApiVersion, true); + uri.AppendQuery("apiVersion", _sampleServiceBApiVersion, true); global::System.ClientModel.Primitives.PipelineMessage message = Pipeline.CreateMessage(uri.ToUri(), "GET", PipelineMessageClassifier200); global::System.ClientModel.Primitives.PipelineRequest request = message.Request; message.Apply(options); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/TestData/RestClientProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedRestClient.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/TestData/RestClientProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedRestClient.cs index d16e8ddea92..b11b9e12462 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/TestData/RestClientProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedRestClient.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/RestClientProviders/TestData/RestClientProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedRestClient.cs @@ -16,7 +16,7 @@ public partial class TestClient { global::Sample.ClientUriBuilder uri = new global::Sample.ClientUriBuilder(); uri.Reset(_endpoint); - uri.AppendQuery("apiVersion", _serviceKeyVaultApiVersion, true); + uri.AppendQuery("apiVersion", _sampleKeyVaultApiVersion, true); global::System.ClientModel.Primitives.PipelineMessage message = Pipeline.CreateMessage(uri.ToUri(), "GET", PipelineMessageClassifier200); global::System.ClientModel.Primitives.PipelineRequest request = message.Request; message.Apply(options); @@ -27,7 +27,7 @@ public partial class TestClient { global::Sample.ClientUriBuilder uri = new global::Sample.ClientUriBuilder(); uri.Reset(_endpoint); - uri.AppendQuery("apiVersion", _serviceStorageApiVersion, true); + uri.AppendQuery("apiVersion", _sampleStorageApiVersion, true); global::System.ClientModel.Primitives.PipelineMessage message = Pipeline.CreateMessage(uri.ToUri(), "GET", PipelineMessageClassifier200); global::System.ClientModel.Primitives.PipelineRequest request = message.Request; message.Apply(options); @@ -38,7 +38,7 @@ public partial class TestClient { global::Sample.ClientUriBuilder uri = new global::Sample.ClientUriBuilder(); uri.Reset(_endpoint); - uri.AppendQuery("apiVersion", _serviceComputeApiVersion, true); + uri.AppendQuery("apiVersion", _sampleComputeApiVersion, true); global::System.ClientModel.Primitives.PipelineMessage message = Pipeline.CreateMessage(uri.ToUri(), "GET", PipelineMessageClassifier200); global::System.ClientModel.Primitives.PipelineRequest request = message.Request; message.Apply(options); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceClient_GeneratesExpectedClientOptions.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceClient_GeneratesExpectedClientOptions.cs index 1eb960fa71f..30c5361bdaf 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceClient_GeneratesExpectedClientOptions.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceClient_GeneratesExpectedClientOptions.cs @@ -11,21 +11,21 @@ namespace Sample { public partial class TestClientOptions : global::System.ClientModel.Primitives.ClientPipelineOptions { - private const global::Sample.TestClientOptions.ServiceAVersion LatestServiceAVersion = global::Sample.TestClientOptions.ServiceAVersion.V2_0; - private const global::Sample.TestClientOptions.ServiceBVersion LatestServiceBVersion = global::Sample.TestClientOptions.ServiceBVersion.V4_0; + private const global::Sample.TestClientOptions.SampleServiceAVersion LatestSampleServiceAVersion = global::Sample.TestClientOptions.SampleServiceAVersion.V2_0; + private const global::Sample.TestClientOptions.SampleServiceBVersion LatestSampleServiceBVersion = global::Sample.TestClientOptions.SampleServiceBVersion.V4_0; - public TestClientOptions(global::Sample.TestClientOptions.ServiceAVersion serviceAVersion = LatestServiceAVersion, global::Sample.TestClientOptions.ServiceBVersion serviceBVersion = LatestServiceBVersion) + public TestClientOptions(global::Sample.TestClientOptions.SampleServiceAVersion sampleServiceAVersion = LatestSampleServiceAVersion, global::Sample.TestClientOptions.SampleServiceBVersion sampleServiceBVersion = LatestSampleServiceBVersion) { - ServiceAApiVersion = serviceAVersion switch + SampleServiceAApiVersion = sampleServiceAVersion switch { - global::Sample.TestClientOptions.ServiceAVersion.V1_0 => "1.0", - global::Sample.TestClientOptions.ServiceAVersion.V2_0 => "2.0", + global::Sample.TestClientOptions.SampleServiceAVersion.V1_0 => "1.0", + global::Sample.TestClientOptions.SampleServiceAVersion.V2_0 => "2.0", _ => throw new global::System.NotSupportedException() }; - ServiceBApiVersion = serviceBVersion switch + SampleServiceBApiVersion = sampleServiceBVersion switch { - global::Sample.TestClientOptions.ServiceBVersion.V3_0 => "3.0", - global::Sample.TestClientOptions.ServiceBVersion.V4_0 => "4.0", + global::Sample.TestClientOptions.SampleServiceBVersion.V3_0 => "3.0", + global::Sample.TestClientOptions.SampleServiceBVersion.V4_0 => "4.0", _ => throw new global::System.NotSupportedException() }; } @@ -33,33 +33,33 @@ public TestClientOptions(global::Sample.TestClientOptions.ServiceAVersion servic [global::System.Diagnostics.CodeAnalysis.ExperimentalAttribute("SCME0002")] internal TestClientOptions(global::Microsoft.Extensions.Configuration.IConfigurationSection section) : base(section) { - ServiceAApiVersion = "2.0"; - ServiceBApiVersion = "4.0"; + SampleServiceAApiVersion = "2.0"; + SampleServiceBApiVersion = "4.0"; if (((section is null) || !section.Exists())) { return; } - if ((section["ServiceAApiVersion"] is string serviceAApiVersion)) + if ((section["SampleServiceAApiVersion"] is string sampleServiceAApiVersion)) { - this.ServiceAApiVersion = serviceAApiVersion; + this.SampleServiceAApiVersion = sampleServiceAApiVersion; } - if ((section["ServiceBApiVersion"] is string serviceBApiVersion)) + if ((section["SampleServiceBApiVersion"] is string sampleServiceBApiVersion)) { - this.ServiceBApiVersion = serviceBApiVersion; + this.SampleServiceBApiVersion = sampleServiceBApiVersion; } } - internal string ServiceAApiVersion { get; } + internal string SampleServiceAApiVersion { get; } - internal string ServiceBApiVersion { get; } + internal string SampleServiceBApiVersion { get; } - public enum ServiceAVersion + public enum SampleServiceAVersion { V1_0 = 1, V2_0 = 2 } - public enum ServiceBVersion + public enum SampleServiceBVersion { V3_0 = 1, V4_0 = 2 diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceClient_WithThreeServices_GeneratesExpectedClientOptions.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceClient_WithThreeServices_GeneratesExpectedClientOptions.cs index 1dffdca1dbb..740d3a43b3a 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceClient_WithThreeServices_GeneratesExpectedClientOptions.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceClient_WithThreeServices_GeneratesExpectedClientOptions.cs @@ -11,29 +11,29 @@ namespace Sample { public partial class TestClientOptions : global::System.ClientModel.Primitives.ClientPipelineOptions { - private const global::Sample.TestClientOptions.ServiceComputeVersion LatestServiceComputeVersion = global::Sample.TestClientOptions.ServiceComputeVersion.V2024_07_01; - private const global::Sample.TestClientOptions.ServiceKeyVaultVersion LatestServiceKeyVaultVersion = global::Sample.TestClientOptions.ServiceKeyVaultVersion.V7_5; - private const global::Sample.TestClientOptions.ServiceStorageVersion LatestServiceStorageVersion = global::Sample.TestClientOptions.ServiceStorageVersion.V2024_01_01; + private const global::Sample.TestClientOptions.SampleComputeVersion LatestSampleComputeVersion = global::Sample.TestClientOptions.SampleComputeVersion.V2024_07_01; + private const global::Sample.TestClientOptions.SampleKeyVaultVersion LatestSampleKeyVaultVersion = global::Sample.TestClientOptions.SampleKeyVaultVersion.V7_5; + private const global::Sample.TestClientOptions.SampleStorageVersion LatestSampleStorageVersion = global::Sample.TestClientOptions.SampleStorageVersion.V2024_01_01; - public TestClientOptions(global::Sample.TestClientOptions.ServiceKeyVaultVersion serviceKeyVaultVersion = LatestServiceKeyVaultVersion, global::Sample.TestClientOptions.ServiceStorageVersion serviceStorageVersion = LatestServiceStorageVersion, global::Sample.TestClientOptions.ServiceComputeVersion serviceComputeVersion = LatestServiceComputeVersion) + public TestClientOptions(global::Sample.TestClientOptions.SampleKeyVaultVersion sampleKeyVaultVersion = LatestSampleKeyVaultVersion, global::Sample.TestClientOptions.SampleStorageVersion sampleStorageVersion = LatestSampleStorageVersion, global::Sample.TestClientOptions.SampleComputeVersion sampleComputeVersion = LatestSampleComputeVersion) { - ServiceKeyVaultApiVersion = serviceKeyVaultVersion switch + SampleKeyVaultApiVersion = sampleKeyVaultVersion switch { - global::Sample.TestClientOptions.ServiceKeyVaultVersion.V7_4 => "7.4", - global::Sample.TestClientOptions.ServiceKeyVaultVersion.V7_5 => "7.5", + global::Sample.TestClientOptions.SampleKeyVaultVersion.V7_4 => "7.4", + global::Sample.TestClientOptions.SampleKeyVaultVersion.V7_5 => "7.5", _ => throw new global::System.NotSupportedException() }; - ServiceStorageApiVersion = serviceStorageVersion switch + SampleStorageApiVersion = sampleStorageVersion switch { - global::Sample.TestClientOptions.ServiceStorageVersion.V2023_01_01 => "2023-01-01", - global::Sample.TestClientOptions.ServiceStorageVersion.V2024_01_01 => "2024-01-01", + global::Sample.TestClientOptions.SampleStorageVersion.V2023_01_01 => "2023-01-01", + global::Sample.TestClientOptions.SampleStorageVersion.V2024_01_01 => "2024-01-01", _ => throw new global::System.NotSupportedException() }; - ServiceComputeApiVersion = serviceComputeVersion switch + SampleComputeApiVersion = sampleComputeVersion switch { - global::Sample.TestClientOptions.ServiceComputeVersion.V2023_07_01 => "2023-07-01", - global::Sample.TestClientOptions.ServiceComputeVersion.V2024_03_01 => "2024-03-01", - global::Sample.TestClientOptions.ServiceComputeVersion.V2024_07_01 => "2024-07-01", + global::Sample.TestClientOptions.SampleComputeVersion.V2023_07_01 => "2023-07-01", + global::Sample.TestClientOptions.SampleComputeVersion.V2024_03_01 => "2024-03-01", + global::Sample.TestClientOptions.SampleComputeVersion.V2024_07_01 => "2024-07-01", _ => throw new global::System.NotSupportedException() }; } @@ -41,47 +41,47 @@ public TestClientOptions(global::Sample.TestClientOptions.ServiceKeyVaultVersion [global::System.Diagnostics.CodeAnalysis.ExperimentalAttribute("SCME0002")] internal TestClientOptions(global::Microsoft.Extensions.Configuration.IConfigurationSection section) : base(section) { - ServiceComputeApiVersion = "2024-07-01"; - ServiceKeyVaultApiVersion = "7.5"; - ServiceStorageApiVersion = "2024-01-01"; + SampleComputeApiVersion = "2024-07-01"; + SampleKeyVaultApiVersion = "7.5"; + SampleStorageApiVersion = "2024-01-01"; if (((section is null) || !section.Exists())) { return; } - if ((section["ServiceComputeApiVersion"] is string serviceComputeApiVersion)) + if ((section["SampleComputeApiVersion"] is string sampleComputeApiVersion)) { - this.ServiceComputeApiVersion = serviceComputeApiVersion; + this.SampleComputeApiVersion = sampleComputeApiVersion; } - if ((section["ServiceKeyVaultApiVersion"] is string serviceKeyVaultApiVersion)) + if ((section["SampleKeyVaultApiVersion"] is string sampleKeyVaultApiVersion)) { - this.ServiceKeyVaultApiVersion = serviceKeyVaultApiVersion; + this.SampleKeyVaultApiVersion = sampleKeyVaultApiVersion; } - if ((section["ServiceStorageApiVersion"] is string serviceStorageApiVersion)) + if ((section["SampleStorageApiVersion"] is string sampleStorageApiVersion)) { - this.ServiceStorageApiVersion = serviceStorageApiVersion; + this.SampleStorageApiVersion = sampleStorageApiVersion; } } - internal string ServiceComputeApiVersion { get; } + internal string SampleComputeApiVersion { get; } - internal string ServiceKeyVaultApiVersion { get; } + internal string SampleKeyVaultApiVersion { get; } - internal string ServiceStorageApiVersion { get; } + internal string SampleStorageApiVersion { get; } - public enum ServiceComputeVersion + public enum SampleComputeVersion { V2023_07_01 = 1, V2024_03_01 = 2, V2024_07_01 = 3 } - public enum ServiceKeyVaultVersion + public enum SampleKeyVaultVersion { V7_4 = 1, V7_5 = 2 } - public enum ServiceStorageVersion + public enum SampleStorageVersion { V2023_01_01 = 1, V2024_01_01 = 2 diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceCombinedClient_GeneratesExpectedClientOptions.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceCombinedClient_GeneratesExpectedClientOptions.cs index 1eb960fa71f..30c5361bdaf 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceCombinedClient_GeneratesExpectedClientOptions.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceCombinedClient_GeneratesExpectedClientOptions.cs @@ -11,21 +11,21 @@ namespace Sample { public partial class TestClientOptions : global::System.ClientModel.Primitives.ClientPipelineOptions { - private const global::Sample.TestClientOptions.ServiceAVersion LatestServiceAVersion = global::Sample.TestClientOptions.ServiceAVersion.V2_0; - private const global::Sample.TestClientOptions.ServiceBVersion LatestServiceBVersion = global::Sample.TestClientOptions.ServiceBVersion.V4_0; + private const global::Sample.TestClientOptions.SampleServiceAVersion LatestSampleServiceAVersion = global::Sample.TestClientOptions.SampleServiceAVersion.V2_0; + private const global::Sample.TestClientOptions.SampleServiceBVersion LatestSampleServiceBVersion = global::Sample.TestClientOptions.SampleServiceBVersion.V4_0; - public TestClientOptions(global::Sample.TestClientOptions.ServiceAVersion serviceAVersion = LatestServiceAVersion, global::Sample.TestClientOptions.ServiceBVersion serviceBVersion = LatestServiceBVersion) + public TestClientOptions(global::Sample.TestClientOptions.SampleServiceAVersion sampleServiceAVersion = LatestSampleServiceAVersion, global::Sample.TestClientOptions.SampleServiceBVersion sampleServiceBVersion = LatestSampleServiceBVersion) { - ServiceAApiVersion = serviceAVersion switch + SampleServiceAApiVersion = sampleServiceAVersion switch { - global::Sample.TestClientOptions.ServiceAVersion.V1_0 => "1.0", - global::Sample.TestClientOptions.ServiceAVersion.V2_0 => "2.0", + global::Sample.TestClientOptions.SampleServiceAVersion.V1_0 => "1.0", + global::Sample.TestClientOptions.SampleServiceAVersion.V2_0 => "2.0", _ => throw new global::System.NotSupportedException() }; - ServiceBApiVersion = serviceBVersion switch + SampleServiceBApiVersion = sampleServiceBVersion switch { - global::Sample.TestClientOptions.ServiceBVersion.V3_0 => "3.0", - global::Sample.TestClientOptions.ServiceBVersion.V4_0 => "4.0", + global::Sample.TestClientOptions.SampleServiceBVersion.V3_0 => "3.0", + global::Sample.TestClientOptions.SampleServiceBVersion.V4_0 => "4.0", _ => throw new global::System.NotSupportedException() }; } @@ -33,33 +33,33 @@ public TestClientOptions(global::Sample.TestClientOptions.ServiceAVersion servic [global::System.Diagnostics.CodeAnalysis.ExperimentalAttribute("SCME0002")] internal TestClientOptions(global::Microsoft.Extensions.Configuration.IConfigurationSection section) : base(section) { - ServiceAApiVersion = "2.0"; - ServiceBApiVersion = "4.0"; + SampleServiceAApiVersion = "2.0"; + SampleServiceBApiVersion = "4.0"; if (((section is null) || !section.Exists())) { return; } - if ((section["ServiceAApiVersion"] is string serviceAApiVersion)) + if ((section["SampleServiceAApiVersion"] is string sampleServiceAApiVersion)) { - this.ServiceAApiVersion = serviceAApiVersion; + this.SampleServiceAApiVersion = sampleServiceAApiVersion; } - if ((section["ServiceBApiVersion"] is string serviceBApiVersion)) + if ((section["SampleServiceBApiVersion"] is string sampleServiceBApiVersion)) { - this.ServiceBApiVersion = serviceBApiVersion; + this.SampleServiceBApiVersion = sampleServiceBApiVersion; } } - internal string ServiceAApiVersion { get; } + internal string SampleServiceAApiVersion { get; } - internal string ServiceBApiVersion { get; } + internal string SampleServiceBApiVersion { get; } - public enum ServiceAVersion + public enum SampleServiceAVersion { V1_0 = 1, V2_0 = 2 } - public enum ServiceBVersion + public enum SampleServiceBVersion { V3_0 = 1, V4_0 = 2 diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedClientOptions.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedClientOptions.cs index 1dffdca1dbb..740d3a43b3a 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedClientOptions.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceCombinedClient_WithThreeServices_GeneratesExpectedClientOptions.cs @@ -11,29 +11,29 @@ namespace Sample { public partial class TestClientOptions : global::System.ClientModel.Primitives.ClientPipelineOptions { - private const global::Sample.TestClientOptions.ServiceComputeVersion LatestServiceComputeVersion = global::Sample.TestClientOptions.ServiceComputeVersion.V2024_07_01; - private const global::Sample.TestClientOptions.ServiceKeyVaultVersion LatestServiceKeyVaultVersion = global::Sample.TestClientOptions.ServiceKeyVaultVersion.V7_5; - private const global::Sample.TestClientOptions.ServiceStorageVersion LatestServiceStorageVersion = global::Sample.TestClientOptions.ServiceStorageVersion.V2024_01_01; + private const global::Sample.TestClientOptions.SampleComputeVersion LatestSampleComputeVersion = global::Sample.TestClientOptions.SampleComputeVersion.V2024_07_01; + private const global::Sample.TestClientOptions.SampleKeyVaultVersion LatestSampleKeyVaultVersion = global::Sample.TestClientOptions.SampleKeyVaultVersion.V7_5; + private const global::Sample.TestClientOptions.SampleStorageVersion LatestSampleStorageVersion = global::Sample.TestClientOptions.SampleStorageVersion.V2024_01_01; - public TestClientOptions(global::Sample.TestClientOptions.ServiceKeyVaultVersion serviceKeyVaultVersion = LatestServiceKeyVaultVersion, global::Sample.TestClientOptions.ServiceStorageVersion serviceStorageVersion = LatestServiceStorageVersion, global::Sample.TestClientOptions.ServiceComputeVersion serviceComputeVersion = LatestServiceComputeVersion) + public TestClientOptions(global::Sample.TestClientOptions.SampleKeyVaultVersion sampleKeyVaultVersion = LatestSampleKeyVaultVersion, global::Sample.TestClientOptions.SampleStorageVersion sampleStorageVersion = LatestSampleStorageVersion, global::Sample.TestClientOptions.SampleComputeVersion sampleComputeVersion = LatestSampleComputeVersion) { - ServiceKeyVaultApiVersion = serviceKeyVaultVersion switch + SampleKeyVaultApiVersion = sampleKeyVaultVersion switch { - global::Sample.TestClientOptions.ServiceKeyVaultVersion.V7_4 => "7.4", - global::Sample.TestClientOptions.ServiceKeyVaultVersion.V7_5 => "7.5", + global::Sample.TestClientOptions.SampleKeyVaultVersion.V7_4 => "7.4", + global::Sample.TestClientOptions.SampleKeyVaultVersion.V7_5 => "7.5", _ => throw new global::System.NotSupportedException() }; - ServiceStorageApiVersion = serviceStorageVersion switch + SampleStorageApiVersion = sampleStorageVersion switch { - global::Sample.TestClientOptions.ServiceStorageVersion.V2023_01_01 => "2023-01-01", - global::Sample.TestClientOptions.ServiceStorageVersion.V2024_01_01 => "2024-01-01", + global::Sample.TestClientOptions.SampleStorageVersion.V2023_01_01 => "2023-01-01", + global::Sample.TestClientOptions.SampleStorageVersion.V2024_01_01 => "2024-01-01", _ => throw new global::System.NotSupportedException() }; - ServiceComputeApiVersion = serviceComputeVersion switch + SampleComputeApiVersion = sampleComputeVersion switch { - global::Sample.TestClientOptions.ServiceComputeVersion.V2023_07_01 => "2023-07-01", - global::Sample.TestClientOptions.ServiceComputeVersion.V2024_03_01 => "2024-03-01", - global::Sample.TestClientOptions.ServiceComputeVersion.V2024_07_01 => "2024-07-01", + global::Sample.TestClientOptions.SampleComputeVersion.V2023_07_01 => "2023-07-01", + global::Sample.TestClientOptions.SampleComputeVersion.V2024_03_01 => "2024-03-01", + global::Sample.TestClientOptions.SampleComputeVersion.V2024_07_01 => "2024-07-01", _ => throw new global::System.NotSupportedException() }; } @@ -41,47 +41,47 @@ public TestClientOptions(global::Sample.TestClientOptions.ServiceKeyVaultVersion [global::System.Diagnostics.CodeAnalysis.ExperimentalAttribute("SCME0002")] internal TestClientOptions(global::Microsoft.Extensions.Configuration.IConfigurationSection section) : base(section) { - ServiceComputeApiVersion = "2024-07-01"; - ServiceKeyVaultApiVersion = "7.5"; - ServiceStorageApiVersion = "2024-01-01"; + SampleComputeApiVersion = "2024-07-01"; + SampleKeyVaultApiVersion = "7.5"; + SampleStorageApiVersion = "2024-01-01"; if (((section is null) || !section.Exists())) { return; } - if ((section["ServiceComputeApiVersion"] is string serviceComputeApiVersion)) + if ((section["SampleComputeApiVersion"] is string sampleComputeApiVersion)) { - this.ServiceComputeApiVersion = serviceComputeApiVersion; + this.SampleComputeApiVersion = sampleComputeApiVersion; } - if ((section["ServiceKeyVaultApiVersion"] is string serviceKeyVaultApiVersion)) + if ((section["SampleKeyVaultApiVersion"] is string sampleKeyVaultApiVersion)) { - this.ServiceKeyVaultApiVersion = serviceKeyVaultApiVersion; + this.SampleKeyVaultApiVersion = sampleKeyVaultApiVersion; } - if ((section["ServiceStorageApiVersion"] is string serviceStorageApiVersion)) + if ((section["SampleStorageApiVersion"] is string sampleStorageApiVersion)) { - this.ServiceStorageApiVersion = serviceStorageApiVersion; + this.SampleStorageApiVersion = sampleStorageApiVersion; } } - internal string ServiceComputeApiVersion { get; } + internal string SampleComputeApiVersion { get; } - internal string ServiceKeyVaultApiVersion { get; } + internal string SampleKeyVaultApiVersion { get; } - internal string ServiceStorageApiVersion { get; } + internal string SampleStorageApiVersion { get; } - public enum ServiceComputeVersion + public enum SampleComputeVersion { V2023_07_01 = 1, V2024_03_01 = 2, V2024_07_01 = 3 } - public enum ServiceKeyVaultVersion + public enum SampleKeyVaultVersion { V7_4 = 1, V7_5 = 2 } - public enum ServiceStorageVersion + public enum SampleStorageVersion { V2023_01_01 = 1, V2024_01_01 = 2 diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ApiVersionEnumProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ApiVersionEnumProvider.cs index 76f41c1e6f4..836497737a6 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ApiVersionEnumProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ApiVersionEnumProvider.cs @@ -7,8 +7,8 @@ using System.Linq; using Microsoft.TypeSpec.Generator.Expressions; using Microsoft.TypeSpec.Generator.Input; +using Microsoft.TypeSpec.Generator.Input.Extensions; using Microsoft.TypeSpec.Generator.Primitives; -using Microsoft.TypeSpec.Generator.Shared; using Microsoft.TypeSpec.Generator.Utilities; using static Microsoft.TypeSpec.Generator.Snippets.Snippet; @@ -38,7 +38,9 @@ protected override string BuildName() var serviceNamespace = _inputEnum.Namespace; if (!string.IsNullOrEmpty(serviceNamespace)) { - return ClientHelper.BuildNameForService(serviceNamespace, ServicePrefix, VersionSuffix); + // Use the full namespace to guarantee uniqueness when services + // have different namespaces but the same last segment. + return $"{serviceNamespace.ToIdentifierName()}{VersionSuffix}"; } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Shared/ClientHelper.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Shared/ClientHelper.cs deleted file mode 100644 index 527959086ec..00000000000 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Shared/ClientHelper.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; - -namespace Microsoft.TypeSpec.Generator.Shared -{ - internal static class ClientHelper - { - /// - /// Builds a name with the specified prefix and suffix, ensuring no duplicate prefix or suffix - /// if the namespace/service segment already contains them. - /// - /// The full service name. - /// The prefix to ensure (e.g., "Service", "Latest"). - /// The suffix to ensure (e.g., "Version"). - /// A name with the specified prefix and suffix. - public static string BuildNameForService(string serviceName, string prefix, string suffix) - { - var lastNamespaceSegment = serviceName.AsSpan(); - int lastDotIndex = serviceName.LastIndexOf('.'); - if (lastDotIndex >= 0) - { - lastNamespaceSegment = lastNamespaceSegment.Slice(lastDotIndex + 1); - } - - bool hasPrefix = lastNamespaceSegment.StartsWith(prefix.AsSpan(), StringComparison.OrdinalIgnoreCase); - bool hasSuffix = lastNamespaceSegment.EndsWith(suffix.AsSpan(), StringComparison.OrdinalIgnoreCase); - - return (hasPrefix, hasSuffix) switch - { - (true, true) => lastNamespaceSegment.ToString(), - (true, false) => $"{lastNamespaceSegment}{suffix}", - (false, true) => $"{prefix}{lastNamespaceSegment}", - (false, false) => $"{prefix}{lastNamespaceSegment}{suffix}" - }; - } - } -} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/EnumProviders/ApiVersionEnumProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/EnumProviders/ApiVersionEnumProviderTests.cs index 548e71f06a2..49ba16c2aad 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/EnumProviders/ApiVersionEnumProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/EnumProviders/ApiVersionEnumProviderTests.cs @@ -178,9 +178,9 @@ public void MultiServiceClient_WithMultipleApiVersionEnums_GeneratesCorrectEnumN Assert.IsTrue(storageEnumType is ApiVersionEnumProvider); var storageProvider = (ApiVersionEnumProvider)storageEnumType; - // Verify enum names follow the multiservice naming pattern: Service{ServiceName}Version - Assert.AreEqual("ServiceKeyVaultVersion", keyVaultProvider.Name); - Assert.AreEqual("ServiceStorageVersion", storageProvider.Name); + // Verify enum names use the full namespace for uniqueness: {FullNamespace}Version + Assert.AreEqual("SampleKeyVaultVersion", keyVaultProvider.Name); + Assert.AreEqual("SampleStorageVersion", storageProvider.Name); } [Test] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Shared/ClientHelperTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Shared/ClientHelperTests.cs deleted file mode 100644 index e9ea467e259..00000000000 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Shared/ClientHelperTests.cs +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.TypeSpec.Generator.Shared; -using NUnit.Framework; - -namespace Microsoft.TypeSpec.Generator.Tests.Shared -{ - public class ClientHelperTests - { - [Test] - public void BuildNameForService_NoPrefixNoSuffix_AddsBoth() - { - var result = ClientHelper.BuildNameForService("Sample.KeyVault", "Service", "Version"); - Assert.AreEqual("ServiceKeyVaultVersion", result); - } - - [Test] - public void BuildNameForService_HasPrefixNoSuffix_AddsSuffix() - { - var result = ClientHelper.BuildNameForService("Sample.ServiceKeyVault", "Service", "Version"); - Assert.AreEqual("ServiceKeyVaultVersion", result); - } - - [Test] - public void BuildNameForService_NoPrefixHasSuffix_AddsPrefix() - { - var result = ClientHelper.BuildNameForService("Sample.KeyVaultVersion", "Service", "Version"); - Assert.AreEqual("ServiceKeyVaultVersion", result); - } - - [Test] - public void BuildNameForService_HasPrefixAndSuffix_ReturnsAsIs() - { - var result = ClientHelper.BuildNameForService("Sample.ServiceKeyVaultVersion", "Service", "Version"); - Assert.AreEqual("ServiceKeyVaultVersion", result); - } - - // Namespace handling tests - - [Test] - public void BuildNameForService_MultipleNamespaceSegments_ExtractsLastSegment() - { - var result = ClientHelper.BuildNameForService("Azure.ResourceManager.Storage", "Service", "Version"); - Assert.AreEqual("ServiceStorageVersion", result); - } - - [Test] - public void BuildNameForService_NoNamespaceSegments_UsesFullName() - { - var result = ClientHelper.BuildNameForService("Storage", "Service", "Version"); - Assert.AreEqual("ServiceStorageVersion", result); - } - - [Test] - public void BuildNameForService_SingleDotNamespace_ExtractsLastSegment() - { - var result = ClientHelper.BuildNameForService("Sample.Compute", "Service", "Version"); - Assert.AreEqual("ServiceComputeVersion", result); - } - - // Case insensitivity tests - - [Test] - public void BuildNameForService_PrefixCaseInsensitive_LowerCase() - { - var result = ClientHelper.BuildNameForService("Sample.serviceKeyVault", "Service", "Version"); - Assert.AreEqual("serviceKeyVaultVersion", result); - } - - [Test] - public void BuildNameForService_SuffixCaseInsensitive_LowerCase() - { - var result = ClientHelper.BuildNameForService("Sample.KeyVaultversion", "Service", "Version"); - Assert.AreEqual("ServiceKeyVaultversion", result); - } - - [Test] - public void BuildNameForService_BothCaseInsensitive_MixedCase() - { - var result = ClientHelper.BuildNameForService("Sample.SERVICEKeyVaultVERSION", "Service", "Version"); - Assert.AreEqual("SERVICEKeyVaultVERSION", result); - } - - // Edge cases - - [Test] - public void BuildNameForService_EmptyServiceName_ReturnsEmptyWithPrefixAndSuffix() - { - var result = ClientHelper.BuildNameForService("", "Service", "Version"); - Assert.AreEqual("ServiceVersion", result); - } - - [Test] - public void BuildNameForService_TrailingDot_ReturnsEmptyWithPrefixAndSuffix() - { - var result = ClientHelper.BuildNameForService("Sample.", "Service", "Version"); - Assert.AreEqual("ServiceVersion", result); - } - - [Test] - public void BuildNameForService_EmptyPrefix_OnlyAddsSuffix() - { - var result = ClientHelper.BuildNameForService("Sample.KeyVault", "", "Version"); - Assert.AreEqual("KeyVaultVersion", result); - } - - [Test] - public void BuildNameForService_EmptySuffix_OnlyAddsPrefix() - { - var result = ClientHelper.BuildNameForService("Sample.KeyVault", "Service", ""); - Assert.AreEqual("ServiceKeyVault", result); - } - - [Test] - public void BuildNameForService_BothPrefixAndSuffixEmpty_ReturnsLastSegment() - { - var result = ClientHelper.BuildNameForService("Sample.KeyVault", "", ""); - Assert.AreEqual("KeyVault", result); - } - - [Test] - public void BuildNameForService_ServiceNameEqualsPrefix_AddsSuffix() - { - var result = ClientHelper.BuildNameForService("Sample.Service", "Service", "Version"); - Assert.AreEqual("ServiceVersion", result); - } - - [Test] - public void BuildNameForService_ServiceNameEqualsSuffix_AddsPrefix() - { - var result = ClientHelper.BuildNameForService("Sample.Version", "Service", "Version"); - Assert.AreEqual("ServiceVersion", result); - } - - [Test] - public void BuildNameForService_ServiceNameEqualsPrefixAndSuffix_ReturnsAsIs() - { - var result = ClientHelper.BuildNameForService("Sample.ServiceVersion", "Service", "Version"); - Assert.AreEqual("ServiceVersion", result); - } - - [Test] - public void BuildNameForService_AzureKeyVault_GeneratesCorrectName() - { - var result = ClientHelper.BuildNameForService("Azure.Security.KeyVault", "Service", "Version"); - Assert.AreEqual("ServiceKeyVaultVersion", result); - } - - [Test] - public void BuildNameForService_AzureStorage_GeneratesCorrectName() - { - var result = ClientHelper.BuildNameForService("Azure.Storage.Blobs", "Service", "Version"); - Assert.AreEqual("ServiceBlobsVersion", result); - } - - [Test] - public void BuildNameForService_ApiVersionSuffix_GeneratesCorrectName() - { - var result = ClientHelper.BuildNameForService("Sample.KeyVault", "Service", "ApiVersion"); - Assert.AreEqual("ServiceKeyVaultApiVersion", result); - } - - [Test] - public void BuildNameForService_LatestPrefix_GeneratesCorrectName() - { - var result = ClientHelper.BuildNameForService("Sample.KeyVault", "Latest", "Version"); - Assert.AreEqual("LatestKeyVaultVersion", result); - } - } -}