From b566c8bb9f0851202734169616e9741bcedd9392 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 14:47:55 +0000 Subject: [PATCH 1/7] Initial plan From f402ec5a069ef8d30e3dd692670fb0b7e0ef0366 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 14:58:20 +0000 Subject: [PATCH 2/7] fix: deduplicate API version field names for multi-service clients with colliding namespaces Co-authored-by: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> --- .../src/Providers/ClientOptionsProvider.cs | 35 ++++++++- .../ClientProviders/ClientProviderTests.cs | 71 +++++++++++++++++++ 2 files changed, 105 insertions(+), 1 deletion(-) 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..d6814daad12 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 @@ -131,13 +131,46 @@ private static bool UseSingletonInstance(InputClient inputClient) return null; } - var properties = new Dictionary(_serviceVersionsEnums.Count); + // Compute version property names for each enum + var entries = new List<(InputEnumType InputEnum, EnumProvider EnumProvider, string Name)>(_serviceVersionsEnums.Count); foreach (var (inputEnum, enumProvider) in _serviceVersionsEnums) { var versionPropertyName = _inputClient.IsMultiServiceClient ? ClientHelper.BuildNameForService(inputEnum.Namespace, ServicePrefix, ApiVersionSuffix) : VersionSuffix; + entries.Add((inputEnum, enumProvider, versionPropertyName)); + } + + // When namespace-based names collide for multi-service clients, fall back to using the enum name + if (_inputClient.IsMultiServiceClient) + { + var duplicateNames = new HashSet(StringComparer.OrdinalIgnoreCase); + var seenNames = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var (_, _, name) in entries) + { + if (!seenNames.Add(name)) + { + duplicateNames.Add(name); + } + } + + if (duplicateNames.Count > 0) + { + for (int i = 0; i < entries.Count; i++) + { + var entry = entries[i]; + if (duplicateNames.Contains(entry.Name)) + { + entries[i] = (entry.InputEnum, entry.EnumProvider, + ClientHelper.BuildNameForService(entry.InputEnum.Name, ServicePrefix, ApiVersionSuffix)); + } + } + } + } + var properties = new Dictionary(_serviceVersionsEnums.Count); + foreach (var (_, enumProvider, versionPropertyName) in entries) + { var versionProperty = new PropertyProvider( null, MethodSignatureModifiers.Internal, 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..af2019be48b 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 @@ -3821,6 +3821,77 @@ public void GetApiVersionFieldForService_MultiService_CaseInsensitiveMatch() Assert.AreEqual("_serviceAApiVersion", fieldUpperCase!.Name); } + [Test] + public void GetApiVersionFieldForService_MultiService_SameNamespace_ProducesUniqueFields() + { + // Regression test: when two services share the same namespace, the namespace-based + // name generation produces duplicates. The fix falls back to enum 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)); + + // Both enums share the same namespace, which would produce duplicate field names + var serviceOneEnum = InputFactory.StringEnum( + "ServiceOneVersions", + serviceOneEnumValues, + usage: InputModelTypeUsage.ApiVersionEnum, + clientNamespace: "Azure.Generator.MgmtTypeSpec.MultiService.Tests"); + var serviceTwoEnum = InputFactory.StringEnum( + "ServiceTwoVersions", + serviceTwoEnumValues, + usage: InputModelTypeUsage.ApiVersionEnum, + clientNamespace: "Azure.Generator.MgmtTypeSpec.MultiService.Tests"); + + InputParameter apiVersionParameter = InputFactory.QueryParameter( + "apiVersion", + InputPrimitiveType.String, + isRequired: true, + scope: InputParameterScope.Client, + isApiVersion: true); + + var serviceOneOperation = InputFactory.Operation( + "ServiceOneOperation", + parameters: [apiVersionParameter], + ns: "Azure.Generator.MgmtTypeSpec.MultiService.Tests"); + + var serviceTwoOperation = InputFactory.Operation( + "ServiceTwoOperation", + parameters: [apiVersionParameter], + ns: "Azure.Generator.MgmtTypeSpec.MultiService.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); + + // The fields should have unique names derived from enum names + var fieldOne = clientProvider!.GetApiVersionFieldForService("Azure.Generator.MgmtTypeSpec.MultiService.Tests"); + Assert.IsNotNull(fieldOne); + + // Verify we have two distinct api version fields + var apiVersionFields = clientProvider.Fields.Where(f => f.Name.Contains("ApiVersion", StringComparison.OrdinalIgnoreCase)).ToList(); + Assert.AreEqual(2, apiVersionFields.Count); + Assert.AreNotEqual(apiVersionFields[0].Name, apiVersionFields[1].Name); + } + [TestCase("{endpoint}")] [TestCase("{Endpoint}")] [TestCase("{ENDPOINT}")] From 543e34ea0d0d33619bf0c5fcb60f510424a462ca Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 15:04:34 +0000 Subject: [PATCH 3/7] test: improve assertions for multi-service same-namespace regression test Co-authored-by: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> --- .../ClientProviders/ClientProviderTests.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) 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 af2019be48b..c1dc79971ac 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 @@ -3882,14 +3882,17 @@ public void GetApiVersionFieldForService_MultiService_SameNamespace_ProducesUniq // This should not crash — previously it threw due to duplicate field names Assert.DoesNotThrow(() => _ = clientProvider!.Fields); - // The fields should have unique names derived from enum names - var fieldOne = clientProvider!.GetApiVersionFieldForService("Azure.Generator.MgmtTypeSpec.MultiService.Tests"); - Assert.IsNotNull(fieldOne); - - // Verify we have two distinct api version fields - var apiVersionFields = clientProvider.Fields.Where(f => f.Name.Contains("ApiVersion", StringComparison.OrdinalIgnoreCase)).ToList(); + // Verify we have two distinct api version fields with names derived from enum names + 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); + + // Verify the field names use enum-name-based naming (since namespace-based names would collide) + Assert.AreEqual("_serviceOneVersionsApiVersion", apiVersionFields[0].Name); + Assert.AreEqual("_serviceTwoVersionsApiVersion", apiVersionFields[1].Name); } [TestCase("{endpoint}")] From d1fe573fe6f01ebfe1b09274c2e7c095bf6c4a54 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 15:20:50 +0000 Subject: [PATCH 4/7] refactor: use full namespace for multi-service API version property names per review feedback Co-authored-by: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> --- .../src/Providers/ClientOptionsProvider.cs | 39 ++----------------- .../ClientProviders/ClientProviderTests.cs | 33 ++++++++-------- ...tiServiceClient_GeneratesExpectedClient.cs | 12 +++--- ...thThreeServices_GeneratesExpectedClient.cs | 18 ++++----- ...eCombinedClient_GeneratesExpectedClient.cs | 8 ++-- ...thThreeServices_GeneratesExpectedClient.cs | 12 +++--- ...binedClient_GeneratesExpectedRestClient.cs | 4 +- ...reeServices_GeneratesExpectedRestClient.cs | 6 +-- ...ceClient_GeneratesExpectedClientOptions.cs | 20 +++++----- ...Services_GeneratesExpectedClientOptions.cs | 30 +++++++------- ...edClient_GeneratesExpectedClientOptions.cs | 20 +++++----- ...Services_GeneratesExpectedClientOptions.cs | 30 +++++++------- 12 files changed, 101 insertions(+), 131 deletions(-) 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 d6814daad12..f66ccb8123f 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 @@ -131,46 +131,15 @@ private static bool UseSingletonInstance(InputClient inputClient) return null; } - // Compute version property names for each enum - var entries = new List<(InputEnumType InputEnum, EnumProvider EnumProvider, string Name)>(_serviceVersionsEnums.Count); + 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; - entries.Add((inputEnum, enumProvider, versionPropertyName)); - } - - // When namespace-based names collide for multi-service clients, fall back to using the enum name - if (_inputClient.IsMultiServiceClient) - { - var duplicateNames = new HashSet(StringComparer.OrdinalIgnoreCase); - var seenNames = new HashSet(StringComparer.OrdinalIgnoreCase); - foreach (var (_, _, name) in entries) - { - if (!seenNames.Add(name)) - { - duplicateNames.Add(name); - } - } - - if (duplicateNames.Count > 0) - { - for (int i = 0; i < entries.Count; i++) - { - var entry = entries[i]; - if (duplicateNames.Contains(entry.Name)) - { - entries[i] = (entry.InputEnum, entry.EnumProvider, - ClientHelper.BuildNameForService(entry.InputEnum.Name, ServicePrefix, ApiVersionSuffix)); - } - } - } - } - var properties = new Dictionary(_serviceVersionsEnums.Count); - foreach (var (_, enumProvider, versionPropertyName) in entries) - { var versionProperty = new PropertyProvider( null, MethodSignatureModifiers.Internal, 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 c1dc79971ac..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,35 +3814,36 @@ 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_SameNamespace_ProducesUniqueFields() + public void GetApiVersionFieldForService_MultiService_SameLastSegment_ProducesUniqueFields() { - // Regression test: when two services share the same namespace, the namespace-based - // name generation produces duplicates. The fix falls back to enum names. + // 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)); - // Both enums share the same namespace, which would produce duplicate field names + // 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.Generator.MgmtTypeSpec.MultiService.Tests"); + clientNamespace: "Azure.ServiceOne.Tests"); var serviceTwoEnum = InputFactory.StringEnum( "ServiceTwoVersions", serviceTwoEnumValues, usage: InputModelTypeUsage.ApiVersionEnum, - clientNamespace: "Azure.Generator.MgmtTypeSpec.MultiService.Tests"); + clientNamespace: "Azure.ServiceTwo.Tests"); InputParameter apiVersionParameter = InputFactory.QueryParameter( "apiVersion", @@ -3854,12 +3855,12 @@ public void GetApiVersionFieldForService_MultiService_SameNamespace_ProducesUniq var serviceOneOperation = InputFactory.Operation( "ServiceOneOperation", parameters: [apiVersionParameter], - ns: "Azure.Generator.MgmtTypeSpec.MultiService.Tests"); + ns: "Azure.ServiceOne.Tests"); var serviceTwoOperation = InputFactory.Operation( "ServiceTwoOperation", parameters: [apiVersionParameter], - ns: "Azure.Generator.MgmtTypeSpec.MultiService.Tests"); + ns: "Azure.ServiceTwo.Tests"); var client = InputFactory.Client( TestClientName, @@ -3882,7 +3883,7 @@ public void GetApiVersionFieldForService_MultiService_SameNamespace_ProducesUniq // This should not crash — previously it threw due to duplicate field names Assert.DoesNotThrow(() => _ = clientProvider!.Fields); - // Verify we have two distinct api version fields with names derived from enum names + // 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) @@ -3890,9 +3891,9 @@ public void GetApiVersionFieldForService_MultiService_SameNamespace_ProducesUniq Assert.AreEqual(2, apiVersionFields.Count); Assert.AreNotEqual(apiVersionFields[0].Name, apiVersionFields[1].Name); - // Verify the field names use enum-name-based naming (since namespace-based names would collide) - Assert.AreEqual("_serviceOneVersionsApiVersion", apiVersionFields[0].Name); - Assert.AreEqual("_serviceTwoVersionsApiVersion", 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..aea43de4818 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 @@ -16,13 +16,13 @@ public partial class TestClientOptions : global::System.ClientModel.Primitives.C public TestClientOptions(global::Sample.TestClientOptions.ServiceAVersion serviceAVersion = LatestServiceAVersion, global::Sample.TestClientOptions.ServiceBVersion serviceBVersion = LatestServiceBVersion) { - ServiceAApiVersion = serviceAVersion switch + SampleServiceAApiVersion = serviceAVersion switch { global::Sample.TestClientOptions.ServiceAVersion.V1_0 => "1.0", global::Sample.TestClientOptions.ServiceAVersion.V2_0 => "2.0", _ => throw new global::System.NotSupportedException() }; - ServiceBApiVersion = serviceBVersion switch + SampleServiceBApiVersion = serviceBVersion switch { global::Sample.TestClientOptions.ServiceBVersion.V3_0 => "3.0", global::Sample.TestClientOptions.ServiceBVersion.V4_0 => "4.0", @@ -33,25 +33,25 @@ 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 { 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..ebba2f7aebd 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 @@ -17,19 +17,19 @@ public partial class TestClientOptions : global::System.ClientModel.Primitives.C public TestClientOptions(global::Sample.TestClientOptions.ServiceKeyVaultVersion serviceKeyVaultVersion = LatestServiceKeyVaultVersion, global::Sample.TestClientOptions.ServiceStorageVersion serviceStorageVersion = LatestServiceStorageVersion, global::Sample.TestClientOptions.ServiceComputeVersion serviceComputeVersion = LatestServiceComputeVersion) { - ServiceKeyVaultApiVersion = serviceKeyVaultVersion switch + SampleKeyVaultApiVersion = serviceKeyVaultVersion switch { global::Sample.TestClientOptions.ServiceKeyVaultVersion.V7_4 => "7.4", global::Sample.TestClientOptions.ServiceKeyVaultVersion.V7_5 => "7.5", _ => throw new global::System.NotSupportedException() }; - ServiceStorageApiVersion = serviceStorageVersion switch + SampleStorageApiVersion = serviceStorageVersion switch { global::Sample.TestClientOptions.ServiceStorageVersion.V2023_01_01 => "2023-01-01", global::Sample.TestClientOptions.ServiceStorageVersion.V2024_01_01 => "2024-01-01", _ => throw new global::System.NotSupportedException() }; - ServiceComputeApiVersion = serviceComputeVersion switch + SampleComputeApiVersion = serviceComputeVersion switch { global::Sample.TestClientOptions.ServiceComputeVersion.V2023_07_01 => "2023-07-01", global::Sample.TestClientOptions.ServiceComputeVersion.V2024_03_01 => "2024-03-01", @@ -41,32 +41,32 @@ 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 { 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..aea43de4818 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 @@ -16,13 +16,13 @@ public partial class TestClientOptions : global::System.ClientModel.Primitives.C public TestClientOptions(global::Sample.TestClientOptions.ServiceAVersion serviceAVersion = LatestServiceAVersion, global::Sample.TestClientOptions.ServiceBVersion serviceBVersion = LatestServiceBVersion) { - ServiceAApiVersion = serviceAVersion switch + SampleServiceAApiVersion = serviceAVersion switch { global::Sample.TestClientOptions.ServiceAVersion.V1_0 => "1.0", global::Sample.TestClientOptions.ServiceAVersion.V2_0 => "2.0", _ => throw new global::System.NotSupportedException() }; - ServiceBApiVersion = serviceBVersion switch + SampleServiceBApiVersion = serviceBVersion switch { global::Sample.TestClientOptions.ServiceBVersion.V3_0 => "3.0", global::Sample.TestClientOptions.ServiceBVersion.V4_0 => "4.0", @@ -33,25 +33,25 @@ 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 { 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..ebba2f7aebd 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 @@ -17,19 +17,19 @@ public partial class TestClientOptions : global::System.ClientModel.Primitives.C public TestClientOptions(global::Sample.TestClientOptions.ServiceKeyVaultVersion serviceKeyVaultVersion = LatestServiceKeyVaultVersion, global::Sample.TestClientOptions.ServiceStorageVersion serviceStorageVersion = LatestServiceStorageVersion, global::Sample.TestClientOptions.ServiceComputeVersion serviceComputeVersion = LatestServiceComputeVersion) { - ServiceKeyVaultApiVersion = serviceKeyVaultVersion switch + SampleKeyVaultApiVersion = serviceKeyVaultVersion switch { global::Sample.TestClientOptions.ServiceKeyVaultVersion.V7_4 => "7.4", global::Sample.TestClientOptions.ServiceKeyVaultVersion.V7_5 => "7.5", _ => throw new global::System.NotSupportedException() }; - ServiceStorageApiVersion = serviceStorageVersion switch + SampleStorageApiVersion = serviceStorageVersion switch { global::Sample.TestClientOptions.ServiceStorageVersion.V2023_01_01 => "2023-01-01", global::Sample.TestClientOptions.ServiceStorageVersion.V2024_01_01 => "2024-01-01", _ => throw new global::System.NotSupportedException() }; - ServiceComputeApiVersion = serviceComputeVersion switch + SampleComputeApiVersion = serviceComputeVersion switch { global::Sample.TestClientOptions.ServiceComputeVersion.V2023_07_01 => "2023-07-01", global::Sample.TestClientOptions.ServiceComputeVersion.V2024_03_01 => "2024-03-01", @@ -41,32 +41,32 @@ 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 { From 86495a84c0a4a0fabc8c5016b6418ea496282fd5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 16:19:11 +0000 Subject: [PATCH 5/7] fix: use full namespace for service version enum names in ApiVersionEnumProvider and add collision test Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../src/Providers/ClientOptionsProvider.cs | 5 +-- .../Providers/ClientOptionsProviderTests.cs | 42 +++++++++++++++++++ ...ceClient_GeneratesExpectedClientOptions.cs | 22 +++++----- ...Services_GeneratesExpectedClientOptions.cs | 34 +++++++-------- ...edClient_GeneratesExpectedClientOptions.cs | 22 +++++----- ...Services_GeneratesExpectedClientOptions.cs | 34 +++++++-------- .../src/Providers/ApiVersionEnumProvider.cs | 5 ++- .../ApiVersionEnumProviderTests.cs | 6 +-- 8 files changed, 106 insertions(+), 64 deletions(-) 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 f66ccb8123f..1edbcb476b4 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 @@ -258,10 +258,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..abd1847b8d2 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,48 @@ 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); + Assert.AreNotEqual(nestedTypes[0].Name, nestedTypes[1].Name); + 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/TestData/ClientOptionsProviderTests/MultiServiceClient_GeneratesExpectedClientOptions.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientOptionsProviderTests/MultiServiceClient_GeneratesExpectedClientOptions.cs index aea43de4818..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) { - SampleServiceAApiVersion = 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() }; - SampleServiceBApiVersion = 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() }; } @@ -53,13 +53,13 @@ internal TestClientOptions(global::Microsoft.Extensions.Configuration.IConfigura 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 ebba2f7aebd..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) { - SampleKeyVaultApiVersion = 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() }; - SampleStorageApiVersion = 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() }; - SampleComputeApiVersion = 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() }; } @@ -68,20 +68,20 @@ internal TestClientOptions(global::Microsoft.Extensions.Configuration.IConfigura 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 aea43de4818..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) { - SampleServiceAApiVersion = 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() }; - SampleServiceBApiVersion = 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() }; } @@ -53,13 +53,13 @@ internal TestClientOptions(global::Microsoft.Extensions.Configuration.IConfigura 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 ebba2f7aebd..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) { - SampleKeyVaultApiVersion = 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() }; - SampleStorageApiVersion = 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() }; - SampleComputeApiVersion = 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() }; } @@ -68,20 +68,20 @@ internal TestClientOptions(global::Microsoft.Extensions.Configuration.IConfigura 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..14b3ed8b4a1 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,6 +7,7 @@ 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; @@ -38,7 +39,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/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] From 46a2f0ec9c5441caf9fb7975b79b8ad8ec811ef4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 16:20:55 +0000 Subject: [PATCH 6/7] test: remove redundant assertion in service version enum collision test Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../test/Providers/ClientOptionsProviderTests.cs | 1 - 1 file changed, 1 deletion(-) 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 abd1847b8d2..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 @@ -751,7 +751,6 @@ public void MultiServiceClient_SameLastSegment_ProducesUniqueVersionEnums() // Validate nested service version enums have unique names var nestedTypes = clientOptionsProvider!.NestedTypes; Assert.AreEqual(2, nestedTypes.Count); - Assert.AreNotEqual(nestedTypes[0].Name, nestedTypes[1].Name); CollectionAssert.AllItemsAreUnique(nestedTypes.Select(t => t.Name).ToList()); } From b8b550eef8db65695ae38ae9786d45debda2a8c7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 16:48:38 +0000 Subject: [PATCH 7/7] chore: remove unused BuildNameForService helper and its tests Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../src/Providers/ClientOptionsProvider.cs | 1 - .../src/Providers/ApiVersionEnumProvider.cs | 1 - .../src/Shared/ClientHelper.cs | 39 ---- .../test/Shared/ClientHelperTests.cs | 171 ------------------ 4 files changed, 212 deletions(-) delete mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Shared/ClientHelper.cs delete mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Shared/ClientHelperTests.cs 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 1edbcb476b4..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; 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 14b3ed8b4a1..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 @@ -9,7 +9,6 @@ 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; 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/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); - } - } -}