diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 0778fd527bba..ba9267db51b3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -6330,7 +6330,7 @@ protected List> buildEnumVars(List values, String da String commonPrefix = findCommonPrefixOfVars(values); truncateIdx = commonPrefix.length(); } - + Map uniqueNames = new HashMap<>(); for (Object value : values) { Map enumVar = new HashMap<>(); String enumName; @@ -6342,8 +6342,8 @@ protected List> buildEnumVars(List values, String da enumName = value.toString(); } } - - enumVar.put("name", toEnumVarName(enumName, dataType)); + String varName = toEnumVarName(enumName, dataType); + enumVar.put("name", ensureUniqueName(uniqueNames, varName)); enumVar.put("value", toEnumValue(String.valueOf(value), dataType)); enumVar.put("isString", isDataTypeString(dataType)); enumVars.add(enumVar); @@ -6377,6 +6377,19 @@ protected List> buildEnumVars(List values, String da return enumVars; } + /** + * If necessary, appends a suffix to enforce uniqueness of names within a namespace. + * @param uniqueNames Counts name occurrences within a namespace. + * @param name The proposed name. + * @return name, uniquely suffixed as necessary. + */ + protected String ensureUniqueName(Map uniqueNames, String name) { + int count = uniqueNames.getOrDefault(name, 0) + 1 ; + if (uniqueNames.put(name, count) != null) + name = name + '_' + count; + return name; + } + protected void updateEnumVarsWithExtensions(List> enumVars, Map vendorExtensions, String dataType) { if (vendorExtensions != null) { updateEnumVarsWithExtensions(enumVars, vendorExtensions, "x-enum-varnames", "name"); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 95dc96332992..119081de929c 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -789,6 +789,53 @@ public void updateCodegenPropertyEnumWithoutPrefixRemoved() { Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\""); } + + @Test + public void updateCodegenPropertyEnumWithMultiByteChars() { + { + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setRemoveEnumValuePrefix(false); + + CodegenProperty enumProperty = codegenProperty(Arrays.asList("猫", "Пёс", "Χάμστερ")); + + codegen.updateCodegenPropertyEnum(enumProperty); + + List> enumVars = (List>) enumProperty.getItems().getAllowableValues().get("enumVars"); + + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "_"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"猫\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "__2"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"Пёс\""); + Assert.assertNotNull(enumVars.get(2)); + Assert.assertEquals(enumVars.get(2).getOrDefault("name", ""), "__3"); + Assert.assertEquals(enumVars.get(2).getOrDefault("value", ""), "\"Χάμστερ\""); + } + { + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setRemoveEnumValuePrefix(false); + + CodegenProperty enumProperty = codegenProperty(Arrays.asList("1ый квартал", "1ый день", "1ая смена")); + + codegen.updateCodegenPropertyEnum(enumProperty); + + List> enumVars = (List>) enumProperty.getItems().getAllowableValues().get("enumVars"); + + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "_1_"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"1ый квартал\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "_1__2"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"1ый день\""); + Assert.assertNotNull(enumVars.get(2)); + Assert.assertEquals(enumVars.get(2).getOrDefault("name", ""), "_1__3"); + Assert.assertEquals(enumVars.get(2).getOrDefault("value", ""), "\"1ая смена\""); + } + } + @Test public void postProcessModelsEnumWithPrefixRemoved() { final DefaultCodegen codegen = new DefaultCodegen(); @@ -846,6 +893,48 @@ public void postProcessModelsEnumWithExtension() { Assert.assertEquals(enumVars.get(1).getOrDefault("enumDescription", ""), "This is a cat"); } + @Test + public void postProcessModelsEnumWithMultiByteChars() { + { + final DefaultCodegen codegen = new DefaultCodegen(); + ModelsMap objs = codegenModel(Arrays.asList("猫", "Пёс", "Χάμστερ")); + CodegenModel cm = objs.getModels().get(0).getModel(); + + codegen.postProcessModelsEnum(objs); + + List> enumVars = (List>) cm.getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "_"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"猫\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "__2"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"Пёс\""); + Assert.assertNotNull(enumVars.get(2)); + Assert.assertEquals(enumVars.get(2).getOrDefault("name", ""), "__3"); + Assert.assertEquals(enumVars.get(2).getOrDefault("value", ""), "\"Χάμστερ\""); + } + { + final DefaultCodegen codegen = new DefaultCodegen(); + ModelsMap objs = codegenModel(Arrays.asList("1ый квартал", "1ый день", "1ая смена")); + CodegenModel cm = objs.getModels().get(0).getModel(); + + codegen.postProcessModelsEnum(objs); + + List> enumVars = (List>) cm.getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "_1_"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"1ый квартал\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "_1__2"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"1ый день\""); + Assert.assertNotNull(enumVars.get(2)); + Assert.assertEquals(enumVars.get(2).getOrDefault("name", ""), "_1__3"); + Assert.assertEquals(enumVars.get(2).getOrDefault("value", ""), "\"1ая смена\""); + } + } + @Test public void testExample1() { final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/examples.yaml");