diff --git a/src/Microsoft.OpenApi/Services/OpenApiAnyComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiAnyComparer.cs
new file mode 100644
index 000000000..2b3d2ad11
--- /dev/null
+++ b/src/Microsoft.OpenApi/Services/OpenApiAnyComparer.cs
@@ -0,0 +1,72 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license.
+
+using System;
+using System.IO;
+using Microsoft.OpenApi.Any;
+using Microsoft.OpenApi.Writers;
+
+namespace Microsoft.OpenApi.Services
+{
+ ///
+ /// Defines behavior for comparing properties of .
+ ///
+ public class OpenApiAnyComparer : OpenApiComparerBase
+ {
+ ///
+ /// Executes comparision against source and target .
+ ///
+ /// The source.
+ /// The target.
+ /// Context under which to compare the source and target.
+ public override void Compare(
+ IOpenApiAny source,
+ IOpenApiAny target,
+ ComparisonContext comparisonContext)
+ {
+ if (source == null && target == null)
+ {
+ return;
+ }
+
+ if (source == null || target == null)
+ {
+ comparisonContext.AddOpenApiDifference(
+ new OpenApiDifference
+ {
+ OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
+ SourceValue = source,
+ TargetValue = target,
+ OpenApiComparedElementType = typeof(IOpenApiAny),
+ Pointer = comparisonContext.PathString
+ });
+
+ return;
+ }
+
+ var sourceStringWriter = new StringWriter();
+ var sourceWriter = new OpenApiJsonWriter(sourceStringWriter);
+
+ source.Write(sourceWriter, OpenApiSpecVersion.OpenApi3_0);
+ var sourceValue = sourceStringWriter.GetStringBuilder().ToString();
+
+ var targetStringWriter = new StringWriter();
+ var targetWriter = new OpenApiJsonWriter(targetStringWriter);
+
+ target.Write(targetWriter, OpenApiSpecVersion.OpenApi3_0);
+ var targetValue = targetStringWriter.GetStringBuilder().ToString();
+
+ if (string.Compare(sourceValue, targetValue, StringComparison.InvariantCulture) != 0)
+ {
+ comparisonContext.AddOpenApiDifference(new OpenApiDifference
+ {
+ OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
+ OpenApiComparedElementType = typeof(IOpenApiAny),
+ SourceValue = source,
+ TargetValue = target,
+ Pointer = comparisonContext.PathString
+ });
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Microsoft.OpenApi/Services/OpenApiComparerFactory.cs b/src/Microsoft.OpenApi/Services/OpenApiComparerFactory.cs
index e5c9a7da5..b1ad1e269 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiComparerFactory.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiComparerFactory.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
namespace Microsoft.OpenApi.Services
@@ -55,7 +56,10 @@ public class OpenApiComparerFactory
{typeof(IList), new OpenApiOrderedListComparer()},
{typeof(OpenApiExternalDocs), new OpenApiExternalDocsComparer()},
{typeof(OpenApiTag), new OpenApiTagComparer()},
- {typeof(OpenApiSecurityScheme), new OpenApiSecuritySchemeComparer()}
+ {typeof(OpenApiSecurityScheme), new OpenApiSecuritySchemeComparer()},
+ {typeof(OpenApiExample), new OpenApiExampleComparer()},
+ {typeof(IDictionary), new OpenApiDictionaryComparer()},
+ {typeof(IOpenApiAny), new OpenApiAnyComparer()}
};
private readonly Dictionary _typeToComparerMap = new Dictionary();
diff --git a/src/Microsoft.OpenApi/Services/OpenApiComponentsComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiComponentsComparer.cs
index 23bdc629f..e1b04dae4 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiComponentsComparer.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiComponentsComparer.cs
@@ -84,10 +84,15 @@ public override void Compare(
.GetComparer>()
.Compare(sourceComponents.SecuritySchemes, targetComponents.SecuritySchemes, comparisonContext));
- // To Do compare Examples
+ WalkAndCompare(
+ comparisonContext,
+ OpenApiConstants.Examples,
+ () => comparisonContext
+ .GetComparer>()
+ .Compare(sourceComponents.Examples, targetComponents.Examples, comparisonContext));
+
// To Do compare Links
// To Do compare Callbacks
- // To Do compare Extensions
}
}
}
\ No newline at end of file
diff --git a/src/Microsoft.OpenApi/Services/OpenApiEncodingComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiEncodingComparer.cs
index 923ab1420..1e1aa7fef 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiEncodingComparer.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiEncodingComparer.cs
@@ -60,8 +60,6 @@ public override void Compare(
() => comparisonContext
.GetComparer>()
.Compare(sourceEncoding.Headers, targetEncoding.Headers, comparisonContext));
-
- // To Do Compare Extensions
}
}
}
\ No newline at end of file
diff --git a/src/Microsoft.OpenApi/Services/OpenApiExampleComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiExampleComparer.cs
new file mode 100644
index 000000000..70ab5082f
--- /dev/null
+++ b/src/Microsoft.OpenApi/Services/OpenApiExampleComparer.cs
@@ -0,0 +1,65 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license.
+
+using Microsoft.OpenApi.Any;
+using Microsoft.OpenApi.Models;
+
+namespace Microsoft.OpenApi.Services
+{
+ ///
+ /// Defines behavior for comparing properties of .
+ ///
+ public class OpenApiExampleComparer : OpenApiComparerBase
+ {
+ ///
+ /// Executes comparision against source and target .
+ ///
+ /// The source.
+ /// The target.
+ /// Context under which to compare the source and target.
+ public override void Compare(
+ OpenApiExample sourceExample,
+ OpenApiExample targetExample,
+ ComparisonContext comparisonContext)
+ {
+ if (sourceExample == null && targetExample == null)
+ {
+ return;
+ }
+
+ if (sourceExample == null || targetExample == null)
+ {
+ comparisonContext.AddOpenApiDifference(
+ new OpenApiDifference
+ {
+ OpenApiDifferenceOperation = OpenApiDifferenceOperation.Update,
+ SourceValue = sourceExample,
+ TargetValue = targetExample,
+ OpenApiComparedElementType = typeof(OpenApiExample),
+ Pointer = comparisonContext.PathString
+ });
+
+ return;
+ }
+
+ new OpenApiReferenceComparer()
+ .Compare(sourceExample.Reference, targetExample.Reference, comparisonContext);
+
+ WalkAndCompare(comparisonContext, OpenApiConstants.Description,
+ () => Compare(sourceExample.Description, targetExample.Description, comparisonContext));
+
+ WalkAndCompare(comparisonContext, OpenApiConstants.Summary,
+ () => Compare(sourceExample.Summary, targetExample.Summary, comparisonContext));
+
+ WalkAndCompare(comparisonContext, OpenApiConstants.ExternalValue,
+ () => Compare(sourceExample.ExternalValue, targetExample.ExternalValue, comparisonContext));
+
+ WalkAndCompare(
+ comparisonContext,
+ OpenApiConstants.Value,
+ () => comparisonContext
+ .GetComparer()
+ .Compare(sourceExample.Value, targetExample.Value, comparisonContext));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Microsoft.OpenApi/Services/OpenApiHeaderComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiHeaderComparer.cs
index b57ff4071..9f25751b2 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiHeaderComparer.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiHeaderComparer.cs
@@ -2,6 +2,7 @@
// Licensed under the MIT license.
using System.Collections.Generic;
+using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
namespace Microsoft.OpenApi.Services
@@ -104,9 +105,19 @@ public override void Compare(
.GetComparer()
.Compare(sourceHeader.Schema, targetHeader.Schema, comparisonContext));
- // To do compare example
- // To do compare examples
- // To do compare extensions
+ WalkAndCompare(
+ comparisonContext,
+ OpenApiConstants.Examples,
+ () => comparisonContext
+ .GetComparer>()
+ .Compare(sourceHeader.Examples, targetHeader.Examples, comparisonContext));
+
+ WalkAndCompare(
+ comparisonContext,
+ OpenApiConstants.Example,
+ () => comparisonContext
+ .GetComparer()
+ .Compare(sourceHeader.Example, targetHeader.Example, comparisonContext));
}
}
}
\ No newline at end of file
diff --git a/src/Microsoft.OpenApi/Services/OpenApiMediaTypeComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiMediaTypeComparer.cs
index 9578e211d..b93b33e45 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiMediaTypeComparer.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiMediaTypeComparer.cs
@@ -2,6 +2,7 @@
// Licensed under the MIT license.
using System.Collections.Generic;
+using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
namespace Microsoft.OpenApi.Services
@@ -47,7 +48,7 @@ public override void Compare(
OpenApiConstants.Schema,
() => comparisonContext
.GetComparer()
- .Compare( sourceMediaType.Schema, targetMediaType.Schema, comparisonContext ) );
+ .Compare(sourceMediaType.Schema, targetMediaType.Schema, comparisonContext));
WalkAndCompare(
comparisonContext,
@@ -56,9 +57,19 @@ public override void Compare(
.GetComparer>()
.Compare(sourceMediaType.Encoding, sourceMediaType.Encoding, comparisonContext));
- // To Do Compare Example
- // To Do Compare Examples
- // To Do Compare Extensions
+ WalkAndCompare(
+ comparisonContext,
+ OpenApiConstants.Examples,
+ () => comparisonContext
+ .GetComparer>()
+ .Compare(sourceMediaType.Examples, targetMediaType.Examples, comparisonContext));
+
+ WalkAndCompare(
+ comparisonContext,
+ OpenApiConstants.Example,
+ () => comparisonContext
+ .GetComparer()
+ .Compare(sourceMediaType.Example, targetMediaType.Example, comparisonContext));
}
}
}
\ No newline at end of file
diff --git a/src/Microsoft.OpenApi/Services/OpenApiParameterComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiParameterComparer.cs
index ee4df45cf..43b185e4e 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiParameterComparer.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiParameterComparer.cs
@@ -2,6 +2,7 @@
// Licensed under the MIT license.
using System.Collections.Generic;
+using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
namespace Microsoft.OpenApi.Services
@@ -86,8 +87,19 @@ public override void Compare(
.GetComparer()
.Compare(sourceParameter.Schema, targetParameter.Schema, comparisonContext));
- // To Do Compare Examples
- // To Do Compare parameter as IOpenApiExtensible
+ WalkAndCompare(
+ comparisonContext,
+ OpenApiConstants.Examples,
+ () => comparisonContext
+ .GetComparer>()
+ .Compare(sourceParameter.Examples, targetParameter.Examples, comparisonContext));
+
+ WalkAndCompare(
+ comparisonContext,
+ OpenApiConstants.Example,
+ () => comparisonContext
+ .GetComparer()
+ .Compare(sourceParameter.Example, targetParameter.Example, comparisonContext));
}
}
}
\ No newline at end of file
diff --git a/src/Microsoft.OpenApi/Services/OpenApiPathItemComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiPathItemComparer.cs
index 84c590eee..6a5657e0f 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiPathItemComparer.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiPathItemComparer.cs
@@ -53,8 +53,6 @@ public override void Compare(
() => comparisonContext
.GetComparer>()
.Compare(sourcePathItem?.Servers, targetPathItem?.Servers, comparisonContext));
-
- // To Do Compare Extensions
}
}
}
\ No newline at end of file
diff --git a/src/Microsoft.OpenApi/Services/OpenApiRequestBodyComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiRequestBodyComparer.cs
index d3ca3fc65..cce69dad2 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiRequestBodyComparer.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiRequestBodyComparer.cs
@@ -57,8 +57,6 @@ public override void Compare(
() => comparisonContext
.GetComparer>()
.Compare(sourceRequestBody.Content, targetRequestBody.Content, comparisonContext));
-
- //To Do Compare Extensions
}
}
}
\ No newline at end of file
diff --git a/src/Microsoft.OpenApi/Services/OpenApiResponseComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiResponseComparer.cs
index 805ad2743..4f47516b7 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiResponseComparer.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiResponseComparer.cs
@@ -90,7 +90,6 @@ public override void Compare(
.Compare(sourceResponse.Headers, targetResponse.Headers, comparisonContext));
// To Do Compare Link
- // To Do Compare Extensions
}
}
}
\ No newline at end of file
diff --git a/src/Microsoft.OpenApi/Services/OpenApiSchemaComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiSchemaComparer.cs
index 5d9561209..2fbb98694 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiSchemaComparer.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiSchemaComparer.cs
@@ -2,6 +2,7 @@
// Licensed under the MIT license.
using System.Collections.Generic;
+using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
namespace Microsoft.OpenApi.Services
@@ -157,11 +158,17 @@ public override void Compare(
OpenApiConstants.ExternalDocs,
() => comparisonContext
.GetComparer()
- .Compare(sourceSchema?.ExternalDocs, targetSchema?.ExternalDocs, comparisonContext));
+ .Compare(sourceSchema.ExternalDocs, targetSchema.ExternalDocs, comparisonContext));
+
+ WalkAndCompare(
+ comparisonContext,
+ OpenApiConstants.Example,
+ () => comparisonContext
+ .GetComparer()
+ .Compare(sourceSchema.Example, targetSchema.Example, comparisonContext));
// To Do Compare schema.AllOf
// To Do Compare schema.AnyOf
- // To Do compare schema as IOpenApiExtensible
comparisonContext.SourceSchemaLoop.Pop();
comparisonContext.TargetSchemaLoop.Pop();
diff --git a/src/Microsoft.OpenApi/Services/OpenApiServerComparer.cs b/src/Microsoft.OpenApi/Services/OpenApiServerComparer.cs
index 47245bd71..c5d17d443 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiServerComparer.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiServerComparer.cs
@@ -54,8 +54,6 @@ public override void Compare(
() => comparisonContext
.GetComparer>()
.Compare(sourceServer.Variables, sourceServer.Variables, comparisonContext));
-
- // To Do compare extensions
}
}
}
\ No newline at end of file
diff --git a/test/Microsoft.OpenApi.Tests/Services/OpenApiComparerTestCases.cs b/test/Microsoft.OpenApi.Tests/Services/OpenApiComparerTestCases.cs
index 7471440a5..76df51c25 100644
--- a/test/Microsoft.OpenApi.Tests/Services/OpenApiComparerTestCases.cs
+++ b/test/Microsoft.OpenApi.Tests/Services/OpenApiComparerTestCases.cs
@@ -590,6 +590,19 @@ public static IEnumerable