Skip to content

Commit

Permalink
[C#] fix anyof, oneof mixed primitive object parse error (#17986)
Browse files Browse the repository at this point in the history
* Update csharp oneOf and anyOf mustache templates to accept primitive, object, and array types when deserializing

 Add bug openapi spec

Remove generated files

Add test endpoints

Generate base on spec

Remove issue spec as it is moved into sample test spec

Add back in number and int

Round trip anyOf/oneOf serialization tests

Generate classes with int/num types

Do through converter instead of object ctor

Regen models

Use convert methods

Regen models

Test data

Add enum

Remove enums

Regenned models

* update sha256

* use new spec

* skip tests

* update workflow

* fix

---------

Co-authored-by: Ruben Aguilar <ruben.aguilar@forgeglobal.com>
  • Loading branch information
wing328 and ForgeRubenAguilar committed Feb 29, 2024
1 parent c10c914 commit d4e1050
Show file tree
Hide file tree
Showing 293 changed files with 19,281 additions and 520 deletions.
8 changes: 5 additions & 3 deletions .github/workflows/samples-dotnet-standard.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ jobs:
- name: Build
working-directory: ${{ matrix.sample }}
run: dotnet build Org.OpenAPITools.sln
- name: Test
working-directory: ${{ matrix.sample }}
run: dotnet test Org.OpenAPITools.sln
# skip tests as petstore server it not running
# these tests are run in appveyor instead
#- name: Test
# working-directory: ${{ matrix.sample }}
# run: dotnet test Org.OpenAPITools.sln
2 changes: 1 addition & 1 deletion .github/workflows/samples-dotnet.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
- samples/client/petstore/csharp/OpenAPIClient-generichost-manual-tests
- samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0
- samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-nrt
- samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-useSourceGeneration
- samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-nrt-useSourceGeneration
- samples/client/petstore/csharp/OpenAPIClient-generichost-net7.0-useDateTimeForDate
- samples/client/petstore/csharp/OpenAPIClient-generichost-netcore-latest-allOf
- samples/client/petstore/csharp/OpenAPIClient-generichost-netcore-latest-anyOf
Expand Down
2 changes: 1 addition & 1 deletion bin/configs/csharp-restsharp-net4.7.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# for .net standard
generatorName: csharp
outputDir: samples/client/petstore/csharp/OpenAPIClient-net47
inputSpec: modules/openapi-generator/src/test/resources/3_0/csharp/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml
inputSpec: modules/openapi-generator/src/test/resources/3_0/csharp/petstore-with-fake-endpoints-models-for-testing-with-http-signature-oneof-primitive-types.yaml
templateDir: modules/openapi-generator/src/main/resources/csharp
additionalProperties:
packageGuid: '{321C8C3F-0156-40C1-AE42-D59761FB9B6C}'
Expand Down
2 changes: 1 addition & 1 deletion bin/configs/csharp-restsharp-net4.8.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# for .net standard
generatorName: csharp
outputDir: samples/client/petstore/csharp/OpenAPIClient-net48
inputSpec: modules/openapi-generator/src/test/resources/3_0/csharp/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml
inputSpec: modules/openapi-generator/src/test/resources/3_0/csharp/petstore-with-fake-endpoints-models-for-testing-with-http-signature-oneof-primitive-types.yaml
templateDir: modules/openapi-generator/src/main/resources/csharp
additionalProperties:
packageGuid: '{321C8C3F-0156-40C1-AE42-D59761FB9B6C}'
Expand Down
2 changes: 1 addition & 1 deletion bin/configs/csharp-restsharp-net7.0.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# for .net standard
generatorName: csharp
outputDir: samples/client/petstore/csharp/OpenAPIClient-net5.0
inputSpec: modules/openapi-generator/src/test/resources/3_0/csharp/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml
inputSpec: modules/openapi-generator/src/test/resources/3_0/csharp/petstore-with-fake-endpoints-models-for-testing-with-http-signature-oneof-primitive-types.yaml
templateDir: modules/openapi-generator/src/main/resources/csharp
additionalProperties:
packageGuid: '{321C8C3F-0156-40C1-AE42-D59761FB9B6C}'
Expand Down
2 changes: 1 addition & 1 deletion bin/configs/csharp-restsharp-netstandard2.0.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# for .net standard
generatorName: csharp
outputDir: samples/client/petstore/csharp/OpenAPIClient
inputSpec: modules/openapi-generator/src/test/resources/3_0/csharp/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml
inputSpec: modules/openapi-generator/src/test/resources/3_0/csharp/petstore-with-fake-endpoints-models-for-testing-with-http-signature-oneof-primitive-types.yaml
templateDir: modules/openapi-generator/src/main/resources/csharp
additionalProperties:
packageGuid: '{321C8C3F-0156-40C1-AE42-D59761FB9B6C}'
Expand Down
2 changes: 1 addition & 1 deletion bin/utils/test_file_list.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
# csharp test files and image for upload
- filename: "samples/client/petstore/csharp/OpenAPIClient/src/Org.OpenAPITools.Test/JSONComposedSchemaTests.cs"
sha256: 054adb6efaff70f492e471cb3e4d628d22cda814906808fd3fcce36ce710b7ee
sha256: e323c7e646a0ceb6d1d8f34f287175ac666fdbbe057791b45d138de3d9582666
- filename: "samples/client/petstore/csharp/OpenAPIClient/src/Org.OpenAPITools.Test/Api/PetApiTests.cs"
sha256: 7dad88554fe630d25c787cae05305d302d5e34ca810aee4fa23f20055f9188e1
- filename: "samples/client/petstore/csharp/OpenAPIClient/src/Org.OpenAPITools.Test/linux-logo.png"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,11 +208,37 @@
/// <returns>The object converted from the JSON string</returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if(reader.TokenType != JsonToken.Null)
switch(reader.TokenType)
{
return {{classname}}.FromJson(JObject.Load(reader).ToString(Formatting.None));
{{#anyOf}}
{{#isInteger}}
case JsonToken.Integer:
return new {{classname}}(Convert.ToInt32(reader.Value));
{{/isInteger}}
{{#isNumber}}
case JsonToken.Float:
return new {{classname}}(Convert.ToDecimal(reader.Value));
{{/isNumber}}
{{#isString}}
case JsonToken.String:
return new {{classname}}(Convert.ToString(reader.Value));
{{/isString}}
{{#isBoolean}}
case JsonToken.Boolean:
return new {{classname}}(Convert.ToBoolean(reader.Value));
{{/isBoolean}}
{{#isDate}}
case JsonToken.Date:
return new {{classname}}(Convert.ToDateTime(reader.Value));
{{/isDate}}
{{/anyOf}}
case JsonToken.StartObject:
return {{classname}}.FromJson(JObject.Load(reader).ToString(Formatting.None));
case JsonToken.StartArray:
return {{classname}}.FromJson(JArray.Load(reader).ToString(Formatting.None));
default:
return null;
}
return null;
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,11 +245,37 @@
/// <returns>The object converted from the JSON string</returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if(reader.TokenType != JsonToken.Null)
switch(reader.TokenType)
{
return {{classname}}.FromJson(JObject.Load(reader).ToString(Formatting.None));
{{#oneOf}}
{{#isInteger}}
case JsonToken.Integer:
return new {{classname}}(Convert.ToInt32(reader.Value));
{{/isInteger}}
{{#isNumber}}
case JsonToken.Float:
return new {{classname}}(Convert.ToDecimal(reader.Value));
{{/isNumber}}
{{#isString}}
case JsonToken.String:
return new {{classname}}(Convert.ToString(reader.Value));
{{/isString}}
{{#isBoolean}}
case JsonToken.Boolean:
return new {{classname}}(Convert.ToBoolean(reader.Value));
{{/isBoolean}}
{{#isDate}}
case JsonToken.Date:
return new {{classname}}(Convert.ToDateTime(reader.Value));
{{/isDate}}
{{/oneOf}}
case JsonToken.StartObject:
return {{classname}}.FromJson(JObject.Load(reader).ToString(Formatting.None));
case JsonToken.StartArray:
return {{classname}}.FromJson(JArray.Load(reader).ToString(Formatting.None));
default:
return null;
}
return null;
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,11 +227,39 @@
/// <returns>The object converted from the JSON string</returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if(reader.TokenType != JsonToken.Null)
switch(reader.TokenType)
{
return {{classname}}.FromJson(JObject.Load(reader).ToString(Formatting.None));
{{#composedSchemas.anyOf}}
{{^vendorExtensions.x-duplicated-data-type}}
{{#isInteger}}
case JsonToken.Integer:
return new {{classname}}(Convert.ToInt32(reader.Value));
{{/isInteger}}
{{#isNumber}}
case JsonToken.Float:
return new {{classname}}(Convert.ToDecimal(reader.Value));
{{/isNumber}}
{{#isString}}
case JsonToken.String:
return new {{classname}}(Convert.ToString(reader.Value));
{{/isString}}
{{#isBoolean}}
case JsonToken.Boolean:
return new {{classname}}(Convert.ToBoolean(reader.Value));
{{/isBoolean}}
{{#isDate}}
case JsonToken.Date:
return new {{classname}}(Convert.ToDateTime(reader.Value));
{{/isDate}}
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.anyOf}}
case JsonToken.StartObject:
return {{classname}}.FromJson(JObject.Load(reader).ToString(Formatting.None));
case JsonToken.StartArray:
return {{classname}}.FromJson(JArray.Load(reader).ToString(Formatting.None));
default:
return null;
}
return null;
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,11 +272,39 @@
/// <returns>The object converted from the JSON string</returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if(reader.TokenType != JsonToken.Null)
switch(reader.TokenType)
{
return {{classname}}.FromJson(JObject.Load(reader).ToString(Formatting.None));
{{#composedSchemas.oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
{{#isInteger}}
case JsonToken.Integer:
return new {{classname}}(Convert.ToInt32(reader.Value));
{{/isInteger}}
{{#isNumber}}
case JsonToken.Float:
return new {{classname}}(Convert.ToDecimal(reader.Value));
{{/isNumber}}
{{#isString}}
case JsonToken.String:
return new {{classname}}(Convert.ToString(reader.Value));
{{/isString}}
{{#isBoolean}}
case JsonToken.Boolean:
return new {{classname}}(Convert.ToBoolean(reader.Value));
{{/isBoolean}}
{{#isDate}}
case JsonToken.Date:
return new {{classname}}(Convert.ToDateTime(reader.Value));
{{/isDate}}
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.oneOf}}
case JsonToken.StartObject:
return {{classname}}.FromJson(JObject.Load(reader).ToString(Formatting.None));
case JsonToken.StartArray:
return {{classname}}.FromJson(JArray.Load(reader).ToString(Formatting.None));
default:
return null;
}
return null;
}

/// <summary>
Expand Down
Loading

0 comments on commit d4e1050

Please sign in to comment.