From 69ebe46f8b0714a6adeee8ed724db5afa699747c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 27 Jan 2026 20:25:26 +0000 Subject: [PATCH 1/3] Initial plan From 4d4b1c9323838adba1b24ba8d5d31a46be1077a9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 27 Jan 2026 20:40:06 +0000 Subject: [PATCH 2/3] Add regression tests for extensible string enums in collections Co-authored-by: JonathanCrd <17486462+JonathanCrd@users.noreply.github.com> --- .../MrwSerializationTypeDefinitionTests.cs | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/MrwSerializationTypeDefinitionTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/MrwSerializationTypeDefinitionTests.cs index 500b419386b..8f098c4347e 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/MrwSerializationTypeDefinitionTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/MrwSerializationTypeDefinitionTests.cs @@ -1259,5 +1259,84 @@ public void TestSerializationTypeNameMatchesModelProviderName() Assert.AreEqual($"Deserialize{model.Name}", deserializationMethod.Signature.Name, "Deserialization method name should use ModelProvider name"); } + + [Test] + public void TestArrayOfExtensibleStringEnum_UsesCorrectSerialization() + { + // Create an extensible string enum + var inputEnum = InputFactory.StringEnum( + "TestEnum", + [ + ("one", "value1"), + ("two", "value2") + ], + isExtensible: true); + + // Create a model with a collection property of the extensible enum + var properties = new List + { + InputFactory.Property("enumCollection", InputFactory.Array(inputEnum), isRequired: true) + }; + + var inputModel = InputFactory.Model("TestModel", properties: properties); + var generator = MockHelpers.LoadMockGenerator( + inputModels: () => [inputModel], + inputEnums: () => [inputEnum]); + + var model = generator.Object.OutputLibrary.TypeProviders.Single(t => t is ModelProvider) as ModelProvider; + Assert.IsNotNull(model); + var serialization = model!.SerializationProviders.Single(t => t is MrwSerializationTypeDefinition) as MrwSerializationTypeDefinition; + Assert.IsNotNull(serialization); + + // Get the serialization method + var serializationMethod = serialization!.Methods.Single(m => m.Signature.Name == "JsonModelWriteCore"); + var methodBody = serializationMethod.BodyStatements!.ToDisplayString(); + + // For extensible string enums, serialization should use ToString(), not ToSerialString() + Assert.IsTrue(methodBody.Contains("item.ToString()"), + $"Serialization of extensible string enum in collection should use ToString(). Actual: {methodBody}"); + Assert.IsFalse(methodBody.Contains("ToSerialString"), + $"Serialization of extensible string enum in collection should NOT use ToSerialString(). Actual: {methodBody}"); + } + + [Test] + public void TestArrayOfExtensibleStringEnum_UsesCorrectDeserialization() + { + // Create an extensible string enum + var inputEnum = InputFactory.StringEnum( + "TestEnum", + [ + ("one", "value1"), + ("two", "value2") + ], + isExtensible: true); + + // Create a model with a collection property of the extensible enum + var properties = new List + { + InputFactory.Property("enumCollection", InputFactory.Array(inputEnum), isRequired: true) + }; + + var inputModel = InputFactory.Model("TestModel", properties: properties); + var generator = MockHelpers.LoadMockGenerator( + inputModels: () => [inputModel], + inputEnums: () => [inputEnum]); + + var model = generator.Object.OutputLibrary.TypeProviders.Single(t => t is ModelProvider) as ModelProvider; + Assert.IsNotNull(model); + var serialization = model!.SerializationProviders.Single(t => t is MrwSerializationTypeDefinition) as MrwSerializationTypeDefinition; + Assert.IsNotNull(serialization); + + // Get the deserialization method + var deserializationMethod = serialization!.BuildDeserializationMethod(); + Assert.IsNotNull(deserializationMethod); + var methodBody = deserializationMethod.BodyStatements!.ToDisplayString(); + + // For extensible string enums, deserialization should use constructor, not ToTestEnum() extension method + Assert.IsTrue(methodBody.Contains("new global::Sample.Models.TestEnum"), + $"Deserialization of extensible string enum in collection should use constructor. Actual: {methodBody}"); + Assert.IsFalse(methodBody.Contains("ToTestEnum()"), + $"Deserialization of extensible string enum in collection should NOT use ToTestEnum() extension. Actual: {methodBody}"); + } } } From 965d4656a44d30b97a5941bce1f0f70bdf868f52 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 27 Jan 2026 20:46:03 +0000 Subject: [PATCH 3/3] Refactor tests to extract common setup into helper method Co-authored-by: JonathanCrd <17486462+JonathanCrd@users.noreply.github.com> --- .../MrwSerializationTypeDefinitionTests.cs | 39 ++++++------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/MrwSerializationTypeDefinitionTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/MrwSerializationTypeDefinitionTests.cs index 8f098c4347e..f359070317e 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/MrwSerializationTypeDefinitionTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/MrwSerializationTypeDefinitionTests.cs @@ -1260,8 +1260,7 @@ public void TestSerializationTypeNameMatchesModelProviderName() "Deserialization method name should use ModelProvider name"); } - [Test] - public void TestArrayOfExtensibleStringEnum_UsesCorrectSerialization() + private static MrwSerializationTypeDefinition CreateModelWithExtensibleStringEnumCollection() { // Create an extensible string enum var inputEnum = InputFactory.StringEnum( @@ -1287,9 +1286,16 @@ public void TestArrayOfExtensibleStringEnum_UsesCorrectSerialization() Assert.IsNotNull(model); var serialization = model!.SerializationProviders.Single(t => t is MrwSerializationTypeDefinition) as MrwSerializationTypeDefinition; Assert.IsNotNull(serialization); + return serialization!; + } + + [Test] + public void TestArrayOfExtensibleStringEnum_UsesCorrectSerialization() + { + var serialization = CreateModelWithExtensibleStringEnumCollection(); // Get the serialization method - var serializationMethod = serialization!.Methods.Single(m => m.Signature.Name == "JsonModelWriteCore"); + var serializationMethod = serialization.Methods.Single(m => m.Signature.Name == "JsonModelWriteCore"); var methodBody = serializationMethod.BodyStatements!.ToDisplayString(); // For extensible string enums, serialization should use ToString(), not ToSerialString() @@ -1302,33 +1308,10 @@ public void TestArrayOfExtensibleStringEnum_UsesCorrectSerialization() [Test] public void TestArrayOfExtensibleStringEnum_UsesCorrectDeserialization() { - // Create an extensible string enum - var inputEnum = InputFactory.StringEnum( - "TestEnum", - [ - ("one", "value1"), - ("two", "value2") - ], - isExtensible: true); - - // Create a model with a collection property of the extensible enum - var properties = new List - { - InputFactory.Property("enumCollection", InputFactory.Array(inputEnum), isRequired: true) - }; - - var inputModel = InputFactory.Model("TestModel", properties: properties); - var generator = MockHelpers.LoadMockGenerator( - inputModels: () => [inputModel], - inputEnums: () => [inputEnum]); - - var model = generator.Object.OutputLibrary.TypeProviders.Single(t => t is ModelProvider) as ModelProvider; - Assert.IsNotNull(model); - var serialization = model!.SerializationProviders.Single(t => t is MrwSerializationTypeDefinition) as MrwSerializationTypeDefinition; - Assert.IsNotNull(serialization); + var serialization = CreateModelWithExtensibleStringEnumCollection(); // Get the deserialization method - var deserializationMethod = serialization!.BuildDeserializationMethod(); + var deserializationMethod = serialization.BuildDeserializationMethod(); Assert.IsNotNull(deserializationMethod); var methodBody = deserializationMethod.BodyStatements!.ToDisplayString();