diff --git a/src/Microsoft.OpenApi/Any/OpenApiAnyCloneHelper.cs b/src/Microsoft.OpenApi/Any/OpenApiAnyCloneHelper.cs index b0e553f71..f880b7d64 100644 --- a/src/Microsoft.OpenApi/Any/OpenApiAnyCloneHelper.cs +++ b/src/Microsoft.OpenApi/Any/OpenApiAnyCloneHelper.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System.Reflection; - namespace Microsoft.OpenApi.Any { /// diff --git a/src/Microsoft.OpenApi/Any/OpenApiArray.cs b/src/Microsoft.OpenApi/Any/OpenApiArray.cs index 99bbb7d63..461e2284a 100644 --- a/src/Microsoft.OpenApi/Any/OpenApiArray.cs +++ b/src/Microsoft.OpenApi/Any/OpenApiArray.cs @@ -27,6 +27,10 @@ public OpenApiArray() { } public OpenApiArray(OpenApiArray array) { AnyType = array.AnyType; + foreach (var item in array) + { + Add(OpenApiAnyCloneHelper.CloneFromCopyConstructor(item)); + } } /// diff --git a/src/Microsoft.OpenApi/Any/OpenApiObject.cs b/src/Microsoft.OpenApi/Any/OpenApiObject.cs index f224824c3..60cfc75c3 100644 --- a/src/Microsoft.OpenApi/Any/OpenApiObject.cs +++ b/src/Microsoft.OpenApi/Any/OpenApiObject.cs @@ -27,6 +27,10 @@ public OpenApiObject() { } public OpenApiObject(OpenApiObject obj) { AnyType = obj.AnyType; + foreach (var key in obj.Keys) + { + this[key] = OpenApiAnyCloneHelper.CloneFromCopyConstructor(obj[key]); + } } /// diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs index 5d8320c62..0acd55925 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs @@ -1,11 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System; using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Linq; using System.Threading.Tasks; using FluentAssertions; using Microsoft.OpenApi.Any; @@ -485,6 +483,45 @@ public void OpenApiSchemaCopyConstructorSucceeds() Assert.True(actualSchema.Nullable); } + public static TheoryData SchemaExamples() + { + return new() + { + new OpenApiArray() { new OpenApiString("example") }, + new OpenApiBinary([0, 1, 2]), + new OpenApiBoolean(true), + new OpenApiByte(42), + new OpenApiDate(new(2024, 07, 19, 12, 34, 56)), + new OpenApiDateTime(new(2024, 07, 19, 12, 34, 56, new(01, 00, 00))), + new OpenApiDouble(42.37), + new OpenApiFloat(42.37f), + new OpenApiInteger(42), + new OpenApiLong(42), + new OpenApiNull(), + new OpenApiObject() { ["prop"] = new OpenApiString("example") }, + new OpenApiPassword("secret"), + new OpenApiString("example"), + }; + } + + [Theory] + [MemberData(nameof(SchemaExamples))] + public void CloningSchemaExamplesWorks(IOpenApiAny example) + { + // Arrange + var schema = new OpenApiSchema + { + Example = example + }; + + // Act && Assert + var schemaCopy = new OpenApiSchema(schema); + Assert.NotNull(schemaCopy.Example); + + // Act && Assert + Assert.Equivalent(schema.Example, schemaCopy.Example); + } + [Fact] public void CloningSchemaExtensionsWorks() {