private void CompareProperties()

in openapi-diff/src/modeler/AutoRest.Swagger/Model/Schema.cs [269:327]


        private void CompareProperties(ComparisonContext<ServiceDefinition> context, Schema priorSchema)
        {
            // Case: Were any properties removed?
            if (priorSchema.Properties != null)
            {
                foreach (var def in priorSchema.Properties)
                {
                    if (Properties == null || !Properties.TryGetValue(def.Key, out var model))
                    {
                        context.LogBreakingChange(ComparisonMessages.RemovedProperty, def.Key);
                    }
                    else
                    {
                        // required to optional
                        if (Required != null && Required.Contains(def.Key) && (priorSchema.Required == null || !priorSchema.Required.Contains(def.Key)))
                        {
                            context.LogBreakingChange(ComparisonMessages.RequiredStatusChange, false, true);
                        }

                        // optional to required
                        if ((Required == null || !Required.Contains(def.Key)) && (priorSchema.Required != null && priorSchema.Required.Contains(def.Key)))
                        {
                            context.LogBreakingChange(ComparisonMessages.RequiredStatusChange, true, false);
                        }

                        context.PushProperty(def.Key);
                        model.Compare(context, def.Value);
                        context.Pop();
                    }
                }
            }

            // Case: Were any properties added?
            if (Properties != null)
            {
                foreach (KeyValuePair<string, Schema> property in Properties)
                {
                    // Case: Were any required properties added?
                    if (priorSchema.Properties == null || !priorSchema.Properties.TryGetValue(property.Key, out var model))
                    {
                        if ((Required != null && Required.Contains(property.Key)))
                        {
                            context.LogBreakingChange(ComparisonMessages.AddedRequiredProperty, property.Key);
                        }
                        else if (context.Direction == DataDirection.Response && property.Value != null)
                        {
                            if (property.Value.ReadOnly == true)
                                context.LogInfo(ComparisonMessages.AddedReadOnlyPropertyInResponse, property.Key);
                            else
                                context.LogBreakingChange(ComparisonMessages.AddedPropertyInResponse, property.Key);
                        }
                        else if(IsReferenced && property.Value != null)
                        {
                            context.LogBreakingChange(ComparisonMessages.AddedOptionalProperty, property.Key);
                        }
                    }
                }
            }
        }