From d61b521fe636bec7e68612fc55bb2b282ba51cc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Deniz=20=C4=B0rgin?= Date: Sat, 17 Oct 2026 22:26:59 +0300 Subject: [PATCH] test: thirteen more declared-error doors become table rows, each area's rows in its own slice TST-E4a P04a. The Config, Credentials, Debug, FileWrite and Forms contract classes' declared-error door methods become rows of DeclaredErrorTests, each now proven on both the throwing and the NoThrow spine and traced to its declaration in the pinned spec. Each area's rows live in its slice (/DeclaredErrors.cs, a static Rows() of at most 80 lines), and EveryDoor() concatenates them; the pilot row moves to Worktrees/WorktreesDeclaredErrors.cs. The clone baseline drops the replaced methods' duplicates; jscpd regroups the remaining declared-error duplicates in untouched files under new fingerprints, and the totals fall. --- .../Common/Errors/DeclaredErrorTests.cs | 28 ++- .../Config/ConfigClientContractTests.cs | 52 ------ .../Config/ConfigDeclaredErrors.cs | 67 ++++++++ .../CredentialsClientContractTests.cs | 58 ------- .../Credentials/CredentialsDeclaredErrors.cs | 71 ++++++++ .../Debug/DebugClientContractTests.cs | 26 --- .../Debug/DebugDeclaredErrors.cs | 39 +++++ .../ExperimentalDeclaredErrors.cs | 31 ++++ .../Experimental/FileWriteContractTests.cs | 15 -- .../Forms/FormsClientContractTests.cs | 25 --- .../Forms/FormsDeclaredErrors.cs | 39 +++++ .../Worktrees/WorktreesDeclaredErrors.cs | 27 +++ tools/jscpd/tests.baseline.json | 162 +++++++----------- 13 files changed, 350 insertions(+), 290 deletions(-) create mode 100644 tests/OpenCode.Sdk.Tests/Config/ConfigDeclaredErrors.cs create mode 100644 tests/OpenCode.Sdk.Tests/Credentials/CredentialsDeclaredErrors.cs create mode 100644 tests/OpenCode.Sdk.Tests/Debug/DebugDeclaredErrors.cs create mode 100644 tests/OpenCode.Sdk.Tests/Experimental/ExperimentalDeclaredErrors.cs create mode 100644 tests/OpenCode.Sdk.Tests/Forms/FormsDeclaredErrors.cs create mode 100644 tests/OpenCode.Sdk.Tests/Worktrees/WorktreesDeclaredErrors.cs diff --git a/tests/OpenCode.Sdk.Tests/Common/Errors/DeclaredErrorTests.cs b/tests/OpenCode.Sdk.Tests/Common/Errors/DeclaredErrorTests.cs index 0b938b15..7f912c51 100644 --- a/tests/OpenCode.Sdk.Tests/Common/Errors/DeclaredErrorTests.cs +++ b/tests/OpenCode.Sdk.Tests/Common/Errors/DeclaredErrorTests.cs @@ -1,11 +1,15 @@ using System.Globalization; -using System.Net; using System.Text; using System.Text.Json; -using OpenCode.Sdk.Models; using OpenCode.Sdk.Tests.Common.Support; +using OpenCode.Sdk.Tests.Config; +using OpenCode.Sdk.Tests.Credentials; +using OpenCode.Sdk.Tests.Debug; +using OpenCode.Sdk.Tests.Experimental; +using OpenCode.Sdk.Tests.Forms; using OpenCode.Sdk.Tests.Harness; using OpenCode.Sdk.Tests.Support; +using OpenCode.Sdk.Tests.Worktrees; namespace OpenCode.Sdk.Tests.Common.Errors; @@ -13,20 +17,12 @@ public sealed class DeclaredErrorTests { public static IEnumerable> EveryDoor() => [ - static () => new( - "worktree.create:400:InvalidRequestError", - new DeclaredErrorDoor( - nameof(WorktreesClient.CreateWorktreeAsync), - "worktree.create", - "post", - "/api/worktree", - static async (client, options) => await client.Worktrees.CreateWorktreeAsync( - new WorktreeCreateRequest { ProjectId = "prj_1", Directory = "/repo/feature" }, options)), - HttpStatusCode.BadRequest, - WireBodyData.InvalidRequestError, - "InvalidRequestError", - typeof(InvalidRequestError), - "#/paths/~1api~1worktree/post/responses/400/content/application~1json/schema/anyOf/1"), + .. WorktreesDeclaredErrors.Rows(), + .. ConfigDeclaredErrors.Rows(), + .. CredentialsDeclaredErrors.Rows(), + .. DebugDeclaredErrors.Rows(), + .. ExperimentalDeclaredErrors.Rows(), + .. FormsDeclaredErrors.Rows(), ]; [Test] diff --git a/tests/OpenCode.Sdk.Tests/Config/ConfigClientContractTests.cs b/tests/OpenCode.Sdk.Tests/Config/ConfigClientContractTests.cs index 2366197b..3ccd467f 100644 --- a/tests/OpenCode.Sdk.Tests/Config/ConfigClientContractTests.cs +++ b/tests/OpenCode.Sdk.Tests/Config/ConfigClientContractTests.cs @@ -25,31 +25,6 @@ public async Task GetShellsAsync_Should_Return_The_Bare_Typed_List() await Assert.That(request.RequestUri).IsEqualTo(new Uri("http://localhost:4096/api/config/shell")); } - [Test] - public async Task GetShellsAsync_Should_Throw_The_Declared_400_Error() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.BadRequest, WireBodyData.InvalidRequestError); - - var exception = await Assert - .That(async () => _ = await scenario.Client.Config.GetShellsAsync()) - .Throws(); - - await Assert.That(exception!.Status).IsEqualTo(400); - await Assert.That(exception.Error).IsTypeOf(); - } - - [Test] - public async Task GetShellsAsync_Should_Return_The_401_Error_On_The_NoThrow_Spine() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.Unauthorized, WireBodyData.UnauthorizedError); - - var response = await scenario.Client.Config.GetShellsAsync(OpenCodeRequestOptions.NoThrow); - - await Assert.That(response.IsError).IsTrue(); - await Assert.That(response.Status).IsEqualTo(401); - await Assert.That(response.Error).IsTypeOf(); - } - [Test] [Arguments("pwsh")] [Arguments(null)] @@ -69,31 +44,4 @@ public async Task UpdateConfigAsync_Should_Send_The_Required_Nullable_Shell(stri await Assert.That(body.RootElement.EnumerateObject().Count()).IsEqualTo(1); await Assert.That(body.RootElement.GetProperty("shell").GetString()).IsEqualTo(shell); } - - [Test] - public async Task UpdateConfigAsync_Should_Throw_The_Declared_400_Error() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.BadRequest, WireBodyData.InvalidRequestError); - - var exception = await Assert - .That(async () => _ = await scenario.Client.Experimental.UpdateConfigAsync( - new ExperimentalConfigUpdateRequest { Shell = null, })) - .Throws(); - - await Assert.That(exception!.Status).IsEqualTo(400); - await Assert.That(exception.Error).IsTypeOf(); - } - - [Test] - public async Task UpdateConfigAsync_Should_Return_The_401_Error_On_The_NoThrow_Spine() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.Unauthorized, WireBodyData.UnauthorizedError); - - var response = await scenario.Client.Experimental.UpdateConfigAsync( - new ExperimentalConfigUpdateRequest { Shell = null, }, OpenCodeRequestOptions.NoThrow); - - await Assert.That(response.IsError).IsTrue(); - await Assert.That(response.Status).IsEqualTo(401); - await Assert.That(response.Error).IsTypeOf(); - } } diff --git a/tests/OpenCode.Sdk.Tests/Config/ConfigDeclaredErrors.cs b/tests/OpenCode.Sdk.Tests/Config/ConfigDeclaredErrors.cs new file mode 100644 index 00000000..e144d93f --- /dev/null +++ b/tests/OpenCode.Sdk.Tests/Config/ConfigDeclaredErrors.cs @@ -0,0 +1,67 @@ +using System.Net; +using OpenCode.Sdk.Models; +using OpenCode.Sdk.Tests.Common.Support; +using OpenCode.Sdk.Tests.Support; + +namespace OpenCode.Sdk.Tests.Config; + +public static class ConfigDeclaredErrors +{ + public static IEnumerable> Rows() => + [ + static () => new( + "config.shells:400:InvalidRequestError", + new DeclaredErrorDoor( + nameof(ConfigClient.GetShellsAsync), + "config.shells", + "get", + "/api/config/shell", + static async (client, options) => await client.Config.GetShellsAsync(options)), + HttpStatusCode.BadRequest, + WireBodyData.InvalidRequestError, + "InvalidRequestError", + typeof(InvalidRequestError), + "#/paths/~1api~1config~1shell/get/responses/400/content/application~1json/schema"), + static () => new( + "config.shells:401:UnauthorizedError", + new DeclaredErrorDoor( + nameof(ConfigClient.GetShellsAsync), + "config.shells", + "get", + "/api/config/shell", + static async (client, options) => await client.Config.GetShellsAsync(options)), + HttpStatusCode.Unauthorized, + WireBodyData.UnauthorizedError, + "UnauthorizedError", + typeof(UnauthorizedError), + "#/paths/~1api~1config~1shell/get/responses/401/content/application~1json/schema"), + static () => new( + "experimental.config.update:400:InvalidRequestError", + new DeclaredErrorDoor( + nameof(ExperimentalClient.UpdateConfigAsync), + "experimental.config.update", + "patch", + "/api/experimental/config", + static async (client, options) => await client.Experimental.UpdateConfigAsync( + new ExperimentalConfigUpdateRequest { Shell = null, }, options)), + HttpStatusCode.BadRequest, + WireBodyData.InvalidRequestError, + "InvalidRequestError", + typeof(InvalidRequestError), + "#/paths/~1api~1experimental~1config/patch/responses/400/content/application~1json/schema"), + static () => new( + "experimental.config.update:401:UnauthorizedError", + new DeclaredErrorDoor( + nameof(ExperimentalClient.UpdateConfigAsync), + "experimental.config.update", + "patch", + "/api/experimental/config", + static async (client, options) => await client.Experimental.UpdateConfigAsync( + new ExperimentalConfigUpdateRequest { Shell = null, }, options)), + HttpStatusCode.Unauthorized, + WireBodyData.UnauthorizedError, + "UnauthorizedError", + typeof(UnauthorizedError), + "#/paths/~1api~1experimental~1config/patch/responses/401/content/application~1json/schema"), + ]; +} diff --git a/tests/OpenCode.Sdk.Tests/Credentials/CredentialsClientContractTests.cs b/tests/OpenCode.Sdk.Tests/Credentials/CredentialsClientContractTests.cs index 5b26ca7b..cd4d0c44 100644 --- a/tests/OpenCode.Sdk.Tests/Credentials/CredentialsClientContractTests.cs +++ b/tests/OpenCode.Sdk.Tests/Credentials/CredentialsClientContractTests.cs @@ -39,25 +39,6 @@ await Assert.That(request.Body).IsEqualTo( "{\"integrationID\":\"openai\",\"label\":\"work\",\"value\":{\"type\":\"key\",\"key\":\"sk-test\"},\"activate\":true}"); } - [Test] - public async Task CreateCredentialAsync_Should_Return_The_Declared_409_Error_On_The_NoThrow_Spine() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.Conflict, WireBodyData.ConflictError); - - var response = await scenario.Client.Credentials.CreateCredentialAsync( - new CredentialCreateRequest - { - Id = "cred_1", - IntegrationId = "openai", - Value = new CredentialKey { Key = "sk-test" }, - }, - OpenCodeRequestOptions.NoThrow); - - await Assert.That(response.IsError).IsTrue(); - await Assert.That(response.Status).IsEqualTo(409); - await Assert.That(response.Error).IsTypeOf(); - } - [Test] public async Task CreateCredentialAsync_Should_Send_A_Caller_Chosen_Id() { @@ -96,19 +77,6 @@ public async Task ListCredentialsAsync_Should_Read_Both_Value_Arms() await Assert.That(request.Body).IsNull(); } - [Test] - public async Task ListCredentialsAsync_Should_Throw_The_Declared_401_Error() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.Unauthorized, WireBodyData.UnauthorizedError); - - var exception = await Assert - .That(async () => _ = await scenario.Client.Credentials.ListCredentialsAsync()) - .Throws(); - - await Assert.That(exception!.Status).IsEqualTo(401); - await Assert.That(exception.Error).IsTypeOf(); - } - [Test] public async Task UpdateCredentialAsync_Should_Send_The_Patch_Body_On_The_Flat_Id_Route() { @@ -140,30 +108,4 @@ public async Task ActivateCredentialAsync_Should_Post_On_The_Flat_Id_Route() await Assert.That(request.Method.Method).IsEqualTo("POST"); await Assert.That(request.RequestUri).IsEqualTo(new Uri("http://localhost:4096/api/credential/cred_1/activate")); } - - [Test] - public async Task ActivateCredentialAsync_Should_Throw_The_Declared_400_Error() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.BadRequest, WireBodyData.InvalidRequestError); - - var exception = await Assert - .That(async () => _ = await scenario.Client.Credentials.ActivateCredentialAsync("cred_1")) - .Throws(); - - await Assert.That(exception!.Status).IsEqualTo(400); - await Assert.That(exception.Error).IsTypeOf(); - } - - [Test] - public async Task ActivateCredentialAsync_Should_Return_The_401_Error_On_The_NoThrow_Spine() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.Unauthorized, WireBodyData.UnauthorizedError); - - var response = await scenario.Client.Credentials.ActivateCredentialAsync( - "cred_1", requestOptions: OpenCodeRequestOptions.NoThrow); - - await Assert.That(response.IsError).IsTrue(); - await Assert.That(response.Status).IsEqualTo(401); - await Assert.That(response.Error).IsTypeOf(); - } } diff --git a/tests/OpenCode.Sdk.Tests/Credentials/CredentialsDeclaredErrors.cs b/tests/OpenCode.Sdk.Tests/Credentials/CredentialsDeclaredErrors.cs new file mode 100644 index 00000000..173e2219 --- /dev/null +++ b/tests/OpenCode.Sdk.Tests/Credentials/CredentialsDeclaredErrors.cs @@ -0,0 +1,71 @@ +using System.Net; +using OpenCode.Sdk.Models; +using OpenCode.Sdk.Tests.Common.Support; +using OpenCode.Sdk.Tests.Support; + +namespace OpenCode.Sdk.Tests.Credentials; + +public static class CredentialsDeclaredErrors +{ + public static IEnumerable> Rows() => + [ + static () => new( + "credential.create:409:ConflictError", + new DeclaredErrorDoor( + nameof(CredentialsClient.CreateCredentialAsync), + "credential.create", + "post", + "/api/credential", + static async (client, options) => await client.Credentials.CreateCredentialAsync( + new CredentialCreateRequest + { + Id = "cred_1", + IntegrationId = "openai", + Value = new CredentialKey { Key = "sk-test" }, + }, options)), + HttpStatusCode.Conflict, + WireBodyData.ConflictError, + "ConflictError", + typeof(ConflictError), + "#/paths/~1api~1credential/post/responses/409/content/application~1json/schema"), + static () => new( + "credential.list:401:UnauthorizedError", + new DeclaredErrorDoor( + nameof(CredentialsClient.ListCredentialsAsync), + "credential.list", + "get", + "/api/credential", + static async (client, options) => await client.Credentials.ListCredentialsAsync(options)), + HttpStatusCode.Unauthorized, + WireBodyData.UnauthorizedError, + "UnauthorizedError", + typeof(UnauthorizedError), + "#/paths/~1api~1credential/get/responses/401/content/application~1json/schema"), + static () => new( + "credential.activate:400:InvalidRequestError", + new DeclaredErrorDoor( + nameof(CredentialsClient.ActivateCredentialAsync), + "credential.activate", + "post", + "/api/credential/{credentialID}/activate", + static async (client, options) => await client.Credentials.ActivateCredentialAsync("cred_1", options)), + HttpStatusCode.BadRequest, + WireBodyData.InvalidRequestError, + "InvalidRequestError", + typeof(InvalidRequestError), + "#/paths/~1api~1credential~1{credentialID}~1activate/post/responses/400/content/application~1json/schema"), + static () => new( + "credential.activate:401:UnauthorizedError", + new DeclaredErrorDoor( + nameof(CredentialsClient.ActivateCredentialAsync), + "credential.activate", + "post", + "/api/credential/{credentialID}/activate", + static async (client, options) => await client.Credentials.ActivateCredentialAsync("cred_1", options)), + HttpStatusCode.Unauthorized, + WireBodyData.UnauthorizedError, + "UnauthorizedError", + typeof(UnauthorizedError), + "#/paths/~1api~1credential~1{credentialID}~1activate/post/responses/401/content/application~1json/schema"), + ]; +} diff --git a/tests/OpenCode.Sdk.Tests/Debug/DebugClientContractTests.cs b/tests/OpenCode.Sdk.Tests/Debug/DebugClientContractTests.cs index 2ea7f63b..711ee6f9 100644 --- a/tests/OpenCode.Sdk.Tests/Debug/DebugClientContractTests.cs +++ b/tests/OpenCode.Sdk.Tests/Debug/DebugClientContractTests.cs @@ -1,5 +1,4 @@ using System.Net; -using OpenCode.Sdk.Models; using OpenCode.Sdk.Tests.Support; namespace OpenCode.Sdk.Tests.Debug; @@ -30,29 +29,4 @@ public async Task ListLocationsAsync_Should_Return_An_Empty_List() await Assert.That(response.Locations).IsEmpty(); } - - [Test] - public async Task ListLocationsAsync_Should_Throw_The_Declared_400_Error() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.BadRequest, WireBodyData.InvalidRequestError); - - var exception = await Assert - .That(async () => _ = await scenario.Client.Debug.ListLocationsAsync()) - .Throws(); - - await Assert.That(exception!.Status).IsEqualTo(400); - await Assert.That(exception.Error).IsTypeOf(); - } - - [Test] - public async Task ListLocationsAsync_Should_Return_The_401_Error_On_The_NoThrow_Spine() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.Unauthorized, WireBodyData.UnauthorizedError); - - var response = await scenario.Client.Debug.ListLocationsAsync(requestOptions: OpenCodeRequestOptions.NoThrow); - - await Assert.That(response.IsError).IsTrue(); - await Assert.That(response.Status).IsEqualTo(401); - await Assert.That(response.Error).IsTypeOf(); - } } diff --git a/tests/OpenCode.Sdk.Tests/Debug/DebugDeclaredErrors.cs b/tests/OpenCode.Sdk.Tests/Debug/DebugDeclaredErrors.cs new file mode 100644 index 00000000..5a003e7e --- /dev/null +++ b/tests/OpenCode.Sdk.Tests/Debug/DebugDeclaredErrors.cs @@ -0,0 +1,39 @@ +using System.Net; +using OpenCode.Sdk.Models; +using OpenCode.Sdk.Tests.Common.Support; +using OpenCode.Sdk.Tests.Support; + +namespace OpenCode.Sdk.Tests.Debug; + +public static class DebugDeclaredErrors +{ + public static IEnumerable> Rows() => + [ + static () => new( + "debug.location.list:400:InvalidRequestError", + new DeclaredErrorDoor( + nameof(DebugClient.ListLocationsAsync), + "debug.location.list", + "get", + "/api/debug/location", + static async (client, options) => await client.Debug.ListLocationsAsync(requestOptions: options)), + HttpStatusCode.BadRequest, + WireBodyData.InvalidRequestError, + "InvalidRequestError", + typeof(InvalidRequestError), + "#/paths/~1api~1debug~1location/get/responses/400/content/application~1json/schema"), + static () => new( + "debug.location.list:401:UnauthorizedError", + new DeclaredErrorDoor( + nameof(DebugClient.ListLocationsAsync), + "debug.location.list", + "get", + "/api/debug/location", + static async (client, options) => await client.Debug.ListLocationsAsync(requestOptions: options)), + HttpStatusCode.Unauthorized, + WireBodyData.UnauthorizedError, + "UnauthorizedError", + typeof(UnauthorizedError), + "#/paths/~1api~1debug~1location/get/responses/401/content/application~1json/schema"), + ]; +} diff --git a/tests/OpenCode.Sdk.Tests/Experimental/ExperimentalDeclaredErrors.cs b/tests/OpenCode.Sdk.Tests/Experimental/ExperimentalDeclaredErrors.cs new file mode 100644 index 00000000..4029f738 --- /dev/null +++ b/tests/OpenCode.Sdk.Tests/Experimental/ExperimentalDeclaredErrors.cs @@ -0,0 +1,31 @@ +using System.Net; +using OpenCode.Sdk.Models; +using OpenCode.Sdk.Tests.Common.Support; +using OpenCode.Sdk.Tests.Support; + +namespace OpenCode.Sdk.Tests.Experimental; + +public static class ExperimentalDeclaredErrors +{ + public static IEnumerable> Rows() => + [ + static () => new( + "experimental.fs.write:400:InvalidRequestError", + new DeclaredErrorDoor( + nameof(ExperimentalClient.WriteFileAsync), + "experimental.fs.write", + "post", + "/api/experimental/fs/write", + static async (client, options) => + { + using var content = new MemoryStream([0x01]); + return await client.Experimental.WriteFileAsync( + new ExperimentalFsWriteRequest { Path = "a.bin" }, content, options); + }), + HttpStatusCode.BadRequest, + WireBodyData.InvalidRequestError, + "InvalidRequestError", + typeof(InvalidRequestError), + "#/paths/~1api~1experimental~1fs~1write/post/responses/400/content/application~1json/schema"), + ]; +} diff --git a/tests/OpenCode.Sdk.Tests/Experimental/FileWriteContractTests.cs b/tests/OpenCode.Sdk.Tests/Experimental/FileWriteContractTests.cs index 748cf143..b273c26c 100644 --- a/tests/OpenCode.Sdk.Tests/Experimental/FileWriteContractTests.cs +++ b/tests/OpenCode.Sdk.Tests/Experimental/FileWriteContractTests.cs @@ -26,19 +26,4 @@ await Assert.That(recorded.RequestUri!.AbsoluteUri) await Assert.That(response.File.Path).IsEqualTo("/repo/assets/logo.bin"); await Assert.That(response.Location.Directory).IsEqualTo(WireBodyData.ResolvedDirectory); } - - [Test] - public async Task WriteFileAsync_Should_Throw_The_Declared_400_Error() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.BadRequest, WireBodyData.InvalidRequestError); - using var content = new MemoryStream([0x01]); - - var exception = await Assert - .That(async () => _ = await scenario.Client.Experimental.WriteFileAsync( - new ExperimentalFsWriteRequest { Path = "a.bin" }, content)) - .Throws(); - - await Assert.That(exception!.Status).IsEqualTo(400); - await Assert.That(exception.Error).IsTypeOf(); - } } diff --git a/tests/OpenCode.Sdk.Tests/Forms/FormsClientContractTests.cs b/tests/OpenCode.Sdk.Tests/Forms/FormsClientContractTests.cs index 0a1a687e..73e39adf 100644 --- a/tests/OpenCode.Sdk.Tests/Forms/FormsClientContractTests.cs +++ b/tests/OpenCode.Sdk.Tests/Forms/FormsClientContractTests.cs @@ -35,29 +35,4 @@ public async Task ListFormsAsync_Should_Return_An_Empty_List() await Assert.That(response.Forms).IsEmpty(); } - - [Test] - public async Task ListFormsAsync_Should_Throw_The_Declared_400_Error() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.BadRequest, WireBodyData.InvalidRequestError); - - var exception = await Assert - .That(async () => _ = await scenario.Client.Forms.ListFormsAsync()) - .Throws(); - - await Assert.That(exception!.Status).IsEqualTo(400); - await Assert.That(exception.Error).IsTypeOf(); - } - - [Test] - public async Task ListFormsAsync_Should_Return_The_401_Error_On_The_NoThrow_Spine() - { - using var scenario = ContractScenario.Responding(HttpStatusCode.Unauthorized, WireBodyData.UnauthorizedError); - - var response = await scenario.Client.Forms.ListFormsAsync(requestOptions: OpenCodeRequestOptions.NoThrow); - - await Assert.That(response.IsError).IsTrue(); - await Assert.That(response.Status).IsEqualTo(401); - await Assert.That(response.Error).IsTypeOf(); - } } diff --git a/tests/OpenCode.Sdk.Tests/Forms/FormsDeclaredErrors.cs b/tests/OpenCode.Sdk.Tests/Forms/FormsDeclaredErrors.cs new file mode 100644 index 00000000..6635d4a8 --- /dev/null +++ b/tests/OpenCode.Sdk.Tests/Forms/FormsDeclaredErrors.cs @@ -0,0 +1,39 @@ +using System.Net; +using OpenCode.Sdk.Models; +using OpenCode.Sdk.Tests.Common.Support; +using OpenCode.Sdk.Tests.Support; + +namespace OpenCode.Sdk.Tests.Forms; + +public static class FormsDeclaredErrors +{ + public static IEnumerable> Rows() => + [ + static () => new( + "form.list:400:InvalidRequestError", + new DeclaredErrorDoor( + nameof(FormsClient.ListFormsAsync), + "form.list", + "get", + "/api/form", + static async (client, options) => await client.Forms.ListFormsAsync(requestOptions: options)), + HttpStatusCode.BadRequest, + WireBodyData.InvalidRequestError, + "InvalidRequestError", + typeof(InvalidRequestError), + "#/paths/~1api~1form/get/responses/400/content/application~1json/schema"), + static () => new( + "form.list:401:UnauthorizedError", + new DeclaredErrorDoor( + nameof(FormsClient.ListFormsAsync), + "form.list", + "get", + "/api/form", + static async (client, options) => await client.Forms.ListFormsAsync(requestOptions: options)), + HttpStatusCode.Unauthorized, + WireBodyData.UnauthorizedError, + "UnauthorizedError", + typeof(UnauthorizedError), + "#/paths/~1api~1form/get/responses/401/content/application~1json/schema"), + ]; +} diff --git a/tests/OpenCode.Sdk.Tests/Worktrees/WorktreesDeclaredErrors.cs b/tests/OpenCode.Sdk.Tests/Worktrees/WorktreesDeclaredErrors.cs new file mode 100644 index 00000000..4132ce3f --- /dev/null +++ b/tests/OpenCode.Sdk.Tests/Worktrees/WorktreesDeclaredErrors.cs @@ -0,0 +1,27 @@ +using System.Net; +using OpenCode.Sdk.Models; +using OpenCode.Sdk.Tests.Common.Support; +using OpenCode.Sdk.Tests.Support; + +namespace OpenCode.Sdk.Tests.Worktrees; + +public static class WorktreesDeclaredErrors +{ + public static IEnumerable> Rows() => + [ + static () => new( + "worktree.create:400:InvalidRequestError", + new DeclaredErrorDoor( + nameof(WorktreesClient.CreateWorktreeAsync), + "worktree.create", + "post", + "/api/worktree", + static async (client, options) => await client.Worktrees.CreateWorktreeAsync( + new WorktreeCreateRequest { ProjectId = "prj_1", Directory = "/repo/feature" }, options)), + HttpStatusCode.BadRequest, + WireBodyData.InvalidRequestError, + "InvalidRequestError", + typeof(InvalidRequestError), + "#/paths/~1api~1worktree/post/responses/400/content/application~1json/schema/anyOf/1"), + ]; +} diff --git a/tools/jscpd/tests.baseline.json b/tools/jscpd/tests.baseline.json index 86ca1a8e..fa6c116c 100644 --- a/tools/jscpd/tests.baseline.json +++ b/tools/jscpd/tests.baseline.json @@ -3,28 +3,24 @@ "fingerprints": { "0020688adbb7ffea": 1, "00342d539c7b0bf9": 1, - "00aab1347c60e619": 1, "01417d72ad1b123c": 1, "01b50a050ff5cb57": 1, - "02c449784785f5e1": 1, + "01dcc53ff3eec92e": 1, + "0281a275a0fcf9f5": 1, + "02d421174ecab381": 1, "030445ef25b69be7": 1, "030b9be65c2b2225": 1, "032245d683ed5066": 1, "0341de072c280e0e": 2, "03f0da59b2a78217": 1, "047178ad85b36704": 1, - "053cf7003742af8b": 1, - "05990412764d4af8": 1, "059dcd6e0a494338": 1, - "05bec1db549b3145": 1, "060d60ecdc435655": 1, - "0646131256062ec7": 1, - "06963808d80f8635": 1, + "06656fd8e84d7308": 1, "06f41df1aeaf1cd9": 1, "073ba1f3be6c91d0": 1, "073d220255049f78": 1, "081ae509f53be7a5": 1, - "08419195c9d82a48": 1, "08c890a54f4dc2a8": 1, "08f771f140cb08bb": 1, "0915fed6b837aff8": 1, @@ -34,61 +30,52 @@ "098fb3bcb2fb04a3": 1, "09cdd0045baeeb79": 1, "0a0c79f212dac8aa": 1, + "0a3c56da01d57546": 1, "0a6e5c2d3b8c81ff": 1, "0a83952fafd4de0d": 1, "0b1dd9528bf9f4d7": 1, - "0bf07eca2ad5d37a": 1, "0c4aa6cdd20ff426": 1, "0c53a2dd00579986": 1, "0c6ad1b72d1c5abd": 1, "0cee267a64eb44dc": 1, "0d494a1b361ea0f6": 1, "0d59c107c28482f6": 1, - "0e3563f01a4c7340": 1, "0ed982ddb7f8699d": 1, - "0edc37ae240b7c35": 1, "0ef0fc8554074249": 1, "0f55f7d7adfa2f82": 1, "0faa099538e4e7a0": 1, "0fcc7cca1b6402dd": 1, - "0ffa9abf9d9e844e": 1, "10003a5ebdb1faa9": 1, "1035e50fc18d0089": 1, "10ae734f6c09cd4d": 1, + "10b1f125bff80a24": 1, "113cc076f3fdaac2": 1, "116939c0012f36db": 1, "118f6000645c9441": 1, "11bf507ea1387ebc": 1, "11e6156620b2560f": 1, - "11ee0180b37b5d87": 1, "125ee26a2b20b167": 1, "13211ae1b77d178e": 1, - "1363ad233bb49d6b": 1, "139a4466552f7894": 1, "13ad4ac3b5dbd5d7": 1, "13fa62aa808a28cb": 1, - "141c9b35d283a1cc": 1, "14284878346f6672": 1, - "144da272b2295a00": 1, "14f3cf459e8fd59e": 1, "14f4b594979ef4be": 1, - "15f6943efefbba82": 1, + "1541fbb4d4169e3b": 1, "15f72a1f46f3211c": 1, - "16581e5dac5d2421": 1, "171c27993e2f8380": 1, "17537e2a94773132": 1, + "17ab2b36ae54f58c": 1, + "1893ade463908aa8": 1, "18b20d9b8321f296": 1, "1909d5d413d0fafa": 1, - "196f4000011d069a": 1, - "198316bae932a25a": 1, "1af631b28fef999f": 1, "1b00c86157f39774": 1, "1b17fdf1bf126048": 1, "1b4f0f0a741b6050": 1, "1b54291af2e1e368": 1, - "1be556ac421cb7ec": 1, "1c1e187804bcbe79": 1, - "1d5da73d305a0798": 1, "1de0e7ea7cfbd872": 1, "1e9a2448f05cb633": 1, "1ee3129fd27ce7fc": 1, @@ -99,9 +86,7 @@ "20f47cefc98df1f0": 1, "210bbefc7e3a3805": 1, "2168c4bc0179c8db": 1, - "2179550e5407130d": 1, "21fecd279dd4bb07": 1, - "2237d7645b5fdfe5": 1, "22516ea0ae540c5d": 1, "227c14e04277d803": 1, "227dd03cf78a874e": 1, @@ -123,56 +108,53 @@ "289e70c9f4f42e6b": 1, "28d4e0800dd0bcb2": 1, "28dc26ce0d1fa7ec": 1, - "294a68123ffbfe27": 1, "29e2d3f4c6ced0a9": 1, "2a2ea864e10f10a0": 1, - "2a6fba049050425f": 1, "2bef63e501d18ed2": 1, "2cce43ebc1614860": 1, "2cd64c5a0bd7b129": 1, "2d01f1bea1f9ea7e": 1, "2d0c7764aa30effc": 1, - "2e10753f9a336f97": 1, "2e6446a9c3e54be2": 1, "2ebc929ec99531d7": 1, "2ef093de84b22985": 1, "2fa52323893c6990": 1, "2fce9f9be54d9810": 1, "2fcfde38c702a305": 1, + "2fd59fd21a10a274": 1, "30024875e03c93af": 1, "303aee7f7b8af88f": 1, "3081885a80a22be3": 1, "3095017bef402cf6": 1, + "30bb2b9ad95556f7": 1, "30c6457c90ba767e": 1, + "30ced3581af45822": 1, + "30cf7167ef1b22a3": 1, "31079b601cabad85": 1, "325aedadc9c51610": 1, - "32a22f84426c274c": 1, "32a53e20ee7c711b": 1, - "338595f92b8c9b2c": 1, + "34000b667aa1909e": 1, "34812987b8a4a722": 1, - "34ff66db689cfea4": 1, + "34fcf0ae76620da9": 1, "350995582d58fa70": 1, "365bc439e50e1c16": 1, "366c2d108bd284de": 1, "36c9a7fe23bd443f": 1, + "371c4674c25c1ba2": 1, "3787bbf8fd3bb831": 1, - "379f472c314886ca": 1, "37e7cf7d45ffba52": 1, "381a9b351137f9ca": 1, "3882460d4ac3aa39": 1, "395bcea3b3a0f37b": 1, - "39981a4a4d340082": 4, + "39d2972d41c80376": 1, + "3a246ada37b9d048": 1, "3a31a52bec51fb1d": 1, "3a87c8a45e85cc43": 1, - "3a8ac0fd2e0c79a7": 1, "3aa741762878529d": 1, - "3b290eb15830d924": 1, "3b4ee00b9fd149f5": 1, "3b71e78270640ef3": 1, "3c605c52befef8a8": 1, "3c72e0db609061c0": 1, - "3ca9e998947ac50c": 1, - "3d55c26e1ecea078": 1, "3d9c303176f75e03": 1, "3dd4aea62c719f68": 1, "3dec5ec598cf3e79": 1, @@ -185,10 +167,9 @@ "3f1d04fcf9712e5d": 1, "3f3dbe95e1417a1b": 3, "3f95418f86463b66": 1, - "40385632dadab4ac": 1, + "40dcbe1aa5ea0aa6": 1, "41005cc85152f877": 1, "410855c256ca33cf": 1, - "411bf938cdbb8b64": 1, "411f04f073e9ad3f": 1, "4192fdb04dccceeb": 1, "4202e901bcb4f8ba": 1, @@ -197,11 +178,11 @@ "442313bd038e5928": 1, "44259b731f378b4b": 1, "4489253ca84315db": 1, - "46ca0d8e7e3a35ba": 1, "479fdc49d7da2d6e": 1, "47c6dec036a94d60": 1, "47d341670708569a": 1, "482c654299e74350": 1, + "483ed1bb08a9eef3": 1, "48c83373cc2d7d8d": 1, "492f8010b57edfcf": 1, "49432516d8bdce34": 1, @@ -218,11 +199,13 @@ "4e9f7bbcbfcdf308": 1, "50c75dddf97e272d": 1, "50c8491cd38b65bf": 1, + "51fb3f0dec051296": 1, "51fe16f43bda14c9": 1, "523b54f16719c5d5": 1, "52c3af1ca095f904": 1, "54a00ea64bca1d6f": 1, "54a6b2a26aec6926": 1, + "54b81fbb791e6864": 1, "54b9c19635b2d532": 1, "554f27198300c077": 1, "557d9ce8017ed9e9": 1, @@ -233,12 +216,13 @@ "567e66ef84568376": 2, "573c75d83c9a3c95": 1, "57470feca6bbb65f": 1, - "57ed9a2b57cf3418": 1, "57f025d61c1ae125": 1, "580bb3a45cc1aa00": 1, + "582bada14b0680c6": 1, "5890b6797611cdbf": 1, "58cf3aedc0f4f1c5": 1, "58df2dce6a57ddc3": 1, + "592128a9b607f5ab": 1, "5977e81f73804251": 1, "5ae402699aab9b4f": 1, "5b5f89cf29e631cb": 1, @@ -248,35 +232,29 @@ "5c10d3e20ff8a618": 1, "5c956c46330fb9c3": 1, "5cb2e7e9a7e11a37": 1, - "5d4b7662ce8a11ef": 1, "5d5ef92942ea8a4b": 1, - "5dc4ace824586d3d": 1, + "5de3f61eebf4f087": 1, "5e13371fd2b2249a": 1, "5f5853703072392b": 1, "5f76879862027b63": 1, - "5fb568ba7ba65e9e": 1, "5fc40824eff9ddbe": 1, "5fce21230688a4cc": 1, "5fea5678f28a491f": 1, - "6168f0be77f3d62e": 1, - "61aec69f93ee31a3": 1, "61e86a6218889bef": 1, "620efa04847bf466": 1, "621414e77f14a6ae": 1, "627b537ce0eab7f7": 1, "62e4b3096108aa49": 1, - "634f7d1273f299c5": 1, "63726760a9f9dac3": 1, "638060fdb01ef26f": 1, "63ccee6cade2a08c": 1, - "63cfa7e6ae3eeca8": 1, - "63d25b3e282d370c": 1, "645f364bb0fb02ea": 1, "647d48d7086c2f8d": 1, - "656fb8b6f18ddd4f": 1, + "64c07f90ee3979fc": 1, "65c592402d3c35db": 1, "666a7f0d59bdfda9": 1, "673cdefbc0e27446": 1, + "674b01d92c72d2fa": 1, "67f863244c398a2e": 1, "686f4cbec8a0fd92": 1, "687d5ab065e65e16": 1, @@ -286,15 +264,15 @@ "6b1a411c7888c5c6": 1, "6b53f281286caa87": 1, "6b5b7b4be4793cb7": 1, - "6b916dc4fa22b135": 1, "6ba2cd7a4868cb82": 1, "6bbbe6bbf34d4b4a": 1, "6bc1a56f488e732f": 1, + "6c143e6d5b470a14": 1, "6c383a49efeb60f2": 1, "6c8b4fa34ddcf1cf": 1, - "6ca6666a4adca176": 1, "6cc50d702b0cf2cf": 1, "6ce49ad646f4a55d": 1, + "6ce7d068cf7d63e8": 1, "6d2315e42adf5051": 1, "6d348ca9871cd43b": 1, "6e28853461e0f610": 1, @@ -305,7 +283,9 @@ "6ed8b7b89c38fd7f": 1, "6ee3e67f6a10362e": 1, "6efa92670898d4c4": 1, + "6fd6a008b9edbcad": 1, "7015815c99e52132": 1, + "706c80b864b19699": 1, "70b546f19e61694e": 1, "70e78f68bbb3f8b1": 1, "710c8abd019e2510": 1, @@ -318,20 +298,18 @@ "7438b1eeebb9c879": 1, "74ab566488e0a7b5": 1, "74bad6b365aeb9ef": 1, - "74de226107a47ba9": 1, + "753b739aff6551a0": 1, "755f26525b4fa26d": 1, "75aa297e7148b393": 1, "75e50c1abd5451b7": 1, "7635ce12f398b4fe": 1, - "766be0553c361cb9": 1, "76c1f1da5348b1b2": 1, - "76d04a6e44d1a740": 1, "774ec2e63be4fa1d": 1, "776de12b3d238a95": 1, - "78e8a6e0e1dacf98": 2, "7931cdb3741c2bb8": 1, "7943699770a884f4": 1, "796944d81a86d537": 1, + "7979ae4cefb88a17": 1, "7ab4fed3be6bca2c": 1, "7b16854634035afe": 1, "7b29c98f174c4aad": 1, @@ -342,11 +320,12 @@ "7da92939d4cdca00": 1, "7e09a30a918c9d2f": 1, "7ea14f75d7412427": 1, + "7eda659709115c79": 1, "7eda9e729d5869ca": 1, + "7ee9b7831ad8eeb9": 1, "7f8b8b1b7f8ac7c9": 1, "7ffcd9e9160f6b45": 1, "80cc7036ff095cb9": 1, - "80df9c5748306399": 1, "813356530d4e26c5": 1, "81ceb8987ba6c6e3": 1, "822934d2e089a207": 1, @@ -354,18 +333,13 @@ "829f99957c9b8f6f": 1, "82b68fdd16b7897c": 1, "82d68551f5be56b4": 1, - "839acebb16d2ae08": 1, "83cf50adb5c58985": 1, "84029d744b2215c7": 1, - "8440cd90df9d40a2": 1, - "8472d20a9e5c98f3": 1, - "849beb4a35a19b02": 1, "852958b905b8447d": 1, "852e00262bbefd12": 1, "859240ba1081004a": 1, "86629d252be8ae75": 1, "868313d60a5b083d": 1, - "86bb15479fb1c054": 1, "86c12e9faa8ad5f5": 1, "86fe3739deb7f33a": 1, "87158a808785d646": 1, @@ -374,13 +348,12 @@ "88490cc5463a3f5b": 1, "8990b0dcf557805f": 1, "89b40759e47ca8db": 1, - "89da94f6e3a69c7d": 1, "8a46989d4cc28dc2": 1, "8a7412eb78a37817": 1, "8a7e47959ada7043": 1, "8adcbd3f74c61e25": 1, + "8c76e81987466f89": 1, "8d130dcf8156d446": 1, - "8d45b44c776767ac": 1, "8dbef398f2f6ca1a": 1, "8dc9324256cda03a": 1, "8dec8c75da2a3305": 1, @@ -389,6 +362,7 @@ "8eac88e1c62578f7": 1, "8fb533df3ad5143e": 1, "8fcd5cc8f352b66c": 1, + "8fe075c7a07d77c5": 1, "90832cdd704dea7f": 1, "90911bb723015f18": 1, "90e2d0b4e68471be": 1, @@ -399,53 +373,39 @@ "923328e81f42dd0a": 1, "926d6280af25895e": 1, "92a23a8351ac6f5b": 1, - "93b9870af2c85e3c": 1, "93c7ffbef646d5bd": 1, - "943a5cceaaa0085d": 1, "94c3b038871234a4": 1, "950d14b87d7527d0": 1, "9676160daa1042e5": 1, "96af7cbd3e81daa0": 1, - "970216ae9df36cc1": 1, - "97067486c6a61874": 1, "9720751d6958956a": 1, - "972157a5302e9a7e": 1, "97413e8ff5b212d1": 1, - "9807478b48fb6f6a": 1, + "9857d1c8d34efbc3": 1, "98c9c3613c3d13da": 1, "98cf46d5ad809549": 1, "99234a03fbba27b8": 1, "99a67420ab2fdabd": 2, "99ab2f421483cca1": 1, - "99c1a94c67d2d719": 1, + "99d5a509c3e89f68": 1, "9a6d3e40660da4b5": 1, "9afaad4e059435eb": 1, "9b108a480389775d": 1, "9b714ea3ac0f8456": 1, "9b74c90c792496fd": 1, - "9b8eeada912f2fdb": 1, "9c209e8b6e1de814": 1, "9cb8a77612db0cc1": 1, "9cfd4908ab13a49c": 1, "9e3047781f98341c": 1, "9e6b559433dd1ad6": 1, "9ef5a8b0fb2c88e7": 1, - "9f5ef72c7dadba05": 1, "9fafa1f7c850803c": 1, - "a135f302ef98694b": 1, - "a1479175d09b61f9": 1, "a184ce7305097ded": 1, - "a2215818eb2b9264": 1, "a26cf9c1d71dd814": 1, "a2808814144175fa": 1, - "a2e0b515450c40c9": 1, "a304d611f14b1879": 1, - "a4dd036b8a4ee2c6": 1, "a4fe4a3bc845b057": 1, "a5397ab292d68e09": 1, "a5830a7e1b5d7975": 1, - "a58ea3d2f30dafb0": 1, - "a60791ba6ca05ea3": 1, "a644bdfbe6ec0044": 1, "a6ed47cf441cb578": 1, "a6f52664bc5db802": 1, @@ -453,13 +413,13 @@ "a7842c59f67aee3e": 1, "a7ce419852c3f4bb": 1, "a888b3cdad3d452d": 1, - "a9346b5654c885e9": 1, "a97d033336de820c": 1, "aa6af3c307cb3b1b": 1, "aa8c5d1539d3f39d": 1, "aac0860cac7db3e7": 1, "ab7663e0d5d61f22": 1, "abde2f4fe3b18cbc": 1, + "ac7e74bc96f5e3e2": 1, "ad57d9f03fc15ff1": 1, "aeab9ff4f97a36dc": 1, "aed35329e94d587d": 1, @@ -474,20 +434,20 @@ "b26ec09aa9c7d788": 1, "b4f1d187378630d2": 1, "b516fc87f57ff552": 1, - "b550ded1432f76f0": 1, "b56ef55aaf8bf7ba": 1, "b5ceb714638fb885": 1, "b671cd12c012a4b4": 1, "b6bc29c1437990b3": 1, "b6c6cd8bcb747bad": 1, - "b6daa0dba760d28d": 1, "b743264b7bbe4cc8": 1, "b75d56bd3c856ce4": 1, "b7bc3b0fc7ddd824": 1, "b8a1c1219d14b2ef": 1, + "b8be2338cae1b8ef": 1, "b914a2a0e162a6cf": 1, "b94d40e5ff48eda4": 1, "b9a2eed0186fe069": 1, + "b9bfa4f18870b9ac": 1, "ba1b81c7dacd299e": 1, "ba50dc522914af62": 1, "ba8d50bcd5dc7b3d": 1, @@ -500,34 +460,35 @@ "bd643f472e0aade2": 1, "bda28c725d186ab6": 1, "be0798753bf869c4": 1, + "be135361a689e451": 1, "be5d978af35181b1": 1, + "bf543efb3bf179b7": 1, + "bf770211d6bd31c8": 1, "c045ab0efa440e92": 1, "c0489425c5faec0f": 1, "c088cecf620e0f51": 1, "c0d167f4b47c21a7": 1, - "c11f44fc91e4017b": 1, + "c157d27a8b5765a1": 1, "c15cc20a8eb5b54e": 1, "c16ea8d19b585fb5": 1, "c194aa2d8a81a46b": 1, - "c1a2f7a561dac4db": 1, "c1aefaf779852373": 1, "c2a7b415518d2198": 1, "c377e5bc7e557f04": 1, - "c3d10f9320c71fb3": 1, - "c4e680d4321eb064": 1, "c59efd159d199356": 1, "c661cc78e1086df2": 1, "c6cce4bd6bf12d59": 1, + "c7337d0c6bea8644": 1, + "c91931715dd5082a": 1, + "c91fb1cb08b23e1c": 1, "c99b81e4ed3d76fb": 1, "c99b9aa8b9c89f27": 1, - "c9a68b22b15b2c4f": 1, "ca23d20b55a208df": 1, "ca52433f79ca9adf": 1, "cb72f4a5d460e4a8": 1, "ccc29e43c6a46325": 1, "cd14fbe400cc8d59": 1, "cd3551439395039c": 1, - "cda54e7da5f453e6": 1, "cdaf08c0a23a79fc": 1, "cdb94ac71ed58e49": 1, "ce8da66742f7122d": 1, @@ -535,24 +496,27 @@ "ceed549c863ce378": 1, "d13f1005c59d1243": 1, "d20c4d175159aa90": 1, - "d2b2d3f4d2d12da2": 1, + "d2c06a0c703438be": 1, "d342abdc73d730f0": 1, "d3b20c2767eef0a5": 1, "d4c8152dde214d7d": 1, "d5292d9905239a48": 1, + "d63808fd25912f20": 1, "d6a35efc223b35f0": 1, "d6ea4ed36005aa7c": 1, "d74223b54c1e2a1b": 1, + "d7469c3929718224": 1, "d7907d003a1d9fca": 1, + "d7951c97c2de818f": 1, "d829295842cacb52": 1, "d8472070574df3a0": 1, "d8ad9bee4beede6f": 1, "d9240b039fa378ae": 1, "d9554bbd56ab21a4": 1, "d98319a346958e32": 1, - "db4877ca7222c2ec": 1, "dbbafe3c109191e2": 1, "dbfef984a824b22e": 1, + "dd1bb0d0c2b16718": 1, "ddab192463f1ade4": 1, "de1435ae5e214376": 1, "de25b177ad221b80": 1, @@ -564,25 +528,25 @@ "e2ee78e03bfc94f9": 1, "e31e8d8bd1534204": 1, "e373307cca6d534f": 1, - "e3dddcb1f62c19b8": 1, "e445d35591b55a12": 1, "e4bc846ba130e160": 1, "e4c2843bfae3d310": 1, "e539609f53bb27d3": 1, "e59cfed574cd3816": 1, "e6460fb624a61900": 1, - "e73051f32d6330a4": 1, + "e7a6b9d06ebbf88b": 1, "e7e34567eac6357c": 1, "e824191acfff90d2": 1, "e82d1f2daab210ec": 1, "e841f14c1576be4d": 1, "e880470757e4f716": 1, "e9a4f95d6cc5b939": 1, + "eab34e08a59a2311": 1, "eaee9a41a0b130d0": 1, "eb0bbed02f67f613": 1, "ebec59933509b551": 1, "ebfeb862351f9538": 1, - "ec70223fd77aa9a2": 1, + "ec785bc2c1102cd0": 1, "ecefd42b73bc5e3c": 1, "ed10c82591b10abb": 1, "ed54a54bce71c168": 1, @@ -591,40 +555,42 @@ "ee052f70f2294a6c": 1, "ee1129d359884ce0": 1, "ee67ec3f21f2f9ce": 1, + "ee87169143e7aa75": 1, "ef106fb1d88f9f46": 1, - "ef2bdbe0fd231d31": 1, "ef308469d0166e41": 1, - "ef66f66d99229104": 1, "efef2b484435e6b7": 1, "f05e80092b0c0382": 1, "f102cbf1fab8a3d9": 1, + "f176cdac923927ee": 1, "f1812b941eb02542": 1, + "f1a3c57f33f8ce46": 1, "f1f7493a31b45480": 1, "f23a5dc8edef52e2": 1, "f279b2bb369cd7f1": 1, "f29076103ef900ac": 1, + "f30c07e6eec3d0d8": 1, "f366e666acd97894": 1, "f37319ef3f0e2c88": 1, "f3bfe6c708e83755": 1, "f3caece08093c884": 1, "f3d16a0490547ad5": 1, "f3dce7104ce46e6e": 1, + "f471bd1f58c00225": 1, "f47aa4755d742c49": 1, "f495e9854c7890f3": 1, + "f4b1049c2de5b4b5": 1, "f520e28c48e38582": 1, "f55fe2c61cba9980": 1, "f56fbb7ea258b2f9": 1, "f5ec696c51e41367": 1, "f668e8d378c310b8": 1, - "f71d2a3fb6a86a0c": 1, "f742e38e8b79f879": 1, "f79fd5643e4c8d70": 1, "f86d15fdd5782fbd": 1, "f92cfe72d5df13f4": 1, "f97e3c6571c051bf": 1, "f981c9a75c497712": 1, - "fa60d0adeedc899a": 1, - "fbac979cdba09e94": 1, + "fa95e7b4ee1bc5ae": 1, "fc541ae4aa953e03": 1, "fd0c45c2afe9457e": 1, "fd0d3c8ea8788bd8": 1,