From 021e3ca3bfab383444a201b9e6fa0d9542137f30 Mon Sep 17 00:00:00 2001 From: Jorge Rangel Date: Thu, 11 Dec 2025 15:52:56 -0600 Subject: [PATCH 1/2] feat: make enum types public --- .../src/Providers/ApiVersionEnumProvider.cs | 2 +- .../src/Providers/EnumProvider.cs | 9 ++++++++- .../src/Providers/ExtensibleEnumProvider.cs | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) 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 e5262535ae0..851f723f294 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 @@ -13,7 +13,7 @@ namespace Microsoft.TypeSpec.Generator.Providers { - internal sealed class ApiVersionEnumProvider : FixedEnumProvider + public class ApiVersionEnumProvider : FixedEnumProvider { private const string ApiVersionEnumName = "ServiceVersion"; private const string ApiVersionEnumDescription = "The version of the service to use."; diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/EnumProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/EnumProvider.cs index 789f58b6ef1..1870cf14791 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/EnumProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/EnumProvider.cs @@ -22,9 +22,16 @@ public static EnumProvider Create(InputEnumType input, TypeProvider? declaringTy : new FixedEnumProvider(input, declaringType); var extensibleEnumProvider = new ExtensibleEnumProvider(input, declaringType); + return CreateConcreteType(input, fixedEnumProvider, extensibleEnumProvider); + } + + protected internal static EnumProvider CreateConcreteType( + InputEnumType input, + FixedEnumProvider fixedEnumProvider, + ExtensibleEnumProvider extensibleEnumProvider) + { // Check to see if there is custom code that customizes the enum. var customCodeView = fixedEnumProvider.CustomCodeView ?? extensibleEnumProvider.CustomCodeView; - EnumProvider provider = customCodeView switch { { Type: { IsValueType: true, IsStruct: true } } => extensibleEnumProvider, diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ExtensibleEnumProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ExtensibleEnumProvider.cs index 7dc2f51f752..941e3665095 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ExtensibleEnumProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ExtensibleEnumProvider.cs @@ -22,7 +22,7 @@ public class ExtensibleEnumProvider : EnumProvider private readonly IReadOnlyList _allowedValues; private readonly TypeSignatureModifiers _modifiers; private readonly InputEnumType _inputType; - internal ExtensibleEnumProvider(InputEnumType input, TypeProvider? declaringType) : base(input) + public ExtensibleEnumProvider(InputEnumType input, TypeProvider? declaringType) : base(input) { _inputType = input; _allowedValues = input.Values; From 5e804e5f6a6805e873166aed7e2b6114f82cb3b1 Mon Sep 17 00:00:00 2001 From: Jorge Rangel Date: Fri, 12 Dec 2025 01:04:20 -0600 Subject: [PATCH 2/2] refactor: move order of enum creation --- .../src/Providers/ApiVersionEnumProvider.cs | 2 +- .../src/Providers/EnumProvider.cs | 29 +---- .../src/Providers/ExtensibleEnumProvider.cs | 3 +- .../src/Providers/FixedEnumProvider.cs | 1 + .../src/Providers/TypeProvider.cs | 7 +- .../src/TypeFactory.cs | 28 +++++ .../src/Utilities/DiagnosticCodes.cs | 1 + .../test/InputLibraryVisitorTests.cs | 3 +- .../ModelProviders/ModelCustomizationTests.cs | 6 +- .../CustomizedEnum.cs | 8 ++ .../test/TypeFactoryTests.cs | 110 ++++++++++++++++++ .../Utilities/MethodProviderHelpersTests.cs | 9 +- 12 files changed, 177 insertions(+), 30 deletions(-) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TestData/TypeFactoryTests/CreateEnum_WithCustomCodeAsExtensible_ReturnsExtensibleEnum/CustomizedEnum.cs 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 851f723f294..e5262535ae0 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 @@ -13,7 +13,7 @@ namespace Microsoft.TypeSpec.Generator.Providers { - public class ApiVersionEnumProvider : FixedEnumProvider + internal sealed class ApiVersionEnumProvider : FixedEnumProvider { private const string ApiVersionEnumName = "ServiceVersion"; private const string ApiVersionEnumDescription = "The version of the service to use."; diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/EnumProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/EnumProvider.cs index 1870cf14791..cf63a97c190 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/EnumProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/EnumProvider.cs @@ -21,30 +21,10 @@ public static EnumProvider Create(InputEnumType input, TypeProvider? declaringTy ? new ApiVersionEnumProvider(input, declaringType) : new FixedEnumProvider(input, declaringType); var extensibleEnumProvider = new ExtensibleEnumProvider(input, declaringType); + fixedEnumProvider.ExtensibleEnumView = extensibleEnumProvider; + extensibleEnumProvider.FixedEnumView = fixedEnumProvider; - return CreateConcreteType(input, fixedEnumProvider, extensibleEnumProvider); - } - - protected internal static EnumProvider CreateConcreteType( - InputEnumType input, - FixedEnumProvider fixedEnumProvider, - ExtensibleEnumProvider extensibleEnumProvider) - { - // Check to see if there is custom code that customizes the enum. - var customCodeView = fixedEnumProvider.CustomCodeView ?? extensibleEnumProvider.CustomCodeView; - EnumProvider provider = customCodeView switch - { - { Type: { IsValueType: true, IsStruct: true } } => extensibleEnumProvider, - { Type: { IsValueType: true, IsStruct: false } } => fixedEnumProvider, - _ => input.IsExtensible ? extensibleEnumProvider : fixedEnumProvider - }; - - if (input.Access == "public") - { - CodeModelGenerator.Instance.AddTypeToKeep(provider); - } - - return provider; + return input.IsExtensible ? extensibleEnumProvider : fixedEnumProvider; } protected EnumProvider(InputEnumType? input) @@ -54,6 +34,9 @@ protected EnumProvider(InputEnumType? input) IsExtensible = input?.IsExtensible ?? false; } + internal EnumProvider? FixedEnumView { get; set; } + internal EnumProvider? ExtensibleEnumView { get; set; } + public bool IsExtensible { get; } private bool? _isIntValue; internal bool IsIntValueType => _isIntValue ??= EnumUnderlyingType.Equals(typeof(int)) || EnumUnderlyingType.Equals(typeof(long)); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ExtensibleEnumProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ExtensibleEnumProvider.cs index 941e3665095..ae937a41b99 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ExtensibleEnumProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ExtensibleEnumProvider.cs @@ -22,7 +22,7 @@ public class ExtensibleEnumProvider : EnumProvider private readonly IReadOnlyList _allowedValues; private readonly TypeSignatureModifiers _modifiers; private readonly InputEnumType _inputType; - public ExtensibleEnumProvider(InputEnumType input, TypeProvider? declaringType) : base(input) + internal ExtensibleEnumProvider(InputEnumType input, TypeProvider? declaringType) : base(input) { _inputType = input; _allowedValues = input.Values; @@ -36,6 +36,7 @@ public ExtensibleEnumProvider(InputEnumType input, TypeProvider? declaringType) _valueField = new FieldProvider(FieldModifiers.Private | FieldModifiers.ReadOnly, EnumUnderlyingType, "_value", this); _declaringType = declaringType; + ExtensibleEnumView = this; } private readonly FieldProvider _valueField; diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/FixedEnumProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/FixedEnumProvider.cs index a9108091102..258c5c4d125 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/FixedEnumProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/FixedEnumProvider.cs @@ -30,6 +30,7 @@ public FixedEnumProvider(InputEnumType? input, TypeProvider? declaringType) : ba _declaringTypeProvider = declaringType; AllowedValues = input?.Values ?? []; + FixedEnumView = this; } internal IReadOnlyList AllowedValues { get; } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs index 4c71481a7b0..db54591a135 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs @@ -6,11 +6,13 @@ using System.Linq; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.TypeSpec.Generator.EmitterRpc; using Microsoft.TypeSpec.Generator.Expressions; using Microsoft.TypeSpec.Generator.Input; using Microsoft.TypeSpec.Generator.Primitives; using Microsoft.TypeSpec.Generator.SourceInput; using Microsoft.TypeSpec.Generator.Statements; +using Microsoft.TypeSpec.Generator.Utilities; namespace Microsoft.TypeSpec.Generator.Providers { @@ -187,7 +189,10 @@ private TypeSignatureModifiers BuildDeclarationModifiersInternal() // mask & (mask - 1) gives us 0 if mask is a power of 2, it means we have exactly one flag of above when the mask is a power of 2 if ((mask & (mask - 1)) != 0) { - throw new InvalidOperationException($"Invalid modifier {modifiers} on TypeProvider {Name}"); + CodeModelGenerator.Instance.Emitter.ReportDiagnostic( + DiagnosticCodes.InvalidAccessModifier, + $"Invalid modifiers {modifiers} detected.", + severity: EmitterDiagnosticSeverity.Warning); } // we always add partial when possible diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/TypeFactory.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/TypeFactory.cs index 705a331086a..bd6a4d8c6dc 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/TypeFactory.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/TypeFactory.cs @@ -220,6 +220,34 @@ protected internal TypeFactory() foreach (var visitor in Visitors) { enumProvider = visitor.PreVisitEnum(enumType, enumProvider); + // visit the linked enum variants + if (enumProvider is FixedEnumProvider) + { + enumProvider.ExtensibleEnumView = visitor.PreVisitEnum(enumType, enumProvider.ExtensibleEnumView); + } + else if (enumProvider is ExtensibleEnumProvider) + { + enumProvider.FixedEnumView = visitor.PreVisitEnum(enumType, enumProvider.FixedEnumView); + } + } + + if (enumProvider == null) + { + EnumCache.TryAdd(enumCacheKey, null); + return null; + } + + // Check to see if there is custom code that customizes the enum + enumProvider = enumProvider.CustomCodeView switch + { + { Type: { IsValueType: true, IsStruct: true } } => enumProvider.ExtensibleEnumView ?? enumProvider, + { Type: { IsValueType: true, IsStruct: false } } => enumProvider.FixedEnumView ?? enumProvider, + _ => enumProvider, + }; + + if (enumType.Access == "public") + { + CodeModelGenerator.Instance.AddTypeToKeep(enumProvider); } EnumCache.Add(enumCacheKey, enumProvider); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/DiagnosticCodes.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/DiagnosticCodes.cs index 0a2ff887845..d6a9292352f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/DiagnosticCodes.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Utilities/DiagnosticCodes.cs @@ -6,5 +6,6 @@ namespace Microsoft.TypeSpec.Generator.Utilities internal static class DiagnosticCodes { public const string BaselineContractMissing = "baseline-contract-missing"; + public const string InvalidAccessModifier = "invalid-access-modifier"; } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/InputLibraryVisitorTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/InputLibraryVisitorTests.cs index a14f7bba573..ba365ef7705 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/InputLibraryVisitorTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/InputLibraryVisitorTests.cs @@ -57,7 +57,8 @@ public void PreVisitsEnum() _mockVisitor.Object.VisitLibrary(_mockGenerator.Object.OutputLibrary); - _mockVisitor.Protected().Verify("PreVisitEnum", Times.Once(), inputEnum, ItExpr.Is(m => m.Name == EnumProvider.Create(inputEnum, null).Name)); + // enum is visited twice, one additional time for the variant created for extensible enums + _mockVisitor.Protected().Verify("PreVisitEnum", Times.Exactly(2), inputEnum, ItExpr.Is(m => m.Name == EnumProvider.Create(inputEnum, null).Name)); } [Test] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelCustomizationTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelCustomizationTests.cs index 069698a0283..ae09d2e9a53 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelCustomizationTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelCustomizationTests.cs @@ -621,9 +621,11 @@ public async Task CanChangeEnumToExtensibleEnum() [("val1", 1), ("val2", 2), ("val3", 3)], isExtensible: false ); - var enumProvider = EnumProvider.Create(inputEnum); + var enumProvider = CodeModelGenerator.Instance.TypeFactory.CreateEnum(inputEnum); - Assert.IsTrue(enumProvider.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Public | TypeSignatureModifiers.Partial | TypeSignatureModifiers.Struct | TypeSignatureModifiers.ReadOnly)); + Assert.IsNotNull(enumProvider); + Assert.IsTrue(enumProvider is ExtensibleEnumProvider); + Assert.IsTrue(enumProvider!.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Public | TypeSignatureModifiers.Partial | TypeSignatureModifiers.Struct | TypeSignatureModifiers.ReadOnly)); } [Test] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TestData/TypeFactoryTests/CreateEnum_WithCustomCodeAsExtensible_ReturnsExtensibleEnum/CustomizedEnum.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TestData/TypeFactoryTests/CreateEnum_WithCustomCodeAsExtensible_ReturnsExtensibleEnum/CustomizedEnum.cs new file mode 100644 index 00000000000..6d40d26ab37 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TestData/TypeFactoryTests/CreateEnum_WithCustomCodeAsExtensible_ReturnsExtensibleEnum/CustomizedEnum.cs @@ -0,0 +1,8 @@ +#nullable disable + +namespace Sample.SomeOtherNamespace +{ + public readonly partial struct CustomizedEnum + { + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TypeFactoryTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TypeFactoryTests.cs index bf6b4599624..557d08a7a7f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TypeFactoryTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TypeFactoryTests.cs @@ -4,8 +4,10 @@ using System; using System.Net; using System.Text.Json; +using System.Threading.Tasks; using Microsoft.TypeSpec.Generator.Input; using Microsoft.TypeSpec.Generator.Primitives; +using Microsoft.TypeSpec.Generator.Providers; using Microsoft.TypeSpec.Generator.Tests.Common; using NUnit.Framework; @@ -191,5 +193,113 @@ public void GetCleanNameSpace_ConvertsToPascalCase(string input, string expected var actual = CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(input); Assert.AreEqual(expected, actual); } + + [Test] + public async Task CreateEnum_WithVisitor_ChangesNamespaceToModels() + { + // Arrange - Create a fixed enum + var input = InputFactory.StringEnum( + "TestEnum", + [("value1", "value1"), ("value2", "value2")], + usage: InputModelTypeUsage.Input, + isExtensible: false); + + await MockHelpers.LoadMockGeneratorAsync(inputEnumTypes: [input]); + + // Create a visitor that modifies the namespace + var visitor = new NamespaceModifyingVisitor(); + CodeModelGenerator.Instance.AddVisitor(visitor); + + var enumProvider = CodeModelGenerator.Instance.TypeFactory.CreateEnum(input); + + Assert.IsNotNull(enumProvider); + Assert.IsTrue(enumProvider!.Type.Namespace.EndsWith(".SomeOtherNamespace")); + Assert.IsTrue(enumProvider is FixedEnumProvider); + Assert.IsNotNull(enumProvider.ExtensibleEnumView); + Assert.IsNull(enumProvider.CustomCodeView); + } + + [Test] + public async Task CreateEnum_WithCustomCodeAsExtensible_ReturnsExtensibleEnum() + { + // Arrange - Create a fixed enum in input + var inputEnum = InputFactory.StringEnum( + "CustomizedEnum", + [("value1", "value1"), ("value2", "value2")], + usage: InputModelTypeUsage.Input, + isExtensible: false); + + // Load compilation with custom code that changes the enum to extensible (struct) + await MockHelpers.LoadMockGeneratorAsync( + inputEnumTypes: [inputEnum], + compilation: async () => await Helpers.GetCompilationFromDirectoryAsync()); + + // Create a visitor that modifies the namespace + var visitor = new NamespaceModifyingVisitor(); + CodeModelGenerator.Instance.AddVisitor(visitor); + + var result = CodeModelGenerator.Instance.TypeFactory.CreateEnum(inputEnum); + + Assert.IsNotNull(result); + Assert.IsInstanceOf(result); + Assert.IsTrue(result!.Type.Namespace.EndsWith(".SomeOtherNamespace")); + } + + [Test] + public void CreateEnum_FixedEnumWithoutVisitorsOrCustomCode_ReturnsFixedEnum() + { + // Arrange - Create a fixed enum + var input = InputFactory.StringEnum( + "PlainFixedEnum", + [("value1", "value1"), ("value2", "value2")], + usage: InputModelTypeUsage.Input, + isExtensible: false); + + // Act - Create enum without any visitors or custom code modifications + var enumProvider = CodeModelGenerator.Instance.TypeFactory.CreateEnum(input); + + // Assert + Assert.IsNotNull(enumProvider); + Assert.IsInstanceOf(enumProvider); + Assert.IsFalse(enumProvider!.IsExtensible); + } + + [Test] + public void CreateEnum_ExtensibleEnumWithoutVisitorsOrCustomCode_ReturnsExtensibleEnum() + { + // Arrange - Create an extensible enum + var input = InputFactory.StringEnum( + "PlainExtensibleEnum", + [("value1", "value1"), ("value2", "value2")], + usage: InputModelTypeUsage.Input, + isExtensible: true); + + // Act - Create enum without any visitors or custom code modifications + var enumProvider = CodeModelGenerator.Instance.TypeFactory.CreateEnum(input); + + // Assert + Assert.IsNotNull(enumProvider); + Assert.IsInstanceOf(enumProvider); + Assert.IsTrue(enumProvider!.IsExtensible); + } + + /// + /// Test visitor that modifies enum namespaces to end with ".Models" + /// + private class NamespaceModifyingVisitor : LibraryVisitor + { + protected internal override EnumProvider? PreVisitEnum(InputEnumType enumType, EnumProvider? type) + { + if (type == null) + return type; + + // Create a new enum provider with modified namespace + // replace ".Models" with ".SomeOtherNamespace" + var updatedNamespace = type.Type.Namespace.Replace(".Models", ".SomeOtherNamespace"); + type.Update(@namespace: updatedNamespace); + + return type; + } + } } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Utilities/MethodProviderHelpersTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Utilities/MethodProviderHelpersTests.cs index 98084a7c126..9a158c9e9b7 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Utilities/MethodProviderHelpersTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Utilities/MethodProviderHelpersTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Collections.Generic; @@ -12,6 +12,13 @@ namespace Microsoft.TypeSpec.Generator.Tests.Utilities { public class MethodProviderHelpersTests { + + [SetUp] + public void Setup() + { + MockHelpers.LoadMockGenerator(); + } + [Test] public void BuildXmlDocsAddsCorrectExceptions() {