Skip to content

Commit bee8b61

Browse files
authored
[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
1 parent 84a6e31 commit bee8b61

2 files changed

Lines changed: 44 additions & 0 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,22 @@ public Map<String, Object> postProcessAllModels(Map<String, Object> objs) {
437437
return processed;
438438
}
439439

440+
@Override
441+
protected List<Map<String, Object>> buildEnumVars(List<Object> values, String dataType) {
442+
List<Map<String, Object>> enumVars = super.buildEnumVars(values, dataType);
443+
444+
// this is needed for enumRefs like OuterEnum marked as nullable and also have string values
445+
// keep isString true so that the index will be used as the enum value instead of a string
446+
// this is inline with C# enums with string values
447+
if ("string?".equals(dataType)){
448+
enumVars.forEach((enumVar) -> {
449+
enumVar.put("isString", true);
450+
});
451+
}
452+
453+
return enumVars;
454+
}
455+
440456
/**
441457
* C# differs from other languages in that Enums are not _true_ objects; enums are compiled to integral types.
442458
* So, in C#, an enum is considers more like a user-defined primitive.

modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CSharpModelTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,42 @@
2626
import org.openapitools.codegen.CodegenProperty;
2727
import org.openapitools.codegen.DefaultCodegen;
2828
import org.openapitools.codegen.TestUtils;
29+
import org.openapitools.codegen.languages.AbstractCSharpCodegen;
2930
import org.openapitools.codegen.languages.AspNetCoreServerCodegen;
31+
import org.openapitools.codegen.languages.CSharpNetCoreClientCodegen;
3032
import org.openapitools.codegen.languages.CSharpClientCodegen;
3133
import org.testng.Assert;
3234
import org.testng.annotations.Test;
3335

3436
@SuppressWarnings("static-method")
3537
public class CSharpModelTest {
3638

39+
@Test
40+
public void assertOuterEnumIsString() {
41+
// this issue has not been found yet in version 2
42+
// Assert.assertEquals(outerEnumVarsIsString(new AspNetCoreServerCodegen(), 2, false), true);
43+
// Assert.assertEquals(outerEnumVarsIsString(new AspNetCoreServerCodegen(), 2, true), true);
44+
Assert.assertEquals(outerEnumVarsIsString(new AspNetCoreServerCodegen(), 3, false), true);
45+
Assert.assertEquals(outerEnumVarsIsString(new AspNetCoreServerCodegen(), 3, true), true);
46+
47+
// this issue has not been found yet in version 2
48+
// Assert.assertEquals(outerEnumVarsIsString(new CSharpNetCoreClientCodegen(), 2, false), true);
49+
// Assert.assertEquals(outerEnumVarsIsString(new CSharpNetCoreClientCodegen(), 2, true), true);
50+
Assert.assertEquals(outerEnumVarsIsString(new CSharpNetCoreClientCodegen(), 3, false), true);
51+
Assert.assertEquals(outerEnumVarsIsString(new CSharpNetCoreClientCodegen(), 3, true), true);
52+
}
53+
54+
public boolean outerEnumVarsIsString(final AbstractCSharpCodegen codegen, final int openApiVersion, final Boolean nullableReferenceTypes){
55+
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/" + Integer.toString(openApiVersion) + "_0/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml");
56+
codegen.setNullableReferenceTypes(nullableReferenceTypes);
57+
codegen.setOpenAPI(openAPI);
58+
Schema schema = openAPI.getComponents().getSchemas().get("Enum_Test");
59+
final CodegenModel generated = codegen.fromModel("OuterEnum", schema);
60+
61+
CodegenProperty cp0 = generated.getVars().get(0);
62+
return cp0.isString;
63+
}
64+
3765
@Test(description = "convert a model with array property to default List<T>")
3866
public void arrayPropertyTest() {
3967
final Schema schema = getArrayTestSchema();

0 commit comments

Comments
 (0)