@@ -93,18 +93,71 @@ object AdtMemberTraitValidatorSpec extends FunSuite {
93
93
val expected = List (
94
94
ValidationEvent
95
95
.builder()
96
- .id(" AdtValidator " )
96
+ .id(" AdtMemberTrait " )
97
97
.shape(struct)
98
98
.severity(Severity .ERROR )
99
99
.message(
100
- " test#MyUnion must have exactly one member targeting test#struct "
100
+ " This shape must be referenced by test#MyUnion because of its smithy4s.meta#adtMember trait "
101
101
)
102
102
.build()
103
103
)
104
104
expect(result == expected)
105
105
}
106
106
107
- test(" return error when structure is targeted by multiple unions" ) {
107
+ test(" return no error when there are duplicate non-adtMember members" ) {
108
+ val unionShapeId = ShapeId .fromParts(" test" , " MyUnion" )
109
+ val adtTrait = new AdtMemberTrait (unionShapeId)
110
+ val structMember = MemberShape
111
+ .builder()
112
+ .id(" test#struct$testing" )
113
+ .target(" smithy.api#String" )
114
+ .build()
115
+
116
+ val struct =
117
+ StructureShape
118
+ .builder()
119
+ .id(" test#struct" )
120
+ .addTrait(adtTrait)
121
+ .addMember(structMember)
122
+ .build()
123
+
124
+ val unionMember = MemberShape
125
+ .builder()
126
+ .id(unionShapeId.withMember(" unionMember" ))
127
+ .target(struct.getId)
128
+ .build()
129
+
130
+ val unionMemberString1 = MemberShape
131
+ .builder()
132
+ .id(unionShapeId.withMember(" unionMemberString1" ))
133
+ .target(" smithy.api#String" )
134
+ .build()
135
+
136
+ val unionMemberString2 = MemberShape
137
+ .builder()
138
+ .id(unionShapeId.withMember(" unionMemberString2" ))
139
+ .target(" smithy.api#String" )
140
+ .build()
141
+
142
+ val union =
143
+ UnionShape
144
+ .builder()
145
+ .id(unionShapeId)
146
+ .addMember(unionMember)
147
+ .addMember(unionMemberString1)
148
+ .addMember(unionMemberString2)
149
+ .build()
150
+
151
+ val model =
152
+ Model .builder().addShapes(struct, union).build()
153
+
154
+ val result = validator.validate(model).asScala.toList
155
+
156
+ val expected = List .empty
157
+ expect(result == expected)
158
+ }
159
+
160
+ test(" return error when structure is targeted by a union twice" ) {
108
161
val unionShapeId = ShapeId .fromParts(" test" , " MyUnion" )
109
162
val adtTrait = new AdtMemberTrait (unionShapeId)
110
163
val structMember = MemberShape
@@ -125,36 +178,106 @@ object AdtMemberTraitValidatorSpec extends FunSuite {
125
178
.id(unionShapeId.withMember(" unionMember" ))
126
179
.target(struct.getId)
127
180
.build()
181
+
182
+ val unionMember2 = MemberShape
183
+ .builder()
184
+ .id(unionShapeId.withMember(" unionMember2" ))
185
+ .target(struct.getId)
186
+ .build()
187
+
188
+ val union =
189
+ UnionShape
190
+ .builder()
191
+ .id(unionShapeId)
192
+ .addMember(unionMember)
193
+ .addMember(unionMember2)
194
+ .build()
195
+
196
+ val model =
197
+ Model .builder().addShapes(struct, union).build()
198
+
199
+ val result = validator.validate(model).asScala.toList
200
+
201
+ val expected = List (
202
+ ValidationEvent
203
+ .builder()
204
+ .id(" AdtMemberTrait" )
205
+ .shape(unionMember)
206
+ .severity(Severity .ERROR )
207
+ .message(
208
+ " Duplicate reference to shape test#struct in container test#MyUnion - only one is allowed"
209
+ )
210
+ .build()
211
+ )
212
+ expect(result == expected)
213
+ }
214
+
215
+ test(" return error when structure is targeted by the wrong union" ) {
216
+ val unionShapeId = ShapeId .fromParts(" test" , " MyUnion" )
217
+ val adtTrait = new AdtMemberTrait (unionShapeId)
218
+ val stringShape = StringShape .builder().id(" smithy.api#String" ).build()
219
+ val structMember = MemberShape
220
+ .builder()
221
+ .id(" test#struct$testing" )
222
+ .target(" test#String" )
223
+ .build()
224
+
225
+ val struct =
226
+ StructureShape
227
+ .builder()
228
+ .id(" test#struct" )
229
+ .addTrait(adtTrait)
230
+ .addMember(structMember)
231
+ .build()
232
+
233
+ val unionMember = MemberShape
234
+ .builder()
235
+ .id(unionShapeId.withMember(" unionMember" ))
236
+ .target(stringShape.getId)
237
+ .build()
238
+
128
239
val union =
129
240
UnionShape .builder().id(unionShapeId).addMember(unionMember).build()
130
241
131
242
val union2ShapeId = ShapeId .fromParts(" test" , " MyUnionTwo" )
132
- val unionMember2 = unionMember.toBuilder
133
- .id(union2ShapeId.withMember(" unionMemberTwo" ))
243
+ val union2Member = MemberShape
244
+ .builder()
245
+ .id(union2ShapeId.withMember(" unionMember" ))
246
+ .target(struct.getId)
134
247
.build()
248
+
135
249
val union2 =
136
- UnionShape .builder().id(union2ShapeId).addMember(unionMember2 ).build()
250
+ UnionShape .builder().id(union2ShapeId).addMember(union2Member ).build()
137
251
138
252
val model =
139
- Model .builder().addShapes(struct, union, union2).build()
253
+ Model .builder().addShapes(struct, stringShape, union, union2).build()
140
254
141
255
val result = validator.validate(model).asScala.toList
142
256
143
257
val expected = List (
144
258
ValidationEvent
145
259
.builder()
146
- .id(" AdtValidator" )
147
- .shape(union2)
260
+ .id(" AdtMemberTrait" )
261
+ .shape(struct)
262
+ .severity(Severity .ERROR )
263
+ .message(
264
+ " This shape must be referenced by test#MyUnion because of its smithy4s.meta#adtMember trait"
265
+ )
266
+ .build(),
267
+ ValidationEvent
268
+ .builder()
269
+ .id(" AdtMemberTrait" )
270
+ .shape(union2Member)
148
271
.severity(Severity .ERROR )
149
272
.message(
150
- " ADT member test#struct must not be referenced in any other shape but test#MyUnion"
273
+ " Invalid reference to test#struct - due to its smithy4s.meta#adtMember trait, only test#MyUnion can reference it "
151
274
)
152
275
.build()
153
276
)
154
277
expect(result == expected)
155
278
}
156
279
157
- test(" return error when structure is targeted by a union and a structure " ) {
280
+ test(" return error when structure is targeted by multiple unions " ) {
158
281
val unionShapeId = ShapeId .fromParts(" test" , " MyUnion" )
159
282
val adtTrait = new AdtMemberTrait (unionShapeId)
160
283
val structMember = MemberShape
@@ -178,29 +301,27 @@ object AdtMemberTraitValidatorSpec extends FunSuite {
178
301
val union =
179
302
UnionShape .builder().id(unionShapeId).addMember(unionMember).build()
180
303
181
- val struct2ShapeId = ShapeId .fromParts(" test" , " MyStruct2" )
182
- val structMember2 = unionMember.toBuilder
183
- .id(struct2ShapeId.withMember(" structMember2" ))
184
- .build()
185
- val struct2 = StructureShape
186
- .builder()
187
- .id(struct2ShapeId)
188
- .addMember(structMember2)
304
+ val union2ShapeId = ShapeId .fromParts(" test" , " MyUnionTwo" )
305
+ val unionMember2 = unionMember.toBuilder
306
+ .id(union2ShapeId.withMember(" unionMemberTwo" ))
189
307
.build()
190
308
309
+ val union2 =
310
+ UnionShape .builder().id(union2ShapeId).addMember(unionMember2).build()
311
+
191
312
val model =
192
- Model .builder().addShapes(struct, union, struct2 ).build()
313
+ Model .builder().addShapes(struct, union, union2 ).build()
193
314
194
315
val result = validator.validate(model).asScala.toList
195
316
196
317
val expected = List (
197
318
ValidationEvent
198
319
.builder()
199
- .id(" AdtValidator " )
200
- .shape(struct2 )
320
+ .id(" AdtMemberTrait " )
321
+ .shape(unionMember2 )
201
322
.severity(Severity .ERROR )
202
323
.message(
203
- " ADT member test#struct must not be referenced in any other shape but test#MyUnion"
324
+ " Invalid reference to test#struct - due to its smithy4s.meta#adtMember trait, only test#MyUnion can reference it "
204
325
)
205
326
.build()
206
327
)
0 commit comments