1 /**
2  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3  * SPDX-License-Identifier: Apache-2.0.
4  */
5 
6 package com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.cpp;
7 
8 import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.Shape;
9 import com.amazonaws.util.awsclientgenerator.domainmodels.codegeneration.ShapeMember;
10 import org.junit.Test;
11 
12 import java.util.HashMap;
13 import java.util.LinkedList;
14 import java.util.Set;
15 
16 import static org.junit.Assert.assertNull;
17 import static org.junit.Assert.assertTrue;
18 import static org.junit.Assert.assertEquals;
19 
20 public class CppViewHelperTest {
21 
22     @Test
testComputeExportValue()23     public void testComputeExportValue() {
24         assertEquals("AWS_SERVICE_API", CppViewHelper.computeExportValue("service"));
25     }
26 
27     @Test
testComputeBaseClass()28     public void testComputeBaseClass() {
29         Shape shape = new Shape();
30         shape.setPayload("blah");
31         shape.setMembers(new HashMap<>());
32         ShapeMember payloadShapeMember = new ShapeMember();
33         Shape payloadShape = new Shape();
34         payloadShape.setType("BlobStream");
35         payloadShapeMember.setShape(payloadShape);
36         shape.getMembers().put("blah", payloadShapeMember);
37         assertEquals("StreamingServiceRequest", CppViewHelper.computeBaseClass("Service", shape));
38         shape.setPayload(null);
39         shape.setMembers(new HashMap<>());
40         ShapeMember shapeMember = new ShapeMember();
41         shapeMember.setStreaming(true);
42         shape.getMembers().put("ShapeMember", shapeMember);
43         assertEquals("StreamingServiceRequest", CppViewHelper.computeBaseClass("Service", shape));
44         shape.setMembers(new HashMap<>());
45         assertEquals("ServiceRequest", CppViewHelper.computeBaseClass("Service", shape));
46     }
47 
48     @Test
testComputeMemberVariableName()49     public void testComputeMemberVariableName() {
50         assertEquals("m_memberVariable", CppViewHelper.computeMemberVariableName("MemberVariable"));
51     }
52 
53     @Test
testComputeDefaultValue()54     public void testComputeDefaultValue() {
55         Shape shape = new Shape();
56         shape.setType("long");
57         assertEquals("0", CppViewHelper.computeDefaultValue(shape));
58         shape.setType("integer");
59         assertEquals("0", CppViewHelper.computeDefaultValue(shape));
60         shape.setType("float");
61         assertEquals("0.0", CppViewHelper.computeDefaultValue(shape));
62         shape.setType("boolean");
63         assertEquals("false", CppViewHelper.computeDefaultValue(shape));
64         shape.setType("double");
65         assertEquals("0.0", CppViewHelper.computeDefaultValue(shape));
66         shape.setType("not implemented type");
67         assertNull(CppViewHelper.computeDefaultValue(shape));
68     }
69 
70     @Test
testConvertToUpperCamel()71     public void testConvertToUpperCamel() {
72         assertEquals("UpperCaseVar", CppViewHelper.convertToUpperCamel("upperCaseVar"));
73         assertEquals("UpperCaseVar", CppViewHelper.convertToUpperCamel("UpperCaseVar"));
74     }
75 
76     @Test
testComputeVariableName()77     public void testComputeVariableName() {
78        assertEquals("memberVariable", CppViewHelper.computeVariableName("MemberVariable"));
79     }
80 
81     @Test
testVariableHasBeenSetName()82     public void testVariableHasBeenSetName() {
83        assertEquals("m_memberVariableHasBeenSet", CppViewHelper.computeVariableHasBeenSetName("MemberVariable"));
84     }
85 
86     @Test
testComputeJsonizeString()87     public void testComputeJsonizeString() {
88         Shape shape = new Shape();
89         shape.setType("structure");
90         assertEquals(".Jsonize()", CppViewHelper.computeJsonizeString(shape));
91         assertEquals("->Jsonize()", CppViewHelper.computeJsonizeString(shape, true));
92         shape.setType("any thing else");
93         assertEquals("", CppViewHelper.computeJsonizeString(shape));
94     }
95 
96     @Test
testComputeCppType()97     public void testComputeCppType() {
98         Shape shape = new Shape();
99         assertEquals(false, shape.isSensitive());
100         shape.setType("string");
101         assertEquals("Aws::String", CppViewHelper.computeCppType(shape));
102         shape.setType("long");
103         assertEquals("long long", CppViewHelper.computeCppType(shape));
104         shape.setType("integer");
105         assertEquals("int", CppViewHelper.computeCppType(shape));
106         shape.setType("double");
107         assertEquals("double", CppViewHelper.computeCppType(shape));
108         shape.setType("float");
109         assertEquals("double", CppViewHelper.computeCppType(shape));
110         shape.setType("boolean");
111         assertEquals("bool", CppViewHelper.computeCppType(shape));
112         shape.setType("timestamp");
113         assertEquals("Aws::Utils::DateTime", CppViewHelper.computeCppType(shape));
114         shape.setType("blob");
115         assertEquals("Aws::Utils::ByteBuffer", CppViewHelper.computeCppType(shape));
116         shape.setSensitive(true);
117         assertEquals("Aws::Utils::CryptoBuffer", CppViewHelper.computeCppType(shape));
118         shape.setSensitive(false);
119 
120         shape.setName("ShapeName");
121         shape.setType("structure");
122         assertEquals("ShapeName", CppViewHelper.computeCppType(shape));
123         shape.setName("EnumShapeName");
124         shape.setType("string");
125         shape.setEnumValues(new LinkedList<>());
126         shape.getEnumValues().add("EnumValue");
127         assertEquals("EnumShapeName", CppViewHelper.computeCppType(shape));
128         shape.setEnumValues(null);
129 
130         Shape listShape = new Shape();
131         listShape.setType("list");
132         listShape.setName("ListShape");
133 
134         Shape innerShape = new Shape();
135         innerShape.setType("string");
136         innerShape.setName("StringName");
137 
138         ShapeMember innerShapeMember = new ShapeMember();
139         innerShapeMember.setShape(innerShape);
140 
141         listShape.setListMember(innerShapeMember);
142         assertEquals("Aws::Vector<Aws::String>", CppViewHelper.computeCppType(listShape));
143 
144         Shape mapShape = new Shape();
145         mapShape.setType("map");
146         mapShape.setName("MapShape");
147 
148         Shape keyShape = new Shape();
149         keyShape.setType("string");
150         keyShape.setName("StringName");
151 
152         ShapeMember keyShapeMember = new ShapeMember();
153         keyShapeMember.setShape(keyShape);
154         mapShape.setMapKey(keyShapeMember);
155 
156         Shape structureValue = new Shape();
157         structureValue.setType("structure");
158         structureValue.setName("StructureShape");
159 
160         ShapeMember valueShapeMember = new ShapeMember();
161         valueShapeMember.setShape(structureValue);
162         mapShape.setMapValue(valueShapeMember);
163 
164         assertEquals("Aws::Map<Aws::String, StructureShape>", CppViewHelper.computeCppType(mapShape));
165 
166         shape.setType("Any thing else");
167         assertEquals("Aws::String", CppViewHelper.computeCppType(shape));
168     }
169 
170     @Test
testComputeJsonCppType()171     public void testComputeJsonCppType() {
172         Shape shape = new Shape();
173         shape.setType("long");
174         assertEquals("Int64", CppViewHelper.computeJsonCppType(shape));
175         shape.setType("integer");
176         assertEquals("Integer", CppViewHelper.computeJsonCppType(shape));
177         shape.setType("string");
178         assertEquals("String", CppViewHelper.computeJsonCppType(shape));
179         shape.setType("boolean");
180         assertEquals("Bool", CppViewHelper.computeJsonCppType(shape));
181         shape.setType("double");
182         assertEquals("Double", CppViewHelper.computeJsonCppType(shape));
183         shape.setType("double");
184         assertEquals("Double", CppViewHelper.computeJsonCppType(shape));
185         shape.setType("float");
186         assertEquals("Double", CppViewHelper.computeJsonCppType(shape));
187         shape.setType("map");
188         assertEquals("Object", CppViewHelper.computeJsonCppType(shape));
189         shape.setType("list");
190         assertEquals("Array", CppViewHelper.computeJsonCppType(shape));
191         shape.setType("structure");
192         assertEquals("Object", CppViewHelper.computeJsonCppType(shape));
193         shape.setType("blob");
194         assertEquals("String", CppViewHelper.computeJsonCppType(shape));
195         shape.setType("timestamp");
196         assertEquals("Double", CppViewHelper.computeJsonCppType(shape));
197         shape.setTimestampFormat("iso8601");
198         assertEquals("String", CppViewHelper.computeJsonCppType(shape));
199         shape.setTimestampFormat("UnixTimestamp");
200         assertEquals("Double", CppViewHelper.computeJsonCppType(shape));
201         shape.setTimestampFormat("rfc822");
202         assertEquals("String", CppViewHelper.computeJsonCppType(shape));
203         shape.setType("Any thing else");
204         assertNull(CppViewHelper.computeJsonCppType(shape));
205     }
206 
207     // The following model is used in the next test:
208     // "StructureShape":{
209     //     "type":"structure",
210     //     "members":{
211     //         "AnotherStructureShape":{"shape":"AnotherStructureShape"},
212     //         "EnumShape":{"shape":"EnumShape"},
213     //         "ListShape":{"shape":"ListShape"},
214     //         "MapShape":{"shape":"MapShape"}
215     //     }
216     // },
217     // "AnotherStructureShape":{"type":"structure"},
218     // "EnumShape":{
219     //     "type":"string",
220     //     "enum":["EnumValue"]
221     // },
222     // "ListShape":{
223     //     "type":"list",
224     //     "member":{"shape":"StringName"}
225     // },
226     // "MapShape":{
227     //     "type":"map",
228     //     "key":{"shape":"StringName"},
229     //     "value":{"shape":"MapValueStructureShape"}
230     // },
231     // "StringName":{"type":"string"},
232     // "MapValueStructureShape":{"type":"structure"}
233     @Test
testComputeHeaderIncludes()234     public void testComputeHeaderIncludes() {
235         Shape structShape = new Shape();
236         structShape.setType("structure");
237         structShape.setName("StructureShape");
238 
239         Shape anotherStructShape = new Shape();
240         anotherStructShape.setType("structure");
241         anotherStructShape.setName("AnotherStructureShape");
242 
243         ShapeMember anotherStructShapeMember = new ShapeMember();
244         anotherStructShapeMember.setShape(anotherStructShape);
245         structShape.setMembers(new HashMap<>());
246         structShape.getMembers().put("AnotherStructureShape", anotherStructShapeMember);
247 
248         Shape enumShape = new Shape();
249         enumShape.setName("EnumShape");
250         enumShape.setType("string");
251         enumShape.setEnumValues(new LinkedList<>());
252         enumShape.getEnumValues().add("EnumValue");
253 
254         ShapeMember enumShapeMember = new ShapeMember();
255         enumShapeMember.setShape(enumShape);
256         structShape.getMembers().put("EnumShape", enumShapeMember);
257 
258         Shape listShape = new Shape();
259         listShape.setType("list");
260         listShape.setName("ListShape");
261 
262         Shape innerShape = new Shape();
263         innerShape.setType("string");
264         innerShape.setName("StringName");
265 
266         ShapeMember innerShapeMember = new ShapeMember();
267         innerShapeMember.setShape(innerShape);
268 
269         listShape.setListMember(innerShapeMember);
270         ShapeMember listShapeMember = new ShapeMember();
271         listShapeMember.setShape(listShape);
272 
273         structShape.getMembers().put("ListShape", listShapeMember);
274 
275         Shape mapShape = new Shape();
276         mapShape.setType("map");
277         mapShape.setName("MapShape");
278 
279         Shape keyShape = new Shape();
280         keyShape.setType("string");
281         keyShape.setName("StringName");
282 
283         ShapeMember keyShapeMember = new ShapeMember();
284         keyShapeMember.setShape(keyShape);
285         mapShape.setMapKey(keyShapeMember);
286 
287         Shape structureValue = new Shape();
288         structureValue.setType("structure");
289         structureValue.setName("MapValueStructureShape");
290 
291         ShapeMember valueShapeMember = new ShapeMember();
292         valueShapeMember.setShape(structureValue);
293         mapShape.setMapValue(valueShapeMember);
294 
295         ShapeMember mapShapeMember = new ShapeMember();
296         mapShapeMember.setShape(mapShape);
297 
298         structShape.getMembers().put("MapShape", mapShapeMember);
299 
300         String serviceAbbr = "service";
301         Set<String> headerIncludes = CppViewHelper.computeHeaderIncludes(serviceAbbr, structShape);
302 
303         assertTrue(headerIncludes.contains("<aws/" + serviceAbbr + "/model/AnotherStructureShape.h>"));
304         assertTrue(headerIncludes.contains("<aws/" + serviceAbbr + "/model/EnumShape.h>"));
305         assertTrue(headerIncludes.contains("<aws/" + serviceAbbr + "/model/MapValueStructureShape.h>"));
306         assertTrue(headerIncludes.contains("<aws/core/utils/memory/stl/AWSString.h>"));
307         assertTrue(headerIncludes.contains("<aws/core/utils/memory/stl/AWSMap.h>"));
308         assertTrue(headerIncludes.contains("<aws/core/utils/memory/stl/AWSVector.h>"));
309 
310     }
311 
312     @Test
testComputeOperationNameFromShapeName()313     public void testComputeOperationNameFromShapeName() {
314         assertEquals("OperationName", CppViewHelper.computeOperationNameFromInputOutputShape("OperationNameRequest"));
315         assertEquals("OperationName", CppViewHelper.computeOperationNameFromInputOutputShape("OperationNameResult"));
316         assertEquals("OperationNameOther", CppViewHelper.computeOperationNameFromInputOutputShape("OperationNameOther"));
317 
318         assertEquals("OperationNameRequests", CppViewHelper.computeOperationNameFromInputOutputShape("OperationNameRequestsRequest"));
319         assertEquals("OperationNameRequests", CppViewHelper.computeOperationNameFromInputOutputShape("OperationNameRequestsResult"));
320         assertEquals("OperationNameResults", CppViewHelper.computeOperationNameFromInputOutputShape("OperationNameResultsRequest"));
321         assertEquals("OperationNameResults", CppViewHelper.computeOperationNameFromInputOutputShape("OperationNameResultsResult"));
322         assertEquals("OperationNameResultsRequestResultRequest", CppViewHelper.computeOperationNameFromInputOutputShape("OperationNameResultsRequestResultRequestResult"));
323         assertEquals("OperationNameResultsRequestResultRequest", CppViewHelper.computeOperationNameFromInputOutputShape("OperationNameResultsRequestResultRequestRequest"));
324 
325         assertEquals("OperationNameResultsRequestResultRequestDerp", CppViewHelper.computeOperationNameFromInputOutputShape("OperationNameResultsRequestResultRequestDerp"));
326 
327     }
328 }
329