diff --git a/modules/openapi-generator/src/main/resources/csharp/modelEnum.mustache b/modules/openapi-generator/src/main/resources/csharp/modelEnum.mustache index 96b408d8d37e..63a6a43f7325 100644 --- a/modules/openapi-generator/src/main/resources/csharp/modelEnum.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/modelEnum.mustache @@ -62,7 +62,13 @@ {{/enumVars}} {{/allowableValues}} + {{#enumUnknownDefaultCase}} + // Unknown values map to the unknown default member + return {{#allowableValues}}{{#enumVars}}{{#-last}}{{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}.{{name}}{{/-last}}{{/enumVars}}{{/allowableValues}}; + {{/enumUnknownDefaultCase}} + {{^enumUnknownDefaultCase}} throw new NotImplementedException($"Could not convert value to type {{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}: '{value}'"); + {{/enumUnknownDefaultCase}} } /// @@ -79,7 +85,13 @@ {{/enumVars}} {{/allowableValues}} + {{#enumUnknownDefaultCase}} + // Unknown values map to the unknown default member + return {{#allowableValues}}{{#enumVars}}{{#-last}}{{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}.{{name}}{{/-last}}{{/enumVars}}{{/allowableValues}}; + {{/enumUnknownDefaultCase}} + {{^enumUnknownDefaultCase}} return null; + {{/enumUnknownDefaultCase}} } /// diff --git a/modules/openapi-generator/src/main/resources/csharp/modelInnerEnum.mustache b/modules/openapi-generator/src/main/resources/csharp/modelInnerEnum.mustache index 90e2d9b3a583..310998609646 100644 --- a/modules/openapi-generator/src/main/resources/csharp/modelInnerEnum.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/modelInnerEnum.mustache @@ -46,7 +46,13 @@ {{/enumVars}} {{/allowableValues}} + {{#enumUnknownDefaultCase}} + // Unknown values map to the unknown default member + return {{#allowableValues}}{{#enumVars}}{{#-last}}{{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}.{{name}}{{/-last}}{{/enumVars}}{{/allowableValues}}; + {{/enumUnknownDefaultCase}} + {{^enumUnknownDefaultCase}} throw new NotImplementedException($"Could not convert value to type {{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}: '{value}'"); + {{/enumUnknownDefaultCase}} } /// @@ -63,7 +69,13 @@ {{/enumVars}} {{/allowableValues}} + {{#enumUnknownDefaultCase}} + // Unknown values map to the unknown default member + return {{#allowableValues}}{{#enumVars}}{{#-last}}{{datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}.{{name}}{{/-last}}{{/enumVars}}{{/allowableValues}}; + {{/enumUnknownDefaultCase}} + {{^enumUnknownDefaultCase}} return null; + {{/enumUnknownDefaultCase}} } /// diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpClientCodegenTest.java index 1b1d8e5a84fe..248d1167c777 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpClientCodegenTest.java @@ -122,6 +122,44 @@ public void testGenericHostInjectedDateFormatOverridesProperty() throws IOExcept ".CreatedAtOption.Value!.Value.ToString(CreatedAtFormat, global::System.Globalization.CultureInfo.InvariantCulture)"); } + @Test + public void testGenericHostEnumUnknownDefaultCaseMapsUnknownValues() throws IOException { + OpenAPI openAPI = new OpenAPI().components(new Components() + .addSchemas("Color", new StringSchema()._enum(List.of("red", "green"))) + .addSchemas("Pet", new ObjectSchema() + .addProperty("status", new StringSchema()._enum(List.of("available", "sold"))) + .addProperty("color", new Schema<>().$ref("#/components/schemas/Color")))); + + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + DefaultGenerator generator = new DefaultGenerator(); + ClientOptInput input = new ClientOptInput().openAPI(openAPI); + CSharpClientCodegen codegen = new CSharpClientCodegen(); + codegen.setLibrary("generichost"); + codegen.setOutputDir(output.getAbsolutePath()); + codegen.additionalProperties().put(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, "true"); + input.config(codegen); + + Map files = generator.opts(input).generate().stream() + .collect(Collectors.toMap(File::getPath, Function.identity())); + File pet = getGeneratedModel(files, output, "Pet"); + File color = getGeneratedModel(files, output, "Color"); + + // FromString and FromStringOrDefault both end by returning the unknown default member + String returnsUnknown = "\\(string value\\)\\s*\\{[^}]*" + + "return %s\\.UnknownDefaultOpenApi;\\s*\\}"; + String statusReturnsUnknown = String.format(returnsUnknown, "StatusEnum"); + String colorReturnsUnknown = String.format(returnsUnknown, "Color"); + assertThat(Files.readString(pet.toPath())) + .containsPattern("StatusEnumFromString" + statusReturnsUnknown) + .containsPattern("StatusEnumFromStringOrDefault" + statusReturnsUnknown); + assertFileNotContains(pet.toPath(), "Could not convert value to type StatusEnum"); + assertThat(Files.readString(color.toPath())) + .containsPattern(" FromString" + colorReturnsUnknown) + .containsPattern(" FromStringOrDefault" + colorReturnsUnknown); + assertFileNotContains(color.toPath(), "Could not convert value to type Color"); + } + @Test public void testGenericHostOneOfConstructorsRespectApiVisibility() throws IOException { Map publicModels = generateIssue23046Models(false);