Skip to content

Commit 69119bb

Browse files
committed
Address comments
1 parent 6ee0df1 commit 69119bb

2 files changed

Lines changed: 37 additions & 16 deletions

File tree

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -547,14 +547,20 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
547547
writer.WriteOptionalCollection(OpenApiConstants.AnyOf, effectiveAnyOf, callback);
548548

549549
// oneOf
550-
if (hasOneOfNullAndSingleEnumWith3_0 &&
551-
effectiveOneOf![0] is OpenApiSchema { Enum.Count: > 0 } singleEffectiveOneOf)
550+
if (hasOneOfNullAndSingleEnumWith3_0)
552551
{
553-
writer.WriteRequiredCollection(OpenApiConstants.OneOf, effectiveOneOf, (writer, element) =>
554-
{
555-
var clonedToMutateEnum = (OpenApiSchema)((OpenApiSchema)element).MemberwiseClone();
556-
clonedToMutateEnum.Enum = [.. clonedToMutateEnum.Enum!, null!];
557-
callback(writer, clonedToMutateEnum);
552+
writer.WriteRequiredCollection(OpenApiConstants.OneOf, effectiveOneOf!, (writer, element) =>
553+
{
554+
var clonedToMutateEnum = element.CreateShallowCopy();
555+
if (clonedToMutateEnum is OpenApiSchema { Enum: { } existingEnum } concreteCloned)
556+
{
557+
concreteCloned.Enum = [.. existingEnum, null!];
558+
callback(writer, clonedToMutateEnum);
559+
}
560+
else
561+
{
562+
callback(writer, element);
563+
}
558564
});
559565
}
560566
else
@@ -1094,6 +1100,23 @@ private static (IList<IOpenApiSchema>? effective, JsonSchemaType? inferredType,
10941100
}
10951101
else if (schema.Enum is { Count: > 0 })
10961102
{
1103+
foreach (var enumValue in schema.Enum)
1104+
{
1105+
if (enumValue is not null)
1106+
{
1107+
var currentType = enumValue.GetValueKind() switch
1108+
{
1109+
JsonValueKind.Array => JsonSchemaType.Array,
1110+
JsonValueKind.String => JsonSchemaType.String,
1111+
JsonValueKind.Number => JsonSchemaType.Number,
1112+
JsonValueKind.True or JsonValueKind.False => JsonSchemaType.Boolean,
1113+
JsonValueKind.Null => (JsonSchemaType)0,
1114+
_ => JsonSchemaType.Object,
1115+
};
1116+
1117+
commonType |= currentType;
1118+
}
1119+
}
10971120
commonType |= JsonSchemaType.String;
10981121
}
10991122
}

test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1868,7 +1868,7 @@ public async Task SerializeNullableEnumWith3_0()
18681868
// It's unclear if it's an issue of the validators or not, but it's safer to do it that way.
18691869
var schema = CreateNullableEnumSchema();
18701870
var result = await schema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
1871-
Assert.Equal("""
1871+
var expected = """
18721872
{
18731873
"type": "string",
18741874
"oneOf": [
@@ -1882,7 +1882,9 @@ public async Task SerializeNullableEnumWith3_0()
18821882
],
18831883
"nullable": true
18841884
}
1885-
""".ReplaceLineEndings(), result.ReplaceLineEndings());
1885+
""";
1886+
1887+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(result)));
18861888
}
18871889

18881890
[Theory]
@@ -1892,7 +1894,7 @@ public async Task SerializeNullableEnumWith3_1_And_Later(OpenApiSpecVersion vers
18921894
{
18931895
var schema = CreateNullableEnumSchema();
18941896
var result = await schema.SerializeAsJsonAsync(version);
1895-
Assert.Equal("""
1897+
var expected = """
18961898
{
18971899
"oneOf": [
18981900
{
@@ -1906,7 +1908,8 @@ public async Task SerializeNullableEnumWith3_1_And_Later(OpenApiSpecVersion vers
19061908
}
19071909
]
19081910
}
1909-
""".ReplaceLineEndings(), result.ReplaceLineEndings());
1911+
""";
1912+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(result)));
19101913
}
19111914

19121915
private OpenApiSchema CreateNullableEnumSchema()
@@ -1925,11 +1928,6 @@ private OpenApiSchema CreateNullableEnumSchema()
19251928
return schema;
19261929
}
19271930

1928-
private enum MyEnum
1929-
{
1930-
A, B
1931-
}
1932-
19331931
internal class SchemaVisitor : OpenApiVisitorBase
19341932
{
19351933
public List<string> Titles = new();

0 commit comments

Comments
 (0)