@@ -167,14 +167,69 @@ object AdtTraitValidatorSpec extends FunSuite {
167
167
.shape(struct)
168
168
.severity(Severity .ERROR )
169
169
.message(
170
- " This shape can only be referenced from one adt union, but it's referenced from test#MyUnion, test#MyUnionTwo"
170
+ " This shape can only be referenced once and from one adt union, but it's referenced from test#MyUnion, test#MyUnionTwo"
171
171
)
172
172
.build()
173
173
)
174
174
expect(result == expected)
175
175
}
176
176
177
- // todo: test what happens if the shape is targeted by the same union twice (shouldn't be done)
177
+ test(
178
+ " AdtTrait - return error when structure is targeted by the same union twice"
179
+ ) {
180
+ val unionShapeId = ShapeId .fromParts(" test" , " MyUnion" )
181
+ val adtTrait = new AdtTrait ()
182
+ val structMember = MemberShape
183
+ .builder()
184
+ .id(" test#struct$testing" )
185
+ .target(" smithy.api#String" )
186
+ .build()
187
+ val struct =
188
+ StructureShape
189
+ .builder()
190
+ .id(" test#struct" )
191
+ .addMember(structMember)
192
+ .build()
193
+
194
+ val unionMember = MemberShape
195
+ .builder()
196
+ .id(unionShapeId.withMember(" unionMember" ))
197
+ .target(struct.getId)
198
+ .build()
199
+
200
+ val unionMember2 = MemberShape
201
+ .builder()
202
+ .id(unionShapeId.withMember(" unionMember2" ))
203
+ .target(struct.getId)
204
+ .build()
205
+
206
+ val union =
207
+ UnionShape
208
+ .builder()
209
+ .addTrait(adtTrait)
210
+ .id(unionShapeId)
211
+ .addMember(unionMember)
212
+ .addMember(unionMember2)
213
+ .build()
214
+
215
+ val model =
216
+ Model .builder().addShapes(struct, union).build()
217
+
218
+ val result = validator.validate(model).asScala.toList
219
+
220
+ val expected = List (
221
+ ValidationEvent
222
+ .builder()
223
+ .id(" AdtTrait" )
224
+ .shape(struct)
225
+ .severity(Severity .ERROR )
226
+ .message(
227
+ " This shape can only be referenced once and from one adt union, but it's referenced from test#MyUnion (2 times)"
228
+ )
229
+ .build()
230
+ )
231
+ expect(result == expected)
232
+ }
178
233
179
234
test(
180
235
" AdtTrait - return error when structure is targeted by a union and a structure"
@@ -228,7 +283,7 @@ object AdtTraitValidatorSpec extends FunSuite {
228
283
.shape(struct)
229
284
.severity(Severity .ERROR )
230
285
.message(
231
- " This shape can only be referenced from one adt union, but it's referenced from test#MyStruct2, test#MyUnion"
286
+ " This shape can only be referenced once and from one adt union, but it's referenced from test#MyStruct2, test#MyUnion"
232
287
)
233
288
.build()
234
289
)
0 commit comments