Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/Microsoft.OpenApi/Models/OpenApiSchema.cs
Original file line number Diff line number Diff line change
Expand Up @@ -884,7 +884,9 @@ private static (IList<IOpenApiSchema>? effective, JsonSchemaType? inferredType,
commonType |= schema.Type.GetValueOrDefault() & ~JsonSchemaType.Null;
}

if (System.Enum.IsDefined(commonType))
// Check if commonType is a single flag (power of 2) indicating all schemas share the same type
var isSingleType = commonType != 0 && (commonType & (commonType - 1)) == 0;
Comment thread
desjoerd marked this conversation as resolved.
Outdated
if (isSingleType)
{
// Single common type
return (nonNullSchemas, commonType, true);
Expand Down
43 changes: 22 additions & 21 deletions test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -814,7 +814,7 @@ public async Task SerializeOneOfWithNullAsV3ShouldUseNullableAsync()
schema.SerializeAsV3(writer);
await writer.FlushAsync();

var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
var v3Schema = outputStringWriter.GetStringBuilder().ToString();

var expectedV3Schema =
"""
Expand All @@ -828,10 +828,10 @@ public async Task SerializeOneOfWithNullAsV3ShouldUseNullableAsync()
],
"nullable": true
}
""".MakeLineBreaksEnvironmentNeutral();
""";

// Assert
Assert.Equal(expectedV3Schema, v3Schema);
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
}

[Fact]
Expand All @@ -855,7 +855,7 @@ public async Task SerializeOneOfWithNullAndMultipleSchemasAsV3ShouldMarkItAsNull
schema.SerializeAsV3(writer);
await writer.FlushAsync();

var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
var v3Schema = outputStringWriter.GetStringBuilder().ToString();

var expectedV3Schema =
"""
Expand All @@ -870,10 +870,10 @@ public async Task SerializeOneOfWithNullAndMultipleSchemasAsV3ShouldMarkItAsNull
],
"nullable": true
}
""".MakeLineBreaksEnvironmentNeutral();
""";

// Assert
Assert.Equal(expectedV3Schema, v3Schema);
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
}

[Fact]
Expand Down Expand Up @@ -903,7 +903,7 @@ public async Task SerializeAnyOfWithNullAsV3ShouldUseNullableAsync()
schema.SerializeAsV3(writer);
await writer.FlushAsync();

var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
var v3Schema = outputStringWriter.GetStringBuilder().ToString();

var expectedV3Schema =
"""
Expand All @@ -921,8 +921,9 @@ public async Task SerializeAnyOfWithNullAsV3ShouldUseNullableAsync()
],
"nullable": true
}
""".MakeLineBreaksEnvironmentNeutral(); // Assert
Assert.Equal(expectedV3Schema, v3Schema);
""";
// Assert
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
}

[Fact]
Expand All @@ -946,7 +947,7 @@ public async Task SerializeAnyOfWithNullAndMultipleSchemasAsV3ShouldApplyNullabl
schema.SerializeAsV3(writer);
await writer.FlushAsync();

var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
var v3Schema = outputStringWriter.GetStringBuilder().ToString();

var expectedV3Schema =
"""
Expand All @@ -962,10 +963,10 @@ public async Task SerializeAnyOfWithNullAndMultipleSchemasAsV3ShouldApplyNullabl
],
"nullable": true
}
""".MakeLineBreaksEnvironmentNeutral();
""";

// Assert
Assert.Equal(expectedV3Schema, v3Schema);
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
}

[Fact]
Expand All @@ -987,17 +988,17 @@ public async Task SerializeOneOfWithOnlyNullAsV3ShouldJustBeNullableAsync()
schema.SerializeAsV3(writer);
await writer.FlushAsync();

var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
var v3Schema = outputStringWriter.GetStringBuilder().ToString();

var expectedV3Schema =
"""
{
"nullable": true
}
""".MakeLineBreaksEnvironmentNeutral();
""";

// Assert
Assert.Equal(expectedV3Schema, v3Schema);
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
}

[Fact]
Expand All @@ -1020,7 +1021,7 @@ public async Task SerializeOneOfWithNullAsV31ShouldNotChangeAsync()
schema.SerializeAsV31(writer);
await writer.FlushAsync();

var v31Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
var v31Schema = outputStringWriter.GetStringBuilder().ToString();

var expectedV31Schema =
"""
Expand All @@ -1034,10 +1035,10 @@ public async Task SerializeOneOfWithNullAsV31ShouldNotChangeAsync()
}
]
}
""".MakeLineBreaksEnvironmentNeutral();
""";

// Assert
Assert.Equal(expectedV31Schema, v31Schema);
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV31Schema), JsonNode.Parse(v31Schema)));
}

[Fact]
Expand Down Expand Up @@ -1084,7 +1085,7 @@ public async Task SerializeOneOfWithNullAndRefAsV3ShouldUseNullableAsync()
schema.SerializeAsV3(writer);
await writer.FlushAsync();

var v3Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral();
var v3Schema = outputStringWriter.GetStringBuilder().ToString();

var expectedV3Schema =
"""
Expand All @@ -1097,10 +1098,10 @@ public async Task SerializeOneOfWithNullAndRefAsV3ShouldUseNullableAsync()
],
"nullable": true
}
""".MakeLineBreaksEnvironmentNeutral();
""";

// Assert
Assert.Equal(expectedV3Schema, v3Schema);
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expectedV3Schema), JsonNode.Parse(v3Schema)));
}

internal class SchemaVisitor : OpenApiVisitorBase
Expand Down