From 0d5b4716d8cf0215257680d6cbaddaa84438eac5 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 26 Feb 2025 15:55:12 -0500 Subject: [PATCH] fix: deduplicates exclusive min/max properties in the object model Signed-off-by: Vincent Biret --- .../Models/Interfaces/IOpenApiSchema.cs | 14 +- src/Microsoft.OpenApi/Models/OpenApiSchema.cs | 170 ++++++++++++++---- .../References/OpenApiSchemaReference.cs | 8 +- .../Reader/V2/OpenApiHeaderDeserializer.cs | 4 +- .../Reader/V2/OpenApiSchemaDeserializer.cs | 4 +- .../Reader/V3/OpenApiSchemaDeserializer.cs | 4 +- .../Reader/V31/OpenApiSchemaDeserializer.cs | 4 +- .../V2Tests/OpenApiDocumentTests.cs | 55 ++---- .../V31Tests/OpenApiSchemaTests.cs | 4 +- .../Models/OpenApiOperationTests.cs | 4 +- .../Models/OpenApiSchemaTests.cs | 6 +- .../PublicApi/PublicApi.approved.txt | 18 +- 12 files changed, 174 insertions(+), 121 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSchema.cs b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSchema.cs index 6cf093499..d48fad60a 100644 --- a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSchema.cs @@ -55,12 +55,12 @@ public interface IOpenApiSchema : IOpenApiDescribedElement, IOpenApiSerializable /// /// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00 /// - public decimal? V31ExclusiveMaximum { get; } + public decimal? ExclusiveMaximum { get; } /// /// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00 /// - public decimal? V31ExclusiveMinimum { get; } + public decimal? ExclusiveMinimum { get; } /// /// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00 @@ -90,21 +90,11 @@ public interface IOpenApiSchema : IOpenApiDescribedElement, IOpenApiSerializable /// public decimal? Maximum { get; } - /// - /// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00 - /// - public bool? ExclusiveMaximum { get; } - /// /// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00 /// public decimal? Minimum { get; } - /// - /// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00 - /// - public bool? ExclusiveMinimum { get; } - /// /// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00 /// diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs index e524cfe41..05d3c9afa 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs @@ -44,11 +44,63 @@ public class OpenApiSchema : IOpenApiReferenceable, IOpenApiExtensible, IOpenApi /// public IDictionary Definitions { get; set; } + private decimal? _exclusiveMaximum; /// - public decimal? V31ExclusiveMaximum { get; set; } + public decimal? ExclusiveMaximum + { + get + { + if (_exclusiveMaximum.HasValue) + { + return _exclusiveMaximum; + } + if (IsExclusiveMaximum == true && _maximum.HasValue) + { + return _maximum; + } + return null; + } + set + { + _exclusiveMaximum = value; + IsExclusiveMaximum = value != null; + } + } + /// + /// Compatibility property for OpenAPI 3.0 or earlier serialization of the exclusive maximum value. + /// + /// DO NOT CHANGE THE VISIBILITY OF THIS PROPERTY TO PUBLIC + internal bool? IsExclusiveMaximum { get; set; } + + private decimal? _exclusiveMinimum; /// - public decimal? V31ExclusiveMinimum { get; set; } + public decimal? ExclusiveMinimum + { + get + { + if (_exclusiveMinimum.HasValue) + { + return _exclusiveMinimum; + } + if (IsExclusiveMinimum == true && _minimum.HasValue) + { + return _minimum; + } + return null; + } + set + { + _exclusiveMinimum = value; + IsExclusiveMinimum = value != null; + } + } + + /// + /// Compatibility property for OpenAPI 3.0 or earlier serialization of the exclusive minimum value. + /// + /// DO NOT CHANGE THE VISIBILITY OF THIS PROPERTY TO PUBLIC + internal bool? IsExclusiveMinimum { get; set; } /// public bool UnEvaluatedProperties { get; set; } @@ -65,17 +117,42 @@ public class OpenApiSchema : IOpenApiReferenceable, IOpenApiExtensible, IOpenApi /// public string Description { get; set; } + private decimal? _maximum; /// - public decimal? Maximum { get; set; } - - /// - public bool? ExclusiveMaximum { get; set; } + public decimal? Maximum + { + get + { + if (IsExclusiveMaximum == true) + { + return null; + } + return _maximum; + } + set + { + _maximum = value; + } + } - /// - public decimal? Minimum { get; set; } + private decimal? _minimum; /// - public bool? ExclusiveMinimum { get; set; } + public decimal? Minimum + { + get + { + if (IsExclusiveMinimum == true) + { + return null; + } + return _minimum; + } + set + { + _minimum = value; + } + } /// public int? MaxLength { get; set; } @@ -201,15 +278,18 @@ internal OpenApiSchema(IOpenApiSchema schema) DynamicRef = schema.DynamicRef ?? DynamicRef; Definitions = schema.Definitions != null ? new Dictionary(schema.Definitions) : null; UnevaluatedProperties = schema.UnevaluatedProperties; - V31ExclusiveMaximum = schema.V31ExclusiveMaximum ?? V31ExclusiveMaximum; - V31ExclusiveMinimum = schema.V31ExclusiveMinimum ?? V31ExclusiveMinimum; + ExclusiveMaximum = schema.ExclusiveMaximum ?? ExclusiveMaximum; + ExclusiveMinimum = schema.ExclusiveMinimum ?? ExclusiveMinimum; + if (schema is OpenApiSchema eMSchema) + { + IsExclusiveMaximum = eMSchema.IsExclusiveMaximum; + IsExclusiveMinimum = eMSchema.IsExclusiveMinimum; + } Type = schema.Type ?? Type; Format = schema.Format ?? Format; Description = schema.Description ?? Description; Maximum = schema.Maximum ?? Maximum; - ExclusiveMaximum = schema.ExclusiveMaximum ?? ExclusiveMaximum; Minimum = schema.Minimum ?? Minimum; - ExclusiveMinimum = schema.ExclusiveMinimum ?? ExclusiveMinimum; MaxLength = schema.MaxLength ?? MaxLength; MinLength = schema.MinLength ?? MinLength; Pattern = schema.Pattern ?? Pattern; @@ -257,6 +337,44 @@ public void SerializeAsV3(IOpenApiWriter writer) SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); } + private static void SerializeBounds(IOpenApiWriter writer, OpenApiSpecVersion version, string propertyName, string exclusivePropertyName, string isExclusivePropertyName, decimal? value, decimal? exclusiveValue, bool? isExclusiveValue) + { + if (version >= OpenApiSpecVersion.OpenApi3_1) + { + if (exclusiveValue.HasValue) + { + // was explicitly set in the document or object model + writer.WriteProperty(exclusivePropertyName, exclusiveValue.Value); + } + else if (isExclusiveValue == true && value.HasValue) + { + // came from parsing an old document + writer.WriteProperty(exclusivePropertyName, value); + } + else if (value.HasValue) + { + // was explicitly set in the document or object model + writer.WriteProperty(propertyName, value); + } + } + else + { + if (exclusiveValue.HasValue) + { + // was explicitly set in a new document being downcast or object model + writer.WriteProperty(propertyName, exclusiveValue.Value); + writer.WriteProperty(isExclusivePropertyName, true); + } + else if (value.HasValue) + { + // came from parsing an old document, we're just mirroring the information + writer.WriteProperty(propertyName, value); + if (isExclusiveValue.HasValue) + writer.WriteProperty(isExclusivePropertyName, isExclusiveValue.Value); + } + } + } + private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version, Action callback) { @@ -274,16 +392,12 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version writer.WriteProperty(OpenApiConstants.MultipleOf, MultipleOf); // maximum - writer.WriteProperty(OpenApiConstants.Maximum, Maximum); - // exclusiveMaximum - writer.WriteProperty(OpenApiConstants.ExclusiveMaximum, ExclusiveMaximum); + SerializeBounds(writer, version, OpenApiConstants.Maximum, OpenApiConstants.ExclusiveMaximum, OpenApiConstants.V31ExclusiveMaximum, Maximum, ExclusiveMaximum, IsExclusiveMaximum); // minimum - writer.WriteProperty(OpenApiConstants.Minimum, Minimum); - // exclusiveMinimum - writer.WriteProperty(OpenApiConstants.ExclusiveMinimum, ExclusiveMinimum); + SerializeBounds(writer, version, OpenApiConstants.Minimum, OpenApiConstants.ExclusiveMinimum, OpenApiConstants.V31ExclusiveMinimum, Minimum, ExclusiveMinimum, IsExclusiveMinimum); // maxLength writer.WriteProperty(OpenApiConstants.MaxLength, MaxLength); @@ -407,8 +521,6 @@ internal void WriteJsonSchemaKeywords(IOpenApiWriter writer) writer.WriteOptionalMap(OpenApiConstants.Defs, Definitions, (w, s) => s.SerializeAsV31(w)); writer.WriteProperty(OpenApiConstants.DynamicRef, DynamicRef); writer.WriteProperty(OpenApiConstants.DynamicAnchor, DynamicAnchor); - writer.WriteProperty(OpenApiConstants.V31ExclusiveMaximum, V31ExclusiveMaximum); - writer.WriteProperty(OpenApiConstants.V31ExclusiveMinimum, V31ExclusiveMinimum); writer.WriteProperty(OpenApiConstants.UnevaluatedProperties, UnevaluatedProperties, false); writer.WriteOptionalCollection(OpenApiConstants.Examples, Examples, (nodeWriter, s) => nodeWriter.WriteAny(s)); writer.WriteOptionalMap(OpenApiConstants.PatternProperties, PatternProperties, (w, s) => s.SerializeAsV31(w)); @@ -438,16 +550,12 @@ internal void WriteAsItemsProperties(IOpenApiWriter writer) writer.WriteOptionalObject(OpenApiConstants.Default, Default, (w, d) => w.WriteAny(d)); // maximum - writer.WriteProperty(OpenApiConstants.Maximum, Maximum); - // exclusiveMaximum - writer.WriteProperty(OpenApiConstants.ExclusiveMaximum, ExclusiveMaximum); + SerializeBounds(writer, OpenApiSpecVersion.OpenApi2_0, OpenApiConstants.Maximum, OpenApiConstants.ExclusiveMaximum, OpenApiConstants.V31ExclusiveMaximum, Maximum, ExclusiveMaximum, IsExclusiveMaximum); // minimum - writer.WriteProperty(OpenApiConstants.Minimum, Minimum); - // exclusiveMinimum - writer.WriteProperty(OpenApiConstants.ExclusiveMinimum, ExclusiveMinimum); + SerializeBounds(writer, OpenApiSpecVersion.OpenApi2_0, OpenApiConstants.Minimum, OpenApiConstants.ExclusiveMinimum, OpenApiConstants.V31ExclusiveMinimum, Minimum, ExclusiveMinimum, IsExclusiveMinimum); // maxLength writer.WriteProperty(OpenApiConstants.MaxLength, MaxLength); @@ -522,16 +630,12 @@ private void SerializeAsV2( writer.WriteProperty(OpenApiConstants.MultipleOf, MultipleOf); // maximum - writer.WriteProperty(OpenApiConstants.Maximum, Maximum); - // exclusiveMaximum - writer.WriteProperty(OpenApiConstants.ExclusiveMaximum, ExclusiveMaximum); + SerializeBounds(writer, OpenApiSpecVersion.OpenApi2_0, OpenApiConstants.Maximum, OpenApiConstants.ExclusiveMaximum, OpenApiConstants.V31ExclusiveMaximum, Maximum, ExclusiveMaximum, IsExclusiveMaximum); // minimum - writer.WriteProperty(OpenApiConstants.Minimum, Minimum); - // exclusiveMinimum - writer.WriteProperty(OpenApiConstants.ExclusiveMinimum, ExclusiveMinimum); + SerializeBounds(writer, OpenApiSpecVersion.OpenApi2_0, OpenApiConstants.Minimum, OpenApiConstants.ExclusiveMinimum, OpenApiConstants.V31ExclusiveMinimum, Minimum, ExclusiveMinimum, IsExclusiveMinimum); // maxLength writer.WriteProperty(OpenApiConstants.MaxLength, MaxLength); diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs index 746af1d80..52631941b 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs @@ -66,9 +66,9 @@ public string Description /// public IDictionary Definitions { get => Target?.Definitions; } /// - public decimal? V31ExclusiveMaximum { get => Target?.V31ExclusiveMaximum; } + public decimal? ExclusiveMaximum { get => Target?.ExclusiveMaximum; } /// - public decimal? V31ExclusiveMinimum { get => Target?.V31ExclusiveMinimum; } + public decimal? ExclusiveMinimum { get => Target?.ExclusiveMinimum; } /// public bool UnEvaluatedProperties { get => Target?.UnEvaluatedProperties ?? false; } /// @@ -80,12 +80,8 @@ public string Description /// public decimal? Maximum { get => Target?.Maximum; } /// - public bool? ExclusiveMaximum { get => Target?.ExclusiveMaximum; } - /// public decimal? Minimum { get => Target?.Minimum; } /// - public bool? ExclusiveMinimum { get => Target?.ExclusiveMinimum; } - /// public int? MaxLength { get => Target?.MaxLength; } /// public int? MinLength { get => Target?.MinLength; } diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiHeaderDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiHeaderDeserializer.cs index 9c712b0a3..e92c47231 100644 --- a/src/Microsoft.OpenApi/Reader/V2/OpenApiHeaderDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiHeaderDeserializer.cs @@ -49,7 +49,7 @@ internal static partial class OpenApiV2Deserializer }, { "exclusiveMaximum", - (o, n, _) => GetOrCreateSchema(o).ExclusiveMaximum = bool.Parse(n.GetScalarValue()) + (o, n, _) => GetOrCreateSchema(o).IsExclusiveMaximum = bool.Parse(n.GetScalarValue()) }, { "minimum", @@ -57,7 +57,7 @@ internal static partial class OpenApiV2Deserializer }, { "exclusiveMinimum", - (o, n, _) => GetOrCreateSchema(o).ExclusiveMinimum = bool.Parse(n.GetScalarValue()) + (o, n, _) => GetOrCreateSchema(o).IsExclusiveMinimum = bool.Parse(n.GetScalarValue()) }, { "maxLength", diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs index 42575e394..87a8fdf8a 100644 --- a/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs @@ -34,7 +34,7 @@ internal static partial class OpenApiV2Deserializer }, { "exclusiveMaximum", - (o, n, _) => o.ExclusiveMaximum = bool.Parse(n.GetScalarValue()) + (o, n, _) => o.IsExclusiveMaximum = bool.Parse(n.GetScalarValue()) }, { "minimum", @@ -42,7 +42,7 @@ internal static partial class OpenApiV2Deserializer }, { "exclusiveMinimum", - (o, n, _) => o.ExclusiveMinimum = bool.Parse(n.GetScalarValue()) + (o, n, _) => o.IsExclusiveMinimum = bool.Parse(n.GetScalarValue()) }, { "maxLength", diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs index 25d68b477..2cc13484f 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs @@ -34,7 +34,7 @@ internal static partial class OpenApiV3Deserializer }, { "exclusiveMaximum", - (o, n, _) => o.ExclusiveMaximum = bool.Parse(n.GetScalarValue()) + (o, n, _) => o.IsExclusiveMaximum = bool.Parse(n.GetScalarValue()) }, { "minimum", @@ -42,7 +42,7 @@ internal static partial class OpenApiV3Deserializer }, { "exclusiveMinimum", - (o, n, _) => o.ExclusiveMinimum = bool.Parse(n.GetScalarValue()) + (o, n, _) => o.IsExclusiveMinimum = bool.Parse(n.GetScalarValue()) }, { "maxLength", diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs index 02039cebd..460dbc508 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs @@ -59,7 +59,7 @@ internal static partial class OpenApiV31Deserializer }, { "exclusiveMaximum", - (o, n, _) => o.V31ExclusiveMaximum = ParserHelper.ParseDecimalWithFallbackOnOverflow(n.GetScalarValue(), decimal.MaxValue) + (o, n, _) => o.ExclusiveMaximum = ParserHelper.ParseDecimalWithFallbackOnOverflow(n.GetScalarValue(), decimal.MaxValue) }, { "minimum", @@ -67,7 +67,7 @@ internal static partial class OpenApiV31Deserializer }, { "exclusiveMinimum", - (o, n, _) => o.V31ExclusiveMinimum = ParserHelper.ParseDecimalWithFallbackOnOverflow(n.GetScalarValue(), decimal.MaxValue) + (o, n, _) => o.ExclusiveMinimum = ParserHelper.ParseDecimalWithFallbackOnOverflow(n.GetScalarValue(), decimal.MaxValue) }, { "maxLength", diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs index 1059c3b02..be5921e54 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs @@ -50,49 +50,22 @@ public void ParseDocumentWithDifferentCultureShouldSucceed(string culture) exclusiveMaximum: true exclusiveMinimum: false paths: {} - """, + """, "yaml", SettingsFixture.ReaderSettings); - result.Document.Should().BeEquivalentTo( - new OpenApiDocument - { - Info = new() - { - Title = "Simple Document", - Version = "0.9.1", - Extensions = - { - ["x-extension"] = new OpenApiAny(2.335) - } - }, - Components = new() - { - Schemas = - { - ["sampleSchema"] = new OpenApiSchema() - { - Type = JsonSchemaType.Object, - Properties = - { - ["sampleProperty"] = new OpenApiSchema() - { - Type = JsonSchemaType.Number, - Minimum = (decimal)100.54, - Maximum = (decimal)60000000.35, - ExclusiveMaximum = true, - ExclusiveMinimum = false - } - } - } - } - }, - Paths = new() - }, options => options - .Excluding(x=> x.BaseUri) - .Excluding((IMemberInfo memberInfo) => - memberInfo.Path.EndsWith("Parent")) - .Excluding((IMemberInfo memberInfo) => - memberInfo.Path.EndsWith("Root"))); + Assert.Equal("0.9.1", result.Document.Info.Version, StringComparer.OrdinalIgnoreCase); + var extension = Assert.IsType(result.Document.Info.Extensions["x-extension"]); + Assert.Equal(2.335M, extension.Node.GetValue()); + var sampleSchema = Assert.IsType(result.Document.Components.Schemas["sampleSchema"]); + var samplePropertySchema = Assert.IsType(sampleSchema.Properties["sampleProperty"]); + var expectedPropertySchema = new OpenApiSchema() + { + Type = JsonSchemaType.Number, + Minimum = (decimal)100.54, + ExclusiveMaximum = (decimal)60000000.35, + }; + + Assert.Equivalent(expectedPropertySchema, samplePropertySchema); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs index d96a1fe87..854fc403c 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs @@ -239,7 +239,7 @@ public async Task ParseAdvancedV31SchemaShouldSucceed() ["six"] = new OpenApiSchema() { Description = "exclusiveMinimum true", - V31ExclusiveMinimum = 10 + ExclusiveMinimum = 10 }, ["seven"] = new OpenApiSchema() { @@ -249,7 +249,7 @@ public async Task ParseAdvancedV31SchemaShouldSucceed() ["eight"] = new OpenApiSchema() { Description = "exclusiveMaximum true", - V31ExclusiveMaximum = 20 + ExclusiveMaximum = 20 }, ["nine"] = new OpenApiSchema() { diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs index 31a26f1be..bb615f2dd 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs @@ -372,9 +372,7 @@ public async Task SerializeOperationWithBodyAsV3JsonWorks() var actual = await _operationWithBody.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert - actual = actual.MakeLineBreaksEnvironmentNeutral(); - expected = expected.MakeLineBreaksEnvironmentNeutral(); - Assert.Equal(expected, actual); + Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual))); } [Fact] diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs index 76d6c00fa..9fc3dcebb 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs @@ -30,8 +30,7 @@ public class OpenApiSchemaTests Title = "title1", MultipleOf = 3, Maximum = 42, - ExclusiveMinimum = true, - Minimum = 10, + ExclusiveMinimum = 10, Default = 15, Type = JsonSchemaType.Integer | JsonSchemaType.Null, @@ -148,8 +147,7 @@ public class OpenApiSchemaTests Title = "title1", MultipleOf = 3, Maximum = 42, - ExclusiveMinimum = true, - Minimum = 10, + ExclusiveMinimum = 10, Default = 15, Type = JsonSchemaType.Integer | JsonSchemaType.Null, diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 76697d7ae..fc2560060 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -429,8 +429,8 @@ namespace Microsoft.OpenApi.Models.Interfaces System.Collections.Generic.IList Enum { get; } System.Text.Json.Nodes.JsonNode Example { get; } System.Collections.Generic.IList Examples { get; } - bool? ExclusiveMaximum { get; } - bool? ExclusiveMinimum { get; } + decimal? ExclusiveMaximum { get; } + decimal? ExclusiveMinimum { get; } Microsoft.OpenApi.Models.OpenApiExternalDocs ExternalDocs { get; } string Format { get; } string Id { get; } @@ -458,8 +458,6 @@ namespace Microsoft.OpenApi.Models.Interfaces bool UnevaluatedProperties { get; } bool? UniqueItems { get; } System.Collections.Generic.IDictionary UnrecognizedKeywords { get; } - decimal? V31ExclusiveMaximum { get; } - decimal? V31ExclusiveMinimum { get; } System.Collections.Generic.IDictionary Vocabulary { get; } bool WriteOnly { get; } Microsoft.OpenApi.Models.OpenApiXml Xml { get; } @@ -1033,8 +1031,8 @@ namespace Microsoft.OpenApi.Models public System.Collections.Generic.IList Enum { get; set; } public System.Text.Json.Nodes.JsonNode Example { get; set; } public System.Collections.Generic.IList Examples { get; set; } - public bool? ExclusiveMaximum { get; set; } - public bool? ExclusiveMinimum { get; set; } + public decimal? ExclusiveMaximum { get; set; } + public decimal? ExclusiveMinimum { get; set; } public System.Collections.Generic.IDictionary Extensions { get; set; } public Microsoft.OpenApi.Models.OpenApiExternalDocs ExternalDocs { get; set; } public string Format { get; set; } @@ -1063,8 +1061,6 @@ namespace Microsoft.OpenApi.Models public bool UnevaluatedProperties { get; set; } public bool? UniqueItems { get; set; } public System.Collections.Generic.IDictionary UnrecognizedKeywords { get; set; } - public decimal? V31ExclusiveMaximum { get; set; } - public decimal? V31ExclusiveMinimum { get; set; } public System.Collections.Generic.IDictionary Vocabulary { get; set; } public bool WriteOnly { get; set; } public Microsoft.OpenApi.Models.OpenApiXml Xml { get; set; } @@ -1386,8 +1382,8 @@ namespace Microsoft.OpenApi.Models.References public System.Collections.Generic.IList Enum { get; } public System.Text.Json.Nodes.JsonNode Example { get; } public System.Collections.Generic.IList Examples { get; } - public bool? ExclusiveMaximum { get; } - public bool? ExclusiveMinimum { get; } + public decimal? ExclusiveMaximum { get; } + public decimal? ExclusiveMinimum { get; } public System.Collections.Generic.IDictionary Extensions { get; } public Microsoft.OpenApi.Models.OpenApiExternalDocs ExternalDocs { get; } public string Format { get; } @@ -1416,8 +1412,6 @@ namespace Microsoft.OpenApi.Models.References public bool UnevaluatedProperties { get; } public bool? UniqueItems { get; } public System.Collections.Generic.IDictionary UnrecognizedKeywords { get; } - public decimal? V31ExclusiveMaximum { get; } - public decimal? V31ExclusiveMinimum { get; } public System.Collections.Generic.IDictionary Vocabulary { get; } public bool WriteOnly { get; } public Microsoft.OpenApi.Models.OpenApiXml Xml { get; }