From ef4c0b739f31893cd1320bc1e55c4f9dbc746eea Mon Sep 17 00:00:00 2001 From: Debajyoti Halder Date: Wed, 5 Jan 2022 01:45:41 +0530 Subject: [PATCH] fix: special cases in enum values for C# generator --- .../csharp/renderers/EnumRenderer.ts | 3 +- .../generators/csharp/CSharpGenerator.spec.ts | 29 ++++++-- .../CSharpGenerator.spec.ts.snap | 70 +++++++++++++++++++ 3 files changed, 97 insertions(+), 5 deletions(-) diff --git a/src/generators/csharp/renderers/EnumRenderer.ts b/src/generators/csharp/renderers/EnumRenderer.ts index c6bd978a50..75dd17504c 100644 --- a/src/generators/csharp/renderers/EnumRenderer.ts +++ b/src/generators/csharp/renderers/EnumRenderer.ts @@ -1,6 +1,7 @@ import { CSharpRenderer } from '../CSharpRenderer'; import { EnumPreset } from '../../../models'; import { pascalCase } from 'change-case'; +import { FormatHelpers } from '../../../helpers'; /** * Renderer for C#'s `enum` type @@ -107,7 +108,7 @@ export const CSHARP_DEFAULT_ENUM_PRESET: EnumPreset = { return renderer.defaultSelf(); }, item({ item }) { - let itemName = String(item); + let itemName = FormatHelpers.replaceSpecialCharacters(String(item), { exclude: [' '], separator: '_' }); if (typeof item === 'number' || typeof item === 'bigint') { itemName = `Number_${itemName}`; } else if (typeof item === 'object') { diff --git a/test/generators/csharp/CSharpGenerator.spec.ts b/test/generators/csharp/CSharpGenerator.spec.ts index f33fbdda12..a9e647a786 100644 --- a/test/generators/csharp/CSharpGenerator.spec.ts +++ b/test/generators/csharp/CSharpGenerator.spec.ts @@ -129,6 +129,25 @@ describe('CSharpGenerator', () => { enum: ['Texas', 'Alabama', 'California'], }; + const inputModel = await generator.process(doc); + const model = inputModel.models['CustomEnum']; + + let enumModel = await generator.render(model, inputModel); + expect(enumModel.result).toMatchSnapshot(); + expect(enumModel.dependencies).toEqual([]); + + enumModel = await generator.renderEnum(model, inputModel); + expect(enumModel.result).toMatchSnapshot(); + expect(enumModel.dependencies).toEqual([]); + }); + + test('should render enums with translated special characters', async () => { + const doc = { + $id: 'States', + type: 'string', + enum: ['test+', 'test', 'test-', 'test?!', '*test'] + }; + generator = new CSharpGenerator({ presets: [ { enum: { @@ -137,19 +156,20 @@ describe('CSharpGenerator', () => { }, } } - ] }); + ]}); const inputModel = await generator.process(doc); - const model = inputModel.models['CustomEnum']; - + const model = inputModel.models['States']; + let enumModel = await generator.render(model, inputModel); expect(enumModel.result).toMatchSnapshot(); expect(enumModel.dependencies).toEqual([]); - + enumModel = await generator.renderEnum(model, inputModel); expect(enumModel.result).toMatchSnapshot(); expect(enumModel.dependencies).toEqual([]); }); + test('should render models and their dependencies', async () => { const doc = { $id: 'Address', @@ -177,6 +197,7 @@ describe('CSharpGenerator', () => { expect(models[0].result).toMatchSnapshot(); expect(models[1].result).toMatchSnapshot(); }); + test('should throw error when reserved keyword is used for package name', async () => { const doc = { $id: 'Address', diff --git a/test/generators/csharp/__snapshots__/CSharpGenerator.spec.ts.snap b/test/generators/csharp/__snapshots__/CSharpGenerator.spec.ts.snap index db1f0d2cd5..d20b4fa11a 100644 --- a/test/generators/csharp/__snapshots__/CSharpGenerator.spec.ts.snap +++ b/test/generators/csharp/__snapshots__/CSharpGenerator.spec.ts.snap @@ -320,6 +320,76 @@ public static class StatesExtensions { " `; +exports[`CSharpGenerator should render enums with translated special characters 1`] = ` +"public enum States { + TestPlus, Test, TestMinus, TestQuestionExclamation, AsteriskTest +} +public static class StatesExtensions { + public static dynamic GetValue(this States enumValue) + { + switch (enumValue) + { + case States.TestPlus: return \\"test+\\"; + case States.Test: return \\"test\\"; + case States.TestMinus: return \\"test-\\"; + case States.TestQuestionExclamation: return \\"test?!\\"; + case States.AsteriskTest: return \\"*test\\"; + } + return null; + } + + public static States? ToStates(dynamic value) + { + switch (value) + { + case \\"test+\\": return States.TestPlus; + case \\"test\\": return States.Test; + case \\"test-\\": return States.TestMinus; + case \\"test?!\\": return States.TestQuestionExclamation; + case \\"*test\\": return States.AsteriskTest; + } + return null; + } +} + +" +`; + +exports[`CSharpGenerator should render enums with translated special characters 2`] = ` +"public enum States { + TestPlus, Test, TestMinus, TestQuestionExclamation, AsteriskTest +} +public static class StatesExtensions { + public static dynamic GetValue(this States enumValue) + { + switch (enumValue) + { + case States.TestPlus: return \\"test+\\"; + case States.Test: return \\"test\\"; + case States.TestMinus: return \\"test-\\"; + case States.TestQuestionExclamation: return \\"test?!\\"; + case States.AsteriskTest: return \\"*test\\"; + } + return null; + } + + public static States? ToStates(dynamic value) + { + switch (value) + { + case \\"test+\\": return States.TestPlus; + case \\"test\\": return States.Test; + case \\"test-\\": return States.TestMinus; + case \\"test?!\\": return States.TestQuestionExclamation; + case \\"*test\\": return States.AsteriskTest; + } + return null; + } +} + +" +`; + exports[`CSharpGenerator should render models and their dependencies 1`] = ` "namespace Test.Package {