Skip to content

Commit 1491dca

Browse files
Protocol tests parsed response validation
1 parent 4148140 commit 1491dca

File tree

11 files changed

+321
-15
lines changed

11 files changed

+321
-15
lines changed

tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/domainmodels/c2j_protocol_test/C2jGiven.java

+6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ public class C2jGivenInput {
2121
private String locationName;
2222
}
2323

24+
@Data
25+
public class C2jGivenOutput {
26+
private String shape;
27+
}
28+
2429
@Data
2530
public class C2jGivenEndpoint {
2631
private String hostPrefix;
@@ -29,5 +34,6 @@ public class C2jGivenEndpoint {
2934
private String name;
3035
private C2jGivenHttp http;
3136
private C2jGivenInput input;
37+
private C2jGivenOutput output;
3238
private C2jGivenEndpoint endpoint;
3339
}

tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/domainmodels/codegeneration/cpp/CppViewHelper.java

+3
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ public static String computeDefaultValue(Shape shape) {
141141
}
142142

143143
public static String computeVariableName(String memberName) {
144+
if (null == memberName) {
145+
System.err.println("DEBUG");
146+
}
144147
return lowercasesFirstChar(memberName).replace("-", "_");
145148
}
146149

tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/generators/cpp/CppProtocolTestGenerator.java

+39-4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ public CppProtocolTestGenerator(ServiceModel serviceModel, ProtocolTestModel tes
5656
velocityEngine.setProperty(RuntimeConstants.SPACE_GOBBLING, RuntimeConstants.SpaceGobbling.BC.toString());
5757

5858
velocityEngine.init();
59+
60+
legacyPatchEc2Model();
5961
}
6062

6163
protected SdkFileEntry generateTestSuiteSourceFile(ProtocolTestSuite testSuite) throws IOException {
@@ -141,10 +143,10 @@ protected final SdkFileEntry makeFile(Template template, VelocityContext context
141143
);
142144

143145
private List<String> computeTestSourceIncludes(ProtocolTestSuite testSuite) {
144-
Set<String> set = testSuite.getCases().stream()
146+
Set<String> set = testSuite.getShapes().entrySet().stream()
145147
.map(entry -> {
146-
Shape shape = serviceModel.getShapes().getOrDefault(entry.getGiven().getName(),
147-
serviceModel.getShapes().get(entry.getGiven().getName() + "Request"));
148+
Shape shape = serviceModel.getShapes().getOrDefault(entry.getKey(),
149+
serviceModel.getShapes().get(entry.getKey() + "Request"));
148150
// operation with no input shape defined but cpp sdk generates an empty request class
149151
Set<String> includes = shape != null ?
150152
CppViewHelper.computeSourceIncludes(serviceModel.getMetadata().getProjectName(), shape) :
@@ -157,15 +159,48 @@ private List<String> computeTestSourceIncludes(ProtocolTestSuite testSuite) {
157159
}
158160

159161
}
160-
// include the request shape itself
162+
return includes;
163+
})
164+
.flatMap(entrySet -> entrySet.stream())
165+
.collect(Collectors.toSet());
166+
// include the request shapes
167+
Set<String> requestShapes = testSuite.getCases().stream()
168+
.map(entry -> {
169+
Set<String> includes = new HashSet<>();
161170
includes.add(String.format("<aws/%s/model/%s.h>", serviceModel.getMetadata().getProjectName(),
162171
entry.getGiven().getName() + "Request"));
163172

164173
return includes;
165174
})
166175
.flatMap(entrySet -> entrySet.stream())
167176
.collect(Collectors.toSet());
177+
178+
set.addAll(requestShapes);
168179
set.removeAll(HEADERS_TO_NOT_INCLUDE);
169180
return set.stream().sorted().collect(Collectors.toList());
170181
}
182+
183+
/**
184+
* Perform legacy patching of the ec2 model present from the very beginning.
185+
*/
186+
private void legacyPatchEc2Model() {
187+
if (!serviceModel.getMetadata().getProtocol().equals("ec2")) {
188+
return;
189+
}
190+
191+
List<String> keysToRename = new LinkedList<>();
192+
Map<String, Shape> shapes = serviceModel.getShapes();
193+
for (final String key : shapes.keySet()) {
194+
final Shape shape = shapes.get(key);
195+
shape.setName(shape.getName().replaceAll("Result$", "Response"));
196+
shape.setType(shape.getType().replaceAll("Result$", "Response"));
197+
keysToRename.add(key);
198+
}
199+
200+
for (final String key : keysToRename) {
201+
final Shape shape = shapes.get(key);
202+
shapes.remove(key);
203+
shapes.put(key.replaceAll("Result$", "Response"), shape);
204+
}
205+
}
171206
}

tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/ProtocolTestsTestSuiteSrc.vm

+1-11
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,6 @@ AWS_PROTOCOL_TEST($testSuite.name, $case.id) {
3838
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/request/FillRequest.vm")
3939

4040
auto outcome = client.${case.given.name}(request);
41-
#if($case.input)
42-
AWS_ASSERT_SUCCESS(outcome) << outcome.GetError();
43-
#else
44-
#if($case.output.get().successResult)
45-
AWS_ASSERT_SUCCESS(outcome) << outcome.GetError();
46-
#end
47-
#if($case.output.get().errorResult)
48-
ASSERT_FALSE(outcome.IsSuccess());
49-
#end
50-
#end
51-
5241
#if($case.input)
5342
#set($serialized = $case.input.get().serialized)
5443
ExpectedRequest expectedRq;
@@ -89,5 +78,6 @@ AWS_PROTOCOL_TEST($testSuite.name, $case.id) {
8978
#else
9079
ValidateRequestSent();
9180
#end
81+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/result/ValidateOutcome.vm")
9282
}
9383
#end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/result/ValidateSingleParameterMacro.vm")
2+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/result/ValidateParamsMacro.vm")
3+
##-------------------- ValidateListMacro macro
4+
#macro( ValidateListMacro $spaces $dstObject $listShape $testValidateParam $listGetter="")
5+
#set($macro.spaces = $spaces)
6+
#set($macro.listMemberShape=$listShape.listMember.shape)
7+
#if(false)
8+
/* ValidateListMacro dstObject = $dstObject */
9+
/* ValidateListMacro listShape = $listShape */
10+
/* ValidateListMacro testValidateParam = $testValidateParam */
11+
/* ValidateListMacro listGetter = $listGetter */
12+
#break
13+
#end
14+
#set($macro.fieldGetter = $listGetter)
15+
#if($macro.fieldGetter)
16+
## this is a nested list (i.e. a list inside a map/list/structure)
17+
#set($testValidateParamVal = $testValidateParam)
18+
#set($macro.listItemVarName = "${dstObject}Item")
19+
#else
20+
## this is list at the root level)
21+
#set($macro.fieldGetter = "Get${CppViewHelper.capitalizeFirstChar($testValidateParam.key)}()")
22+
#set($testValidateParamVal = $testValidateParam.value)
23+
#set($macro.listItemVarName = "${dstObject}${CppViewHelper.capitalizeFirstChar(${CppViewHelper.computeVariableName($testValidateParam.key)})}Item")
24+
#end
25+
#if($macro.listMemberShape.list || $macro.listMemberShape.map || $macro.listMemberShape.structure)
26+
${macro.spaces}EXPECT_EQ(${testValidateParamVal.size()}U, ${dstObject}.${macro.fieldGetter}.size());
27+
#foreach($arrayItem in $testValidateParamVal)
28+
${macro.spaces}{
29+
#if($macro.listMemberShape.list)
30+
${macro.spaces}const Aws::Vector<$CppViewHelper.computeCppType($macro.listMemberShape.listMember.shape)>& $macro.listItemVarName = ${dstObject}.${macro.fieldGetter}.at(${foreach.index});
31+
${macro.spaces}EXPECT_EQ(${arrayItem.size()}U, ${macro.listItemVarName}.size());
32+
#foreach($innerListEl in $arrayItem)
33+
${macro.spaces}EXPECT_EQ(#ValidateSingleParameterMacro($macro.listMemberShape.listMember.shape, $innerListEl), ${macro.listItemVarName}.at(${foreach.index}));
34+
#end
35+
#elseif($macro.listMemberShape.map)
36+
${macro.spaces}const Aws::Map<$CppViewHelper.computeCppType($macro.listMemberShape.mapKey.shape), $CppViewHelper.computeCppType($macro.listMemberShape.mapValue.shape)>& $macro.listItemVarName = ${dstObject}.${macro.fieldGetter}.at(${foreach.index});
37+
${macro.spaces}EXPECT_EQ(${arrayItem.size()}U, ${macro.listItemVarName}.size());
38+
#foreach($innerMapEl in $arrayItem.fields())
39+
## ${macro.spaces}${macro.listItemVarName}["$innerMapEl.key"] = #ValidateSingleParameterMacro($macro.listMemberShape.mapValue.shape, $innerMapEl.value);
40+
${macro.spaces}EXPECT_TRUE(${macro.listItemVarName}.find("$innerMapEl.key") != ${macro.listItemVarName}.end());
41+
${macro.spaces}EXPECT_EQ(${macro.listItemVarName}.at("$innerMapEl.key"), #ValidateSingleParameterMacro($macro.listMemberShape.mapValue.shape, $innerMapEl.value));
42+
#end
43+
## ${macro.spaces}${dstObject}.${macro.fieldGetter}($macro.listItemVarName);
44+
#elseif($macro.listMemberShape.structure)
45+
## ${macro.spaces}${macro.listMemberShape.name} $macro.listItemVarName;
46+
${macro.spaces}const ${macro.listMemberShape.name}& $macro.listItemVarName = ${dstObject}.${macro.fieldGetter}.at(${foreach.index});
47+
#foreach($innerParam in $arrayItem.fields())
48+
#ValidateParamsMacro("${macro.spaces} " $macro.listItemVarName $macro.listMemberShape $innerParam)
49+
#end
50+
## ${macro.spaces}${dstObject}.${macro.fieldGetter}($macro.listItemVarName);
51+
#end##list
52+
${macro.spaces}}
53+
#end##foreach
54+
#else## not (list || map || structure)
55+
${macro.spaces}const Aws::Vector<$CppViewHelper.computeCppType($macro.listMemberShape)>& $macro.listItemVarName = ${dstObject}.${macro.fieldGetter};
56+
${macro.spaces}EXPECT_EQ(${testValidateParamVal.size()}U, ${macro.listItemVarName}.size());
57+
#foreach($arrayItem in $testValidateParamVal)
58+
${macro.spaces}EXPECT_EQ(#ValidateSingleParameterMacro($macro.listMemberShape, $arrayItem), ${macro.listItemVarName}.at(${foreach.index}));
59+
#end
60+
#end##(list || map || structure)
61+
#end##macro ValidateListMacro
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/result/ValidateSingleParameterMacro.vm")
2+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/result/ValidateSingleVariableMacro.vm")
3+
##-------------------- ValidateMapMacro macro
4+
#macro( ValidateMapMacro $spaces $dstObject $mapShape $testValidateParam $mapGetter="")
5+
#set($macro.fieldGetter = $mapGetter)
6+
#if($macro.fieldGetter)
7+
## this is a nested map (i.e. a list inside a map/list/structure)
8+
#set($testValidateParamVal = $testValidateParam)
9+
#set($macro.mapVarName = "${dstObject}NestedMap")
10+
#set($macro.mapItemVarName = "${dstObject}Item")
11+
#else
12+
## this is map at the root level)
13+
#set($macro.fieldGetter = "Get${CppViewHelper.capitalizeFirstChar($testValidateParam.key)}()")
14+
#set($testValidateParamVal = $testValidateParam.value)
15+
#set($macro.mapVarName = "${dstObject}${CppViewHelper.capitalizeFirstChar(${CppViewHelper.computeVariableName($testValidateParam.key)})}")
16+
#set($macro.mapItemVarName = "${dstObject}${CppViewHelper.capitalizeFirstChar(${CppViewHelper.computeVariableName($testValidateParam.key)})}Item")
17+
#end
18+
#set($macro.spaces = $spaces)
19+
##set($macro.mapVarName = "${dstObject}${CppViewHelper.capitalizeFirstChar(${CppViewHelper.computeVariableName($testValidateParam.key)})}")
20+
##set($macro.mapItemVarName = "${dstObject}${CppViewHelper.capitalizeFirstChar(${CppViewHelper.computeVariableName($testValidateParam.key)})}Item")
21+
##set($macro.fieldAdder = "Add${CppViewHelper.capitalizeFirstChar($testValidateParam.key)}")
22+
#if($mapShape.mapValue.shape.document)
23+
${macro.spaces}const Aws::Map<$CppViewHelper.computeCppType($mapShape.mapKey.shape), $CppViewHelper.computeCppType($mapShape.mapValue.shape)>& $macro.mapVarName = ${dstObject}.${macro.fieldGetter};
24+
${macro.spaces}EXPECT_EQ(${testValidateParamVal.size()}U, ${macro.mapVarName}.size());
25+
#foreach($mapItem in $testValidateParamVal.fields())
26+
${macro.spaces}EXPECT_STREQ(R"j(${mapItem.value})j", ${macro.mapVarName}.at("$mapItem.key").View().WriteCompact().c_str());
27+
#end
28+
#break
29+
#end
30+
#if($mapShape.mapValue.shape.structure)
31+
${macro.spaces}const Aws::Map<$CppViewHelper.computeCppType($mapShape.mapKey.shape), $CppViewHelper.computeCppType($mapShape.mapValue.shape)>& $macro.mapVarName = ${dstObject}.${macro.fieldGetter};
32+
${macro.spaces}EXPECT_EQ(${testValidateParamVal.size()}U, ${macro.mapVarName}.size());
33+
#foreach($mapItem in $testValidateParamVal.fields())
34+
${macro.spaces}{
35+
${macro.spaces}EXPECT_TRUE(${macro.mapVarName}.find("$mapItem.key") != ${macro.mapVarName}.end());
36+
${macro.spaces}const $CppViewHelper.computeCppType($mapShape.mapValue.shape)& $macro.mapItemVarName = ${macro.mapVarName}.at("$mapItem.key");
37+
#foreach($innerParam in $mapItem.value.fields())
38+
#ValidateParamsMacro("${macro.spaces} " $macro.mapItemVarName $mapShape.mapValue.shape $innerParam)
39+
#end
40+
${macro.spaces}}
41+
#end
42+
#break
43+
#end
44+
###----- the map value is not nested structure or document
45+
${macro.spaces}const Aws::Map<$CppViewHelper.computeCppType($mapShape.mapKey.shape), $CppViewHelper.computeCppType($mapShape.mapValue.shape)>& $macro.mapVarName = ${dstObject}.${macro.fieldGetter};
46+
${macro.spaces}EXPECT_EQ(${testValidateParamVal.size()}U, ${macro.mapVarName}.size());
47+
##set($macro.mapResult="{")
48+
#foreach($mapItem in $testValidateParamVal.fields())
49+
${macro.spaces}EXPECT_TRUE(${macro.mapVarName}.find("$mapItem.key") != ${macro.mapVarName}.end());
50+
#set($macro.parentVarName = $macro.mapVarName)
51+
#set($macro.getter = "at(" + '"' + $mapItem.key + '"' + ")")
52+
#set($macro.var = $macro.mapItemVarName)
53+
#ValidateSingleVariableMacro($macro.spaces, $mapShape.mapValue.shape, $mapItem.value, $macro.parentVarName, $macro.getter, $macro.var)
54+
#end
55+
#end##macro ValidateMapMacro
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/result/ValidateParamsMacro.vm")
2+
#if($case.input || $case.output.get().successResult)
3+
AWS_ASSERT_SUCCESS(outcome) << outcome.GetError();
4+
#if($case.output && $case.output.get().successResult)
5+
#set($expectedResult = $case.output.get().successResult.get().result.get())
6+
#set($responseShape = $serviceModel.operations.get("${case.given.name}").result.shape)
7+
#if(!$expectedResult.isEmpty())
8+
const ${responseShape.name}& result = outcome.GetResult();
9+
#end
10+
/* expectedResult = R"( ${expectedResult} )" */
11+
#foreach($param in $expectedResult.fields())
12+
#ValidateParamsMacro(" ", "result", $responseShape, $param)
13+
#end
14+
#end
15+
#end
16+
#if($case.output && $case.output.get().errorResult)
17+
ASSERT_FALSE(outcome.IsSuccess());
18+
#set($expectedError = $case.output.get().errorResult.get().error.get())
19+
#end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/result/ValidateSingleParameterMacro.vm")
2+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/result/ValidateStreamingPayload.vm")
3+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/result/ValidateListMacro.vm")
4+
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/protocoltests/result/ValidateMapMacro.vm")
5+
##-------------------- ValidateParamsMacro macro
6+
#macro( ValidateParamsMacro $spaces $dstObject $currentShape $testValidateParam )
7+
#set($macro.spaces = $spaces)
8+
#if(!$currentShape.members.containsKey($testValidateParam.key) && $testValidateParam.key != "contentType")
9+
static_assert(false, "Codegen failure: Test input has a key $testValidateParam.key not found in the model for the current shape: $currentShape");
10+
#end
11+
#if(!$testValidateParam || !$testValidateParam.key)
12+
static_assert(false, "Codegen failure!");
13+
/* currentShape = R"($currentShape)" */
14+
/* currentShape.members = R"($currentShape.members)" */
15+
/* macro.memberToGet = R"($macro.memberToGet)" */
16+
/* dstObject = R"($dstObject)" */
17+
/* testValidateParam = R"($testValidateParam)" */
18+
#break
19+
#end
20+
#set($macro.fieldGetter = "Get${CppViewHelper.capitalizeFirstChar($testValidateParam.key)}")
21+
#set($macro.memberToGet = $currentShape.members.get($testValidateParam.key))
22+
#if($macro.memberToGet.shape.list)
23+
#ValidateListMacro($macro.spaces $dstObject $macro.memberToGet.shape $testValidateParam)
24+
#elseif($macro.memberToGet.shape.map)
25+
#ValidateMapMacro($macro.spaces $dstObject $macro.memberToGet.shape $testValidateParam)
26+
#elseif($macro.memberToGet.shape.document)
27+
#set($macro.innerStructVarName = "${dstObject}${CppViewHelper.capitalizeFirstChar(${CppViewHelper.computeVariableName($testValidateParam.key)})}")
28+
${macro.spaces}{
29+
${macro.spaces}const Aws::Utils::DocumentView& ${macro.innerStructVarName} = ${dstObject}.${macro.fieldGetter}();
30+
${macro.spaces}EXPECT_STREQ(R"j(${testValidateParam.value})j", ${macro.innerStructVarName}.WriteCompact().c_str());
31+
${macro.spaces}}
32+
#elseif($macro.memberToGet.shape.structure)
33+
${macro.spaces}{
34+
#set($macro.innerStructVarName = "${dstObject}${CppViewHelper.capitalizeFirstChar(${CppViewHelper.computeVariableName($testValidateParam.key)})}")
35+
${macro.spaces}const ${macro.memberToGet.shape.name}& $macro.innerStructVarName = ${dstObject}.${macro.fieldGetter}();
36+
#foreach($innerParam in $testValidateParam.value.fields())
37+
#ValidateParamsMacro("${macro.spaces} ", $macro.innerStructVarName, $macro.memberToGet.shape, $innerParam)
38+
#end
39+
${macro.spaces}}
40+
#elseif($testValidateParam.key != "contentType" && $currentShape.members.containsKey($testValidateParam.key) && $CppViewHelper.isStreamingPayloadMember($currentShape, $testValidateParam.key))
41+
${macro.spaces}/* TODO: validate streaming response */
42+
${macro.spaces}AWS_UNREFERENCED_PARAM(${dstObject});
43+
#elseif(!$macro.memberToGet)
44+
${macro.spaces}EXPECT_EQ($testValidateParam.value, ${dstObject}.${macro.fieldGetter}());
45+
#else
46+
${macro.spaces}EXPECT_EQ(#ValidateSingleParameterMacro($macro.memberToGet.shape, $testValidateParam.value), ${dstObject}.${macro.fieldGetter}());
47+
#end
48+
#end##macro ValidateParamsMacro
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
##-------------------- ValidateSingleParameterMacro macro
2+
#macro( ValidateSingleParameterMacro $shape $value )
3+
##/* shape = R"($shape)"; value = $value */ ##
4+
#if($shape.type == "float" || $shape.type == "double")
5+
##float is code generated as double in CPP SDK
6+
#if($value == '"NaN"')
7+
std::numeric_limits<double>::quiet_NaN()##
8+
#elseif($value == '"Infinity"')
9+
std::numeric_limits<double>::infinity()##
10+
#elseif($value == '"-Infinity"')
11+
-std::numeric_limits<double>::infinity()##
12+
#else
13+
${value}##
14+
#end
15+
#break
16+
#end###if($shape.double)
17+
#if($shape.primitive || $shape.boolean)
18+
${value}##
19+
#elseif($shape.string)
20+
R"(${value.asText()})"##
21+
#elseif($shape.blob)
22+
Aws::Utils::ByteBuffer(R"(${value.asText()})")##
23+
#elseif($shape.timeStamp)
24+
#set($macro.tsVal = "${value}")
25+
#if($macro.tsVal.contains(".") || $macro.tsVal.contains("E"))
26+
Aws::Utils::DateTime(${value})##
27+
#else
28+
Aws::Utils::DateTime(${value}L)##
29+
#end
30+
#elseif($shape.enum)
31+
${shape.name}Mapper::Get${shape.name}ForName(R"e(${value.asText()})e")##
32+
#elseif($shape.list)
33+
#set($macro.listResult="Aws::Vector<$CppViewHelper.computeCppType($shape)>({")
34+
#foreach($listItem in $value)
35+
#set($macro.listResult=$macro.listResult + "#ValidateSingleParameterMacro($shape.listMember.shape, $listItem)")
36+
#if($foreach.hasNext)#set($macro.listResult=$macro.listResult + ", ")#end
37+
#end
38+
#set($macro.listResult=$macro.listResult + "})")
39+
$macro.listResult##
40+
#elseif($shape.map)
41+
#set($macro.mapResult="Aws::Map<$CppViewHelper.computeCppType($shape.mapKey.shape), $CppViewHelper.computeCppType($shape.mapValue.shape)>({")
42+
#foreach($mapItem in $value.fields())
43+
#set($macro.mapItem="{" + '"' + "$mapItem.key" + '"' + ", ")
44+
#set($macro.mapItem=$macro.mapItem + "#ValidateSingleParameterMacro($shape.mapValue.shape, $mapItem.value)" + "}")
45+
#set($macro.mapResult=$macro.mapResult + $macro.mapItem)
46+
#if($foreach.hasNext)#set($macro.mapResult=$macro.mapResult + ", ")#end
47+
#end
48+
#set($macro.mapResult=$macro.mapResult + "})")
49+
$macro.mapResult##
50+
#elseif($shape.structure)
51+
${shape.name}(JsonValue(R"j($value)j"))##
52+
#else
53+
${value};
54+
static_assert(false, R"(Codegen failure: Unsupported input $value for shape ${shape} with type ${shape.type})";
55+
#end
56+
#end##macro ValidateSingleParameterMacro

0 commit comments

Comments
 (0)