forked from smithy-lang/smithy-rs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Ec2QuerySerializerGeneratorTest.kt
144 lines (129 loc) · 4.94 KB
/
Ec2QuerySerializerGeneratorTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize
import org.junit.jupiter.api.Test
import software.amazon.smithy.model.shapes.OperationShape
import software.amazon.smithy.model.shapes.StringShape
import software.amazon.smithy.model.shapes.StructureShape
import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator
import software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType
import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator
import software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer
import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer
import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace
import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel
import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest
import software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder
import software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext
import software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider
import software.amazon.smithy.rust.codegen.core.testutil.unitTest
import software.amazon.smithy.rust.codegen.core.util.inputShape
import software.amazon.smithy.rust.codegen.core.util.lookup
class Ec2QuerySerializerGeneratorTest {
private val baseModel = """
namespace test
union Choice {
blob: Blob,
boolean: Boolean,
date: Timestamp,
enum: FooEnum,
int: Integer,
@xmlFlattened
list: SomeList,
long: Long,
map: MyMap,
number: Double,
s: String,
top: Top,
unit: Unit,
}
@enum([{name: "FOO", value: "FOO"}])
string FooEnum
map MyMap {
key: String,
value: Choice,
}
list SomeList {
member: Choice
}
structure Top {
choice: Choice,
field: String,
extra: Long,
@xmlName("rec")
recursive: TopList
}
list TopList {
@xmlName("item")
member: Top
}
structure OpInput {
@xmlName("some_bool")
boolean: Boolean,
list: SomeList,
map: MyMap,
top: Top,
}
@http(uri: "/top", method: "POST")
operation Op {
input: OpInput,
}
""".asSmithyModel()
@Test
fun `generates valid serializers`() {
val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel))
val codegenContext = testCodegenContext(model)
val symbolProvider = codegenContext.symbolProvider
val parserGenerator = Ec2QuerySerializerGenerator(codegenContext)
val operationGenerator = parserGenerator.operationInputSerializer(model.lookup("test#Op"))
val project = TestWorkspace.testProject(testSymbolProvider(model))
project.lib {
unitTest(
"ec2query_serializer",
"""
use test_model::Top;
let input = crate::test_input::OpInput::builder()
.top(
Top::builder()
.field("hello!")
.extra(45)
.recursive(Top::builder().extra(55).build())
.build()
)
.boolean(true)
.build()
.unwrap();
let serialized = ${format(operationGenerator!!)}(&input).unwrap();
let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap();
assert_eq!(
output,
"\
Action=Op\
&Version=test\
&Some_bool=true\
&Top.Field=hello%21\
&Top.Extra=45\
&Top.Rec.1.Extra=55\
"
);
""",
)
}
model.lookup<StructureShape>("test#Top").also { top ->
project.moduleFor(top) {
top.renderWithModelBuilder(model, symbolProvider, this)
UnionGenerator(model, symbolProvider, this, model.lookup("test#Choice")).render()
val enum = model.lookup<StringShape>("test#FooEnum")
EnumGenerator(model, symbolProvider, enum, TestEnumType).render(this)
}
}
model.lookup<OperationShape>("test#Op").inputShape(model).also { input ->
project.moduleFor(input) {
input.renderWithModelBuilder(model, symbolProvider, this)
}
}
project.compileAndTest()
}
}