Skip to content

Commit b8ad06f

Browse files
authored
Merge pull request #1 from desjoerd/copilot/fix-pr-comments-2645
Address PR microsoft#2645 review comments: improve type checking logic and use JsonNode.DeepEquals
2 parents f72d77c + 3f2402f commit b8ad06f

File tree

2 files changed

+48
-26
lines changed

2 files changed

+48
-26
lines changed

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -877,20 +877,41 @@ private static (IList<IOpenApiSchema>? effective, JsonSchemaType? inferredType,
877877

878878
if (nonNullSchemas.Count > 0)
879879
{
880-
JsonSchemaType commonType = 0;
880+
// Check if all schemas have the same type (excluding null)
881+
JsonSchemaType? firstType = null;
882+
bool allSameType = true;
881883

882884
foreach (var schema in nonNullSchemas)
883885
{
884-
commonType |= schema.Type.GetValueOrDefault() & ~JsonSchemaType.Null;
886+
var schemaType = schema.Type;
887+
if (schemaType.HasValue)
888+
{
889+
// Remove null from the type using bitwise operator
890+
var typeWithoutNull = schemaType.Value & ~JsonSchemaType.Null;
891+
892+
if (typeWithoutNull != 0)
893+
{
894+
if (firstType == null)
895+
{
896+
firstType = typeWithoutNull;
897+
}
898+
else if (firstType != typeWithoutNull)
899+
{
900+
allSameType = false;
901+
break;
902+
}
903+
}
904+
}
885905
}
886906

887-
if (System.Enum.IsDefined(commonType))
907+
if (allSameType && firstType.HasValue)
888908
{
889-
// Single common type
890-
return (nonNullSchemas, commonType, true);
909+
// All schemas share the same type
910+
return (nonNullSchemas, firstType.Value, true);
891911
}
892912
else
893913
{
914+
// Multiple different types
894915
return (nonNullSchemas, null, true);
895916
}
896917

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

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ public async Task SerializeOneOfWithNullAsV3ShouldUseNullableAsync()
814814
schema.SerializeAsV3(writer);
815815
await writer.FlushAsync();
816816

817-
var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
817+
var v3Schema = outputStringWriter.GetStringBuilder().ToString();
818818

819819
var expectedV3Schema =
820820
"""
@@ -828,10 +828,10 @@ public async Task SerializeOneOfWithNullAsV3ShouldUseNullableAsync()
828828
],
829829
"nullable": true
830830
}
831-
""".MakeLineBreaksEnvironmentNeutral();
831+
""";
832832

833833
// Assert
834-
Assert.Equal(expectedV3Schema, v3Schema);
834+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
835835
}
836836

837837
[Fact]
@@ -855,7 +855,7 @@ public async Task SerializeOneOfWithNullAndMultipleSchemasAsV3ShouldMarkItAsNull
855855
schema.SerializeAsV3(writer);
856856
await writer.FlushAsync();
857857

858-
var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
858+
var v3Schema = outputStringWriter.GetStringBuilder().ToString();
859859

860860
var expectedV3Schema =
861861
"""
@@ -870,10 +870,10 @@ public async Task SerializeOneOfWithNullAndMultipleSchemasAsV3ShouldMarkItAsNull
870870
],
871871
"nullable": true
872872
}
873-
""".MakeLineBreaksEnvironmentNeutral();
873+
""";
874874

875875
// Assert
876-
Assert.Equal(expectedV3Schema, v3Schema);
876+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
877877
}
878878

879879
[Fact]
@@ -903,7 +903,7 @@ public async Task SerializeAnyOfWithNullAsV3ShouldUseNullableAsync()
903903
schema.SerializeAsV3(writer);
904904
await writer.FlushAsync();
905905

906-
var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
906+
var v3Schema = outputStringWriter.GetStringBuilder().ToString();
907907

908908
var expectedV3Schema =
909909
"""
@@ -921,8 +921,9 @@ public async Task SerializeAnyOfWithNullAsV3ShouldUseNullableAsync()
921921
],
922922
"nullable": true
923923
}
924-
""".MakeLineBreaksEnvironmentNeutral(); // Assert
925-
Assert.Equal(expectedV3Schema, v3Schema);
924+
""";
925+
// Assert
926+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
926927
}
927928

928929
[Fact]
@@ -946,7 +947,7 @@ public async Task SerializeAnyOfWithNullAndMultipleSchemasAsV3ShouldApplyNullabl
946947
schema.SerializeAsV3(writer);
947948
await writer.FlushAsync();
948949

949-
var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
950+
var v3Schema = outputStringWriter.GetStringBuilder().ToString();
950951

951952
var expectedV3Schema =
952953
"""
@@ -962,10 +963,10 @@ public async Task SerializeAnyOfWithNullAndMultipleSchemasAsV3ShouldApplyNullabl
962963
],
963964
"nullable": true
964965
}
965-
""".MakeLineBreaksEnvironmentNeutral();
966+
""";
966967

967968
// Assert
968-
Assert.Equal(expectedV3Schema, v3Schema);
969+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
969970
}
970971

971972
[Fact]
@@ -987,17 +988,17 @@ public async Task SerializeOneOfWithOnlyNullAsV3ShouldJustBeNullableAsync()
987988
schema.SerializeAsV3(writer);
988989
await writer.FlushAsync();
989990

990-
var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
991+
var v3Schema = outputStringWriter.GetStringBuilder().ToString();
991992

992993
var expectedV3Schema =
993994
"""
994995
{
995996
"nullable": true
996997
}
997-
""".MakeLineBreaksEnvironmentNeutral();
998+
""";
998999

9991000
// Assert
1000-
Assert.Equal(expectedV3Schema, v3Schema);
1001+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
10011002
}
10021003

10031004
[Fact]
@@ -1020,7 +1021,7 @@ public async Task SerializeOneOfWithNullAsV31ShouldNotChangeAsync()
10201021
schema.SerializeAsV31(writer);
10211022
await writer.FlushAsync();
10221023

1023-
var v31Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
1024+
var v31Schema = outputStringWriter.GetStringBuilder().ToString();
10241025

10251026
var expectedV31Schema =
10261027
"""
@@ -1034,10 +1035,10 @@ public async Task SerializeOneOfWithNullAsV31ShouldNotChangeAsync()
10341035
}
10351036
]
10361037
}
1037-
""".MakeLineBreaksEnvironmentNeutral();
1038+
""";
10381039

10391040
// Assert
1040-
Assert.Equal(expectedV31Schema, v31Schema);
1041+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV31Schema), JsonNode.Parse(v31Schema)));
10411042
}
10421043

10431044
[Fact]
@@ -1084,7 +1085,7 @@ public async Task SerializeOneOfWithNullAndRefAsV3ShouldUseNullableAsync()
10841085
schema.SerializeAsV3(writer);
10851086
await writer.FlushAsync();
10861087

1087-
var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
1088+
var v3Schema = outputStringWriter.GetStringBuilder().ToString();
10881089

10891090
var expectedV3Schema =
10901091
"""
@@ -1097,10 +1098,10 @@ public async Task SerializeOneOfWithNullAndRefAsV3ShouldUseNullableAsync()
10971098
],
10981099
"nullable": true
10991100
}
1100-
""".MakeLineBreaksEnvironmentNeutral();
1101+
""";
11011102

11021103
// Assert
1103-
Assert.Equal(expectedV3Schema, v3Schema);
1104+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
11041105
}
11051106

11061107
internal class SchemaVisitor : OpenApiVisitorBase

0 commit comments

Comments
 (0)