From bee8b615a5c429bcefd2d69762aa629f1a81947e Mon Sep 17 00:00:00 2001 From: devhl-labs Date: Sun, 22 Aug 2021 11:40:46 -0400 Subject: [PATCH] [abstract csharp] Ensure enum dataType is not nullable string (#9891) * ensure enum cannot be a nullable string * build samples * removed errounous changes meant for another pr * build samples * build samples * reordered test parameters for readability * build samples * deleted eroneous sample files --- .../languages/AbstractCSharpCodegen.java | 16 +++++++++++ .../codegen/csharp/CSharpModelTest.java | 28 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java index 7093997f0b9..c162b753d9a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java @@ -437,6 +437,22 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co return processed; } + @Override + protected List> buildEnumVars(List values, String dataType) { + List> enumVars = super.buildEnumVars(values, dataType); + + // this is needed for enumRefs like OuterEnum marked as nullable and also have string values + // keep isString true so that the index will be used as the enum value instead of a string + // this is inline with C# enums with string values + if ("string?".equals(dataType)){ + enumVars.forEach((enumVar) -> { + enumVar.put("isString", true); + }); + } + + return enumVars; + } + /** * C# differs from other languages in that Enums are not _true_ objects; enums are compiled to integral types. * So, in C#, an enum is considers more like a user-defined primitive. diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CSharpModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CSharpModelTest.java index 5384570b9d1..58ab3d67bfd 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CSharpModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CSharpModelTest.java @@ -26,7 +26,9 @@ import org.openapitools.codegen.CodegenModel; import org.openapitools.codegen.CodegenProperty; import org.openapitools.codegen.DefaultCodegen; import org.openapitools.codegen.TestUtils; +import org.openapitools.codegen.languages.AbstractCSharpCodegen; import org.openapitools.codegen.languages.AspNetCoreServerCodegen; +import org.openapitools.codegen.languages.CSharpNetCoreClientCodegen; import org.openapitools.codegen.languages.CSharpClientCodegen; import org.testng.Assert; import org.testng.annotations.Test; @@ -34,6 +36,32 @@ import org.testng.annotations.Test; @SuppressWarnings("static-method") public class CSharpModelTest { + @Test + public void assertOuterEnumIsString() { + // this issue has not been found yet in version 2 + // Assert.assertEquals(outerEnumVarsIsString(new AspNetCoreServerCodegen(), 2, false), true); + // Assert.assertEquals(outerEnumVarsIsString(new AspNetCoreServerCodegen(), 2, true), true); + Assert.assertEquals(outerEnumVarsIsString(new AspNetCoreServerCodegen(), 3, false), true); + Assert.assertEquals(outerEnumVarsIsString(new AspNetCoreServerCodegen(), 3, true), true); + + // this issue has not been found yet in version 2 + // Assert.assertEquals(outerEnumVarsIsString(new CSharpNetCoreClientCodegen(), 2, false), true); + // Assert.assertEquals(outerEnumVarsIsString(new CSharpNetCoreClientCodegen(), 2, true), true); + Assert.assertEquals(outerEnumVarsIsString(new CSharpNetCoreClientCodegen(), 3, false), true); + Assert.assertEquals(outerEnumVarsIsString(new CSharpNetCoreClientCodegen(), 3, true), true); + } + + public boolean outerEnumVarsIsString(final AbstractCSharpCodegen codegen, final int openApiVersion, final Boolean nullableReferenceTypes){ + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/" + Integer.toString(openApiVersion) + "_0/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml"); + codegen.setNullableReferenceTypes(nullableReferenceTypes); + codegen.setOpenAPI(openAPI); + Schema schema = openAPI.getComponents().getSchemas().get("Enum_Test"); + final CodegenModel generated = codegen.fromModel("OuterEnum", schema); + + CodegenProperty cp0 = generated.getVars().get(0); + return cp0.isString; + } + @Test(description = "convert a model with array property to default List") public void arrayPropertyTest() { final Schema schema = getArrayTestSchema();