From aa87d0085ec49c6d49c483f244c3315c3def000b Mon Sep 17 00:00:00 2001 From: tobias-tengler <45513122+tobias-tengler@users.noreply.github.com> Date: Thu, 15 Oct 2026 14:14:34 +0000 Subject: [PATCH 1/2] Fix test projects failing to compile on net8.0 due to JsonElement.DeepEquals --- .../Execution/Results/FetchResultStoreTests.cs | 4 ++-- .../McpFeatureCollectionArchiveTests.cs | 14 +++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Results/FetchResultStoreTests.cs b/src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Results/FetchResultStoreTests.cs index 62a754861c8..3c058cb744d 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Results/FetchResultStoreTests.cs +++ b/src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Results/FetchResultStoreTests.cs @@ -1,6 +1,7 @@ using System.Reflection; using System.Text; using System.Text.Json; +using System.Text.Json.Nodes; using HotChocolate.Buffers; using HotChocolate.Execution; using HotChocolate.Execution.Errors; @@ -2396,8 +2397,7 @@ enum Color { """ {"text":"caf\u00E9 \u0022quoted\u0022 \\ \n \uD83D\uDE00 \u00FCber","plain":"plain","color":"GREEN","plainColor":"RED","count":42,"ratio":1.5e3} """); - using var forwarded = JsonDocument.Parse(json); - Assert.True(JsonElement.DeepEquals(variables.RootElement, forwarded.RootElement)); + Assert.True(JsonNode.DeepEquals(JsonNode.Parse(variables.RootElement.GetRawText()), JsonNode.Parse(json))); } private static VariableValues CreateVariableValues( diff --git a/src/Nitro/Common/test/ChilliCream.Nitro.Adapters.Mcp.Packaging.Tests/McpFeatureCollectionArchiveTests.cs b/src/Nitro/Common/test/ChilliCream.Nitro.Adapters.Mcp.Packaging.Tests/McpFeatureCollectionArchiveTests.cs index a0493297986..d4075573770 100644 --- a/src/Nitro/Common/test/ChilliCream.Nitro.Adapters.Mcp.Packaging.Tests/McpFeatureCollectionArchiveTests.cs +++ b/src/Nitro/Common/test/ChilliCream.Nitro.Adapters.Mcp.Packaging.Tests/McpFeatureCollectionArchiveTests.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.Json; +using System.Text.Json.Nodes; using ChilliCream.Nitro.Adapters.Mcp.Extensions; using ChilliCream.Nitro.Adapters.Mcp.Serialization; using HotChocolate.Adapters.Mcp.Storage; @@ -112,14 +113,14 @@ await archive.AddToolAsync( var prompt = await readArchive.TryGetPromptAsync("GetUsersPrompt", TestContext.Current.CancellationToken); Assert.NotNull(prompt); - Assert.True(JsonElement.DeepEquals(promptSettings.RootElement, prompt.Settings.RootElement)); + Assert.True(DeepEquals(promptSettings.RootElement, prompt.Settings.RootElement)); prompt.Dispose(); using var tool = await readArchive.TryGetToolAsync("GetUsers", TestContext.Current.CancellationToken); Assert.NotNull(tool); Assert.Equal(operation, tool.Document.ToArray()); Assert.NotNull(tool.Settings); - Assert.True(JsonElement.DeepEquals(toolSettings.RootElement, tool.Settings.RootElement)); + Assert.True(DeepEquals(toolSettings.RootElement, tool.Settings.RootElement)); Assert.Equal(viewHtml, tool.ViewHtml?.ToArray()); } } @@ -157,12 +158,12 @@ public async Task UpdateMode_CanAddNewPromptsToExistingArchive() { var prompt1 = await readArchive.TryGetPromptAsync(name1, TestContext.Current.CancellationToken); Assert.NotNull(prompt1); - Assert.True(JsonElement.DeepEquals(settings1.RootElement, prompt1.Settings.RootElement)); + Assert.True(DeepEquals(settings1.RootElement, prompt1.Settings.RootElement)); prompt1.Dispose(); var prompt2 = await readArchive.TryGetPromptAsync(name2, TestContext.Current.CancellationToken); Assert.NotNull(prompt2); - Assert.True(JsonElement.DeepEquals(settings2.RootElement, prompt2.Settings.RootElement)); + Assert.True(DeepEquals(settings2.RootElement, prompt2.Settings.RootElement)); prompt2.Dispose(); } } @@ -500,7 +501,7 @@ public async Task AddPromptsAndTools_Together_StoresSeparately() var prompt = await archive.TryGetPromptAsync("GetUserPrompt", TestContext.Current.CancellationToken); Assert.NotNull(prompt); - Assert.True(JsonElement.DeepEquals(prompt.Settings.RootElement, prompt.Settings.RootElement)); + Assert.True(DeepEquals(prompt.Settings.RootElement, prompt.Settings.RootElement)); // assert - Tools using var tool = await archive.TryGetToolAsync("GetUser", TestContext.Current.CancellationToken); @@ -860,4 +861,7 @@ public void Dispose() stream.Dispose(); } } + + private static bool DeepEquals(JsonElement left, JsonElement right) + => JsonNode.DeepEquals(JsonNode.Parse(left.GetRawText()), JsonNode.Parse(right.GetRawText())); } From 054919927f764889f4ee7bfe3b27ccdcfff5eb0b Mon Sep 17 00:00:00 2001 From: tobias-tengler <45513122+tobias-tengler@users.noreply.github.com> Date: Thu, 15 Oct 2026 14:18:46 +0000 Subject: [PATCH 2/2] Keep JsonElement.DeepEquals on net9.0 and later behind a pragma --- .../Results/FetchResultStoreTests.cs | 12 ++++- .../McpFeatureCollectionArchiveTests.cs | 50 ++++++++++++++++--- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Results/FetchResultStoreTests.cs b/src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Results/FetchResultStoreTests.cs index 3c058cb744d..785910f14ae 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Results/FetchResultStoreTests.cs +++ b/src/HotChocolate/Fusion/test/Fusion.Execution.Tests/Execution/Results/FetchResultStoreTests.cs @@ -1,7 +1,9 @@ using System.Reflection; using System.Text; using System.Text.Json; +#if !NET9_0_OR_GREATER using System.Text.Json.Nodes; +#endif using HotChocolate.Buffers; using HotChocolate.Execution; using HotChocolate.Execution.Errors; @@ -2397,7 +2399,15 @@ enum Color { """ {"text":"caf\u00E9 \u0022quoted\u0022 \\ \n \uD83D\uDE00 \u00FCber","plain":"plain","color":"GREEN","plainColor":"RED","count":42,"ratio":1.5e3} """); - Assert.True(JsonNode.DeepEquals(JsonNode.Parse(variables.RootElement.GetRawText()), JsonNode.Parse(json))); + using var forwarded = JsonDocument.Parse(json); +#if NET9_0_OR_GREATER + Assert.True(JsonElement.DeepEquals(variables.RootElement, forwarded.RootElement)); +#else + Assert.True( + JsonNode.DeepEquals( + JsonNode.Parse(variables.RootElement.GetRawText()), + JsonNode.Parse(forwarded.RootElement.GetRawText()))); +#endif } private static VariableValues CreateVariableValues( diff --git a/src/Nitro/Common/test/ChilliCream.Nitro.Adapters.Mcp.Packaging.Tests/McpFeatureCollectionArchiveTests.cs b/src/Nitro/Common/test/ChilliCream.Nitro.Adapters.Mcp.Packaging.Tests/McpFeatureCollectionArchiveTests.cs index d4075573770..423a85e773b 100644 --- a/src/Nitro/Common/test/ChilliCream.Nitro.Adapters.Mcp.Packaging.Tests/McpFeatureCollectionArchiveTests.cs +++ b/src/Nitro/Common/test/ChilliCream.Nitro.Adapters.Mcp.Packaging.Tests/McpFeatureCollectionArchiveTests.cs @@ -1,6 +1,8 @@ using System.Text; using System.Text.Json; +#if !NET9_0_OR_GREATER using System.Text.Json.Nodes; +#endif using ChilliCream.Nitro.Adapters.Mcp.Extensions; using ChilliCream.Nitro.Adapters.Mcp.Serialization; using HotChocolate.Adapters.Mcp.Storage; @@ -113,14 +115,28 @@ await archive.AddToolAsync( var prompt = await readArchive.TryGetPromptAsync("GetUsersPrompt", TestContext.Current.CancellationToken); Assert.NotNull(prompt); - Assert.True(DeepEquals(promptSettings.RootElement, prompt.Settings.RootElement)); +#if NET9_0_OR_GREATER + Assert.True(JsonElement.DeepEquals(promptSettings.RootElement, prompt.Settings.RootElement)); +#else + Assert.True( + JsonNode.DeepEquals( + JsonNode.Parse(promptSettings.RootElement.GetRawText()), + JsonNode.Parse(prompt.Settings.RootElement.GetRawText()))); +#endif prompt.Dispose(); using var tool = await readArchive.TryGetToolAsync("GetUsers", TestContext.Current.CancellationToken); Assert.NotNull(tool); Assert.Equal(operation, tool.Document.ToArray()); Assert.NotNull(tool.Settings); - Assert.True(DeepEquals(toolSettings.RootElement, tool.Settings.RootElement)); +#if NET9_0_OR_GREATER + Assert.True(JsonElement.DeepEquals(toolSettings.RootElement, tool.Settings.RootElement)); +#else + Assert.True( + JsonNode.DeepEquals( + JsonNode.Parse(toolSettings.RootElement.GetRawText()), + JsonNode.Parse(tool.Settings.RootElement.GetRawText()))); +#endif Assert.Equal(viewHtml, tool.ViewHtml?.ToArray()); } } @@ -158,12 +174,26 @@ public async Task UpdateMode_CanAddNewPromptsToExistingArchive() { var prompt1 = await readArchive.TryGetPromptAsync(name1, TestContext.Current.CancellationToken); Assert.NotNull(prompt1); - Assert.True(DeepEquals(settings1.RootElement, prompt1.Settings.RootElement)); +#if NET9_0_OR_GREATER + Assert.True(JsonElement.DeepEquals(settings1.RootElement, prompt1.Settings.RootElement)); +#else + Assert.True( + JsonNode.DeepEquals( + JsonNode.Parse(settings1.RootElement.GetRawText()), + JsonNode.Parse(prompt1.Settings.RootElement.GetRawText()))); +#endif prompt1.Dispose(); var prompt2 = await readArchive.TryGetPromptAsync(name2, TestContext.Current.CancellationToken); Assert.NotNull(prompt2); - Assert.True(DeepEquals(settings2.RootElement, prompt2.Settings.RootElement)); +#if NET9_0_OR_GREATER + Assert.True(JsonElement.DeepEquals(settings2.RootElement, prompt2.Settings.RootElement)); +#else + Assert.True( + JsonNode.DeepEquals( + JsonNode.Parse(settings2.RootElement.GetRawText()), + JsonNode.Parse(prompt2.Settings.RootElement.GetRawText()))); +#endif prompt2.Dispose(); } } @@ -501,7 +531,14 @@ public async Task AddPromptsAndTools_Together_StoresSeparately() var prompt = await archive.TryGetPromptAsync("GetUserPrompt", TestContext.Current.CancellationToken); Assert.NotNull(prompt); - Assert.True(DeepEquals(prompt.Settings.RootElement, prompt.Settings.RootElement)); +#if NET9_0_OR_GREATER + Assert.True(JsonElement.DeepEquals(prompt.Settings.RootElement, prompt.Settings.RootElement)); +#else + Assert.True( + JsonNode.DeepEquals( + JsonNode.Parse(prompt.Settings.RootElement.GetRawText()), + JsonNode.Parse(prompt.Settings.RootElement.GetRawText()))); +#endif // assert - Tools using var tool = await archive.TryGetToolAsync("GetUser", TestContext.Current.CancellationToken); @@ -861,7 +898,4 @@ public void Dispose() stream.Dispose(); } } - - private static bool DeepEquals(JsonElement left, JsonElement right) - => JsonNode.DeepEquals(JsonNode.Parse(left.GetRawText()), JsonNode.Parse(right.GetRawText())); }