private static void CompareElements()

in tools/test-proxy/Azure.Sdk.Tools.TestProxy/Common/JsonComparer.cs [44:155]


        private static void CompareElements(JsonElement element1, JsonElement element2, List<string> differences, string path)
        {
            if (element1.ValueKind != element2.ValueKind)
            {
                differences.Add($"{path}: Request and record have different types.");
                return;
            }

            switch (element1.ValueKind)
            {
                case JsonValueKind.Object:
                    {
                        var properties1 = element1.EnumerateObject();
                        var properties2 = element2.EnumerateObject();

                        var propDict1 = new Dictionary<string, JsonElement>();
                        var propDict2 = new Dictionary<string, JsonElement>();

                        foreach (var prop in properties1)
                            propDict1[prop.Name] = prop.Value;

                        foreach (var prop in properties2)
                            propDict2[prop.Name] = prop.Value;

                        foreach (var key in propDict1.Keys)
                        {
                            if (propDict2.ContainsKey(key))
                            {
                                CompareElements(propDict1[key], propDict2[key], differences, $"{path}.{key}");
                            }
                            else
                            {
                                differences.Add($"{path}.{key}: Missing in request JSON");
                            }
                        }

                        foreach (var key in propDict2.Keys)
                        {
                            if (!propDict1.ContainsKey(key))
                            {
                                differences.Add($"{path}.{key}: Missing in record JSON");
                            }
                        }

                        break;
                    }
                case JsonValueKind.Array:
                    {
                        var array1 = element1.EnumerateArray();
                        var array2 = element2.EnumerateArray();

                        int index = 0;
                        var enum1 = array1.GetEnumerator();
                        var enum2 = array2.GetEnumerator();

                        while (enum1.MoveNext() && enum2.MoveNext())
                        {
                            CompareElements(enum1.Current, enum2.Current, differences, $"{path}[{index}]");
                            index++;
                        }

                        while (enum1.MoveNext())
                        {
                            differences.Add($"{path}[{index}]: Extra element in request JSON");
                            index++;
                        }

                        while (enum2.MoveNext())
                        {
                            differences.Add($"{path}[{index}]: Extra element in record JSON");
                            index++;
                        }

                        break;
                    }
                case JsonValueKind.String:
                    {
                        if (element1.GetString() != element2.GetString())
                        {
                            differences.Add($"{path}: \"{element1.GetString()}\" != \"{element2.GetString()}\"");
                        }
                        break;
                    }
                case JsonValueKind.Number:
                    {
                        if (element1.GetDecimal() != element2.GetDecimal())
                        {
                            differences.Add($"{path}: {element1.GetDecimal()} != {element2.GetDecimal()}");
                        }
                        break;
                    }
                case JsonValueKind.True:
                case JsonValueKind.False:
                    {
                        if (element1.GetBoolean() != element2.GetBoolean())
                        {
                            differences.Add($"{path}: {element1.GetBoolean()} != {element2.GetBoolean()}");
                        }
                        break;
                    }
                case JsonValueKind.Null:
                    {
                        // Both are null, nothing to compare
                        break;
                    }
                default:
                    {
                        differences.Add($"{path}: Unhandled value kind {element1.ValueKind}");
                        break;
                    }
            }
        }