diff --git a/core b/core index e3f125e9f4..6c96b66348 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit e3f125e9f473dae33032a431da6b889c850af034 +Subproject commit 6c96b6634864a63ba46639314f6414614884e03f diff --git a/typespec-extension/changelog.md b/typespec-extension/changelog.md index 56e2b2c933..e36789d730 100644 --- a/typespec-extension/changelog.md +++ b/typespec-extension/changelog.md @@ -1,5 +1,11 @@ # Release History +## 0.38.3 (2026-01-15) + +Compatible with compiler 1.8.0. + +- Updated package dependencies to latest versions. + ## 0.38.2 (2026-01-14) Compatible with compiler 1.8.0. diff --git a/typespec-extension/package-lock.json b/typespec-extension/package-lock.json index 92960ed699..bf874a41b5 100644 --- a/typespec-extension/package-lock.json +++ b/typespec-extension/package-lock.json @@ -1,12 +1,12 @@ { "name": "@azure-tools/typespec-java", - "version": "0.38.2", + "version": "0.38.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@azure-tools/typespec-java", - "version": "0.38.2", + "version": "0.38.3", "license": "MIT", "dependencies": { "@autorest/codemodel": "~4.20.1", @@ -18,7 +18,7 @@ "@azure-tools/typespec-azure-core": "0.64.0", "@azure-tools/typespec-azure-resource-manager": "0.64.0", "@azure-tools/typespec-azure-rulesets": "0.64.0", - "@azure-tools/typespec-client-generator-core": "0.64.0", + "@azure-tools/typespec-client-generator-core": "0.64.1", "@azure-tools/typespec-liftr-base": "0.11.0", "@microsoft/api-extractor": "^7.55.2", "@types/js-yaml": "~4.0.9", @@ -43,7 +43,7 @@ "eslint-plugin-deprecation": "~3.0.0", "eslint-plugin-import": "^2.32.0", "eslint-plugin-unicorn": "^62.0.0", - "prettier": "~3.7.4", + "prettier": "~3.8.0", "rimraf": "~6.1.2", "typescript": "~5.9.3", "typescript-eslint": "^8.53.0", @@ -57,7 +57,7 @@ "@azure-tools/typespec-azure-core": ">=0.64.0 <1.0.0", "@azure-tools/typespec-azure-resource-manager": ">=0.64.0 <1.0.0", "@azure-tools/typespec-azure-rulesets": ">=0.64.0 <1.0.0", - "@azure-tools/typespec-client-generator-core": ">=0.64.0 <1.0.0", + "@azure-tools/typespec-client-generator-core": ">=0.64.1 <1.0.0", "@azure-tools/typespec-liftr-base": ">=0.11.0 <1.0.0", "@typespec/compiler": "^1.8.0", "@typespec/http": "^1.8.0", @@ -233,9 +233,9 @@ } }, "node_modules/@azure-tools/typespec-client-generator-core": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.64.0.tgz", - "integrity": "sha512-2QwefKiEoecS1EPX49P8vQu8/ioR2wwm3RhpGn+HhFneXkvm084kVWK3H86+pOwAfkhRPkZcCdu3FhfzeKZ/dg==", + "version": "0.64.1", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.64.1.tgz", + "integrity": "sha512-u1iWLergQmNG/0Wk3wVjCj/Q9cxUlxLGnLhd0hr3H1Wy1xvg7mLRaH+a62J//wvUZYBQsz1XGnm2QnksAzAdzg==", "dev": true, "license": "MIT", "dependencies": { @@ -2872,6 +2872,22 @@ "node": ">= 4" } }, + "node_modules/@typespec/compiler/node_modules/prettier": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/@typespec/compiler/node_modules/slash": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", @@ -3131,6 +3147,22 @@ "dev": true, "license": "MIT" }, + "node_modules/@typespec/tspd/node_modules/prettier": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/@typespec/tspd/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -6960,9 +6992,9 @@ } }, "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", + "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", "dev": true, "license": "MIT", "bin": { diff --git a/typespec-extension/package.json b/typespec-extension/package.json index 72a6c6cc3b..71e944158b 100644 --- a/typespec-extension/package.json +++ b/typespec-extension/package.json @@ -1,6 +1,6 @@ { "name": "@azure-tools/typespec-java", - "version": "0.38.2", + "version": "0.38.3", "description": "TypeSpec library for emitting Java client from the TypeSpec REST protocol binding", "keywords": [ "TypeSpec" @@ -51,7 +51,7 @@ "@azure-tools/typespec-azure-core": ">=0.64.0 <1.0.0", "@azure-tools/typespec-azure-resource-manager": ">=0.64.0 <1.0.0", "@azure-tools/typespec-azure-rulesets": ">=0.64.0 <1.0.0", - "@azure-tools/typespec-client-generator-core": ">=0.64.0 <1.0.0", + "@azure-tools/typespec-client-generator-core": ">=0.64.1 <1.0.0", "@azure-tools/typespec-liftr-base": ">=0.11.0 <1.0.0", "@typespec/compiler": "^1.8.0", "@typespec/http": "^1.8.0", @@ -70,7 +70,7 @@ "@azure-tools/typespec-azure-core": "0.64.0", "@azure-tools/typespec-azure-resource-manager": "0.64.0", "@azure-tools/typespec-azure-rulesets": "0.64.0", - "@azure-tools/typespec-client-generator-core": "0.64.0", + "@azure-tools/typespec-client-generator-core": "0.64.1", "@azure-tools/typespec-liftr-base": "0.11.0", "@microsoft/api-extractor": "^7.55.2", "@types/js-yaml": "~4.0.9", @@ -95,7 +95,7 @@ "eslint-plugin-deprecation": "~3.0.0", "eslint-plugin-import": "^2.32.0", "eslint-plugin-unicorn": "^62.0.0", - "prettier": "~3.7.4", + "prettier": "~3.8.0", "rimraf": "~6.1.2", "typescript": "~5.9.3", "typescript-eslint": "^8.53.0", diff --git a/typespec-tests/package.json b/typespec-tests/package.json index cd6274fc78..f9b350dcef 100644 --- a/typespec-tests/package.json +++ b/typespec-tests/package.json @@ -11,14 +11,14 @@ "dependencies": { "@typespec/spec-api": "0.1.0-alpha.12", "@typespec/spector": "0.1.0-alpha.22", - "@typespec/http-specs": "0.1.0-alpha.30", - "@azure-tools/azure-http-specs": "0.1.0-alpha.35", - "@azure-tools/typespec-java": "file:/../typespec-extension/azure-tools-typespec-java-0.38.2.tgz" + "@typespec/http-specs": "0.1.0-alpha.31", + "@azure-tools/azure-http-specs": "0.1.0-alpha.36", + "@azure-tools/typespec-java": "file:/../typespec-extension/azure-tools-typespec-java-0.38.3.tgz" }, "devDependencies": { "@typespec/prettier-plugin-typespec": "^1.8.0", "prettier-plugin-organize-imports": "^4.3.0", - "prettier": "^3.7.4" + "prettier": "^3.8.0" }, "overrides": { "@typespec/compiler": "1.8.0", @@ -31,7 +31,7 @@ "@typespec/sse": "0.78.0", "@typespec/streams": "0.78.0", "@azure-tools/typespec-azure-core": "0.64.0", - "@azure-tools/typespec-client-generator-core": "0.64.0", + "@azure-tools/typespec-client-generator-core": "0.64.1", "@azure-tools/typespec-azure-resource-manager": "0.64.0", "@azure-tools/typespec-autorest": "0.64.0", "@azure-tools/typespec-liftr-base": "0.11.0" diff --git a/typespec-tests/src/test/java/authentication/noauth/union/UnionTests.java b/typespec-tests/src/test/java/authentication/noauth/union/UnionTests.java new file mode 100644 index 0000000000..52befe08b4 --- /dev/null +++ b/typespec-tests/src/test/java/authentication/noauth/union/UnionTests.java @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package authentication.noauth.union; + +import authentication.util.BearerTokenAuthenticationPolicy; +import com.azure.core.credential.AccessToken; +import com.azure.core.exception.HttpResponseException; +import java.time.OffsetDateTime; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import reactor.core.publisher.Mono; + +public class UnionTests { + + private static final String EXPECTED_TOKEN = "https://security.microsoft.com/.default"; + + private static UnionClientBuilder createClientBuilder() { + return new UnionClientBuilder(); + } + + private static BearerTokenAuthenticationPolicy createBearerPolicy() { + return new BearerTokenAuthenticationPolicy( + tokenRequestContext -> Mono.just(new AccessToken(EXPECTED_TOKEN, OffsetDateTime.now().plusHours(1)))); + } + + @Test + public void validNoAuthAllowsRequestsWithoutAuthentication() { + UnionClient client = createClientBuilder().buildClient(); + + Assertions.assertDoesNotThrow(() -> client.validNoAuth()); + } + + @Test + public void validTokenFailsWhenAuthorizationMissing() { + UnionClient client = createClientBuilder().buildClient(); + + Assertions.assertThrows(HttpResponseException.class, client::validToken); + } + + @Test + public void validTokenSucceedsWithBearerToken() { + UnionClient client = createClientBuilder().addPolicy(createBearerPolicy()).buildClient(); + + Assertions.assertDoesNotThrow(() -> client.validToken()); + } +} diff --git a/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/NewSubClientTests.java b/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/NewSubClientTests.java new file mode 100644 index 0000000000..0f12a3639b --- /dev/null +++ b/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/NewSubClientTests.java @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package azure.clientgenerator.core.clientlocation; + +import azure.clientgenerator.core.clientlocation.newsubclient.ArchiveOperationsClient; +import azure.clientgenerator.core.clientlocation.newsubclient.MoveToNewSubClientBuilder; +import azure.clientgenerator.core.clientlocation.newsubclient.ProductOperationsClient; +import org.junit.jupiter.api.Test; + +public class NewSubClientTests { + + private final MoveToNewSubClientBuilder builder = new MoveToNewSubClientBuilder(); + + @Test + public void testProductOperations() { + ProductOperationsClient productClient = builder.buildProductOperationsClient(); + productClient.listProducts(); + } + + @Test + public void testArchiveOperations() { + ArchiveOperationsClient archiveClient = builder.buildArchiveOperationsClient(); + archiveClient.archiveProduct(); + } +} diff --git a/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/ParameterTests.java b/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/ParameterTests.java new file mode 100644 index 0000000000..74a125c815 --- /dev/null +++ b/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/ParameterTests.java @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package azure.clientgenerator.core.clientlocation; + +import azure.clientgenerator.core.clientlocation.parameter.MoveMethodParameterToClient; +import azure.clientgenerator.core.clientlocation.parameter.MoveMethodParameterToClientBuilder; +import azure.clientgenerator.core.clientlocation.parameter.models.Blob; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ParameterTests { + + private final MoveMethodParameterToClient client + = new MoveMethodParameterToClientBuilder().storageAccount("testaccount").buildClient(); + + @Test + public void testGetBlob() { + Blob blob = client.getBlob("testcontainer", "testblob.txt"); + Assertions.assertNotNull(blob); + Assertions.assertEquals("blob-001", blob.getId()); + Assertions.assertEquals("testblob.txt", blob.getName()); + Assertions.assertEquals(1024, blob.getSize()); + Assertions.assertEquals("/testcontainer/testblob.txt", blob.getPath()); + } +} diff --git a/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/RootClientTests.java b/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/RootClientTests.java new file mode 100644 index 0000000000..873b80e4b7 --- /dev/null +++ b/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/RootClientTests.java @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package azure.clientgenerator.core.clientlocation; + +import azure.clientgenerator.core.clientlocation.rootclient.MoveToRootClient; +import azure.clientgenerator.core.clientlocation.rootclient.MoveToRootClientBuilder; +import azure.clientgenerator.core.clientlocation.rootclient.ResourceOperationsClient; +import org.junit.jupiter.api.Test; + +public class RootClientTests { + + private final MoveToRootClientBuilder builder = new MoveToRootClientBuilder(); + + @Test + public void testRootClient() { + MoveToRootClient rootClient = builder.buildClient(); + rootClient.getHealthStatus(); + } + + @Test + public void testResourceOperations() { + ResourceOperationsClient resourceClient = builder.buildResourceOperationsClient(); + resourceClient.getResource(); + } +} diff --git a/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/SubClientTests.java b/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/SubClientTests.java new file mode 100644 index 0000000000..cb939990e7 --- /dev/null +++ b/typespec-tests/src/test/java/azure/clientgenerator/core/clientlocation/SubClientTests.java @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package azure.clientgenerator.core.clientlocation; + +import azure.clientgenerator.core.clientlocation.subclient.AdminOperationsClient; +import azure.clientgenerator.core.clientlocation.subclient.MoveToExistingSubClientBuilder; +import azure.clientgenerator.core.clientlocation.subclient.UserOperationsClient; +import org.junit.jupiter.api.Test; + +public class SubClientTests { + + private final MoveToExistingSubClientBuilder builder = new MoveToExistingSubClientBuilder(); + + @Test + public void testAdminOperations() { + AdminOperationsClient adminClient = builder.buildAdminOperationsClient(); + adminClient.getAdminInfo(); + adminClient.deleteUser(); + } + + @Test + public void testUserOperations() { + UserOperationsClient userClient = builder.buildUserOperationsClient(); + userClient.getUser(); + } +} diff --git a/typespec-tests/src/test/java/azure/resourcemanager/operationtemplates/OperationTests.java b/typespec-tests/src/test/java/azure/resourcemanager/operationtemplates/OperationTests.java index 7a9b9ca8b9..7b764d4e57 100644 --- a/typespec-tests/src/test/java/azure/resourcemanager/operationtemplates/OperationTests.java +++ b/typespec-tests/src/test/java/azure/resourcemanager/operationtemplates/OperationTests.java @@ -19,6 +19,7 @@ import azure.resourcemanager.operationtemplates.models.Order; import azure.resourcemanager.operationtemplates.models.OrderProperties; import azure.resourcemanager.operationtemplates.models.Origin; +import azure.resourcemanager.operationtemplates.models.Product; import azure.resourcemanager.operationtemplates.models.Widget; import azure.resourcemanager.operationtemplates.models.WidgetProperties; import com.azure.core.http.HttpPipeline; @@ -129,6 +130,28 @@ public void testOptionalBody() { Assertions.assertEquals("Action completed successfully with parameters", actionResult.result()); } + @Test + public void testLroPaging() { + String resourceGroup = "test-rg"; + String productName = "default"; + List productList + = manager.lroPagings().postPagingLro(resourceGroup, productName).stream().collect(Collectors.toList()); + Assertions.assertFalse(productList.isEmpty()); + Assertions.assertEquals(2, productList.size()); + + Product product1 = productList.get(0); + Assertions.assertNotNull(product1); + Assertions.assertEquals("product1", product1.name()); + Assertions.assertEquals("Succeeded", product1.properties().provisioningState()); + Assertions.assertEquals("product1", product1.properties().productId()); + + Product product2 = productList.get(1); + Assertions.assertNotNull(product2); + Assertions.assertEquals("product2", product2.name()); + Assertions.assertEquals("Succeeded", product2.properties().provisioningState()); + Assertions.assertEquals("product2", product2.properties().productId()); + } + // for LRO operations, we need to override default poll interval private static OperationTemplatesManager buildManager() { try { diff --git a/typespec-tests/src/test/java/documentation/DocumentationTests.java b/typespec-tests/src/test/java/documentation/DocumentationTests.java new file mode 100644 index 0000000000..2043993539 --- /dev/null +++ b/typespec-tests/src/test/java/documentation/DocumentationTests.java @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package documentation; + +import org.junit.jupiter.api.Test; + +public class DocumentationTests { + + private final ListsClient listsClient = new DocumentationClientBuilder().buildListsClient(); + private final TextFormattingClient textFormattingClient + = new DocumentationClientBuilder().buildTextFormattingClient(); + + @Test + public void testBulletPointsOp() { + listsClient.bulletPointsOp(); + } + + // Note: testBulletPointsModel is commented out due to a known issue: + // The mock API (mockapi.ts) returns status 200 for POST requests, but the generated client + // expects status 204 based on the NoContentResponse return type in the TypeSpec definition. + // This is a mismatch between the mock API implementation and the TypeSpec specification. + // + // @Test + // public void testBulletPointsModel() { + // BulletPointsModel model = new BulletPointsModel(BulletPointsEnum.SIMPLE); + // listsClient.bulletPointsModelWithResponse(BinaryData.fromObject(model), null); + // } + + @Test + public void testNumbered() { + listsClient.numbered(); + } + + @Test + public void testBoldText() { + textFormattingClient.boldText(); + } + + @Test + public void testItalicText() { + textFormattingClient.italicText(); + } + + @Test + public void testCombinedFormatting() { + textFormattingClient.combinedFormatting(); + } +} diff --git a/typespec-tests/src/test/java/parameters/query/QueryTests.java b/typespec-tests/src/test/java/parameters/query/QueryTests.java new file mode 100644 index 0000000000..34823dfd15 --- /dev/null +++ b/typespec-tests/src/test/java/parameters/query/QueryTests.java @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package parameters.query; + +import org.junit.jupiter.api.Test; + +public class QueryTests { + + private final QueryClient client = new QueryClientBuilder().buildClient(); + + @Test + public void testConstant() { + client.post(); + } +} diff --git a/typespec-tests/src/test/java/payload/multipart/MultipartTests.java b/typespec-tests/src/test/java/payload/multipart/MultipartTests.java index 2aa07972ba..09ec4e6fdc 100644 --- a/typespec-tests/src/test/java/payload/multipart/MultipartTests.java +++ b/typespec-tests/src/test/java/payload/multipart/MultipartTests.java @@ -30,9 +30,12 @@ import payload.multipart.models.FileWithHttpPartOptionalContentTypeRequest; import payload.multipart.models.FileWithHttpPartRequiredContentTypeRequest; import payload.multipart.models.FileWithHttpPartSpecificContentTypeRequest; +import payload.multipart.models.ImageFileDetails; import payload.multipart.models.JsonPartRequest; import payload.multipart.models.MultiBinaryPartsRequest; +import payload.multipart.models.MultiPartOptionalRequest; import payload.multipart.models.MultiPartRequest; +import payload.multipart.models.MultiPartRequestWithWireName; import payload.multipart.models.PictureFileDetails; import payload.multipart.models.PicturesFileDetails; import payload.multipart.models.ProfileImageFileDetails; @@ -172,6 +175,32 @@ public void testBasic() { asyncClient.basic(request).block(); } + @Test + public void testWithWireName() { + MultiPartRequestWithWireName request = new MultiPartRequestWithWireName("123", + new ImageFileDetails(BinaryData.fromFile(FILE)).setFilename("image.jpg")); + + client.withWireName(request); + asyncClient.withWireName(request).block(); + } + + @Test + public void testOptionalParts() { + // Test with only id + MultiPartOptionalRequest requestWithIdOnly = new MultiPartOptionalRequest().setId("123"); + client.optionalParts(requestWithIdOnly); + + // Test with only profileImage + MultiPartOptionalRequest requestWithImageOnly = new MultiPartOptionalRequest() + .setProfileImage(new ProfileImageFileDetails(BinaryData.fromFile(FILE)).setFilename("image.jpg")); + asyncClient.optionalParts(requestWithImageOnly).block(); + + // Test with both id and profileImage + MultiPartOptionalRequest requestWithBoth = new MultiPartOptionalRequest().setId("123") + .setProfileImage(new ProfileImageFileDetails(BinaryData.fromFile(FILE)).setFilename("image.jpg")); + client.optionalParts(requestWithBoth); + } + @Test public void testJson() { client.jsonPart(new JsonPartRequest(new Address("X"), diff --git a/typespec-tests/src/test/java/specialwords/ModelPropertyClientTest.java b/typespec-tests/src/test/java/specialwords/ModelPropertyClientTest.java index 059e406696..51af2b327a 100644 --- a/typespec-tests/src/test/java/specialwords/ModelPropertyClientTest.java +++ b/typespec-tests/src/test/java/specialwords/ModelPropertyClientTest.java @@ -4,6 +4,7 @@ package specialwords; import org.junit.jupiter.api.Test; +import specialwords.modelproperties.models.DictMethods; import specialwords.modelproperties.models.SameAsModel; public class ModelPropertyClientTest { @@ -11,7 +12,12 @@ public class ModelPropertyClientTest { private final ModelPropertiesClient client = new SpecialWordsClientBuilder().buildModelPropertiesClient(); @Test - public void test() { + public void testSameAsModel() { client.sameAsModel(new SameAsModel("ok")); } + + @Test + public void testDictMethods() { + client.dictMethods(new DictMethods("ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok")); + } }