Skip to content

Commit 3c595cd

Browse files
rchacheSteven Yuan
authored and
Steven Yuan
committed
Emit specific ids for ChangedEnumTrait ERROR events (smithy-lang#1787)
* Emit id 'ChangedEnumTrait.Inserted' for inserted enum diff events * Changed .Inserted to .OrderChanged, and added subparts for .Removed and .NameChanged
1 parent 7861233 commit 3c595cd

File tree

2 files changed

+61
-25
lines changed

2 files changed

+61
-25
lines changed

smithy-diff/src/main/java/software/amazon/smithy/diff/evaluators/ChangedEnumTrait.java

+36-11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import software.amazon.smithy.model.traits.EnumDefinition;
2828
import software.amazon.smithy.model.traits.EnumTrait;
2929
import software.amazon.smithy.model.traits.synthetic.SyntheticEnumTrait;
30+
import software.amazon.smithy.model.validation.Severity;
3031
import software.amazon.smithy.model.validation.ValidationEvent;
3132
import software.amazon.smithy.utils.OptionalUtils;
3233
import software.amazon.smithy.utils.Pair;
@@ -38,6 +39,10 @@
3839
* list of existing values.
3940
*/
4041
public final class ChangedEnumTrait extends AbstractDiffEvaluator {
42+
private static final String ORDER_CHANGED = ".OrderChanged";
43+
private static final String NAME_CHANGED = ".NameChanged";
44+
private static final String REMOVED = ".Removed";
45+
4146
@Override
4247
public List<ValidationEvent> evaluate(Differences differences) {
4348
return differences.changedShapes()
@@ -74,17 +79,30 @@ private List<ValidationEvent> validateEnum(ChangedShape<Shape> change, Pair<Enum
7479
.findFirst();
7580

7681
if (!maybeNewValue.isPresent()) {
77-
events.add(error(change.getNewShape(), String.format(
78-
"Enum value `%s` was removed", definition.getValue())));
82+
events.add(
83+
ValidationEvent.builder()
84+
.severity(Severity.ERROR)
85+
.message(String.format("Enum value `%s` was removed", definition.getValue()))
86+
.shape(change.getNewShape())
87+
.id(getEventId() + REMOVED)
88+
.build()
89+
);
7990
oldEndPosition--;
8091
} else {
8192
EnumDefinition newValue = maybeNewValue.get();
8293
if (!newValue.getName().equals(definition.getName())) {
83-
events.add(error(change.getNewShape(), String.format(
84-
"Enum `name` changed from `%s` to `%s` for the `%s` value",
85-
definition.getName().orElse(null),
86-
newValue.getName().orElse(null),
87-
definition.getValue())));
94+
events.add(
95+
ValidationEvent.builder()
96+
.severity(Severity.ERROR)
97+
.message(String.format(
98+
"Enum `name` changed from `%s` to `%s` for the `%s` value",
99+
definition.getName().orElse(null),
100+
newValue.getName().orElse(null),
101+
definition.getValue()))
102+
.shape(change.getNewShape())
103+
.id(getEventId() + NAME_CHANGED)
104+
.build()
105+
);
88106
}
89107
}
90108
}
@@ -93,10 +111,17 @@ private List<ValidationEvent> validateEnum(ChangedShape<Shape> change, Pair<Enum
93111
for (EnumDefinition definition : newTrait.getValues()) {
94112
if (!oldTrait.getEnumDefinitionValues().contains(definition.getValue())) {
95113
if (newPosition <= oldEndPosition) {
96-
events.add(error(change.getNewShape(), String.format(
97-
"Enum value `%s` was inserted before the end of the list of existing values. This can "
98-
+ "cause compatibility issues when ordinal values are used for iteration, "
99-
+ "serialization, etc.", definition.getValue())));
114+
events.add(
115+
ValidationEvent.builder()
116+
.severity(Severity.ERROR)
117+
.message(String.format(
118+
"Enum value `%s` was inserted before the end of the list of existing values. This "
119+
+ "can cause compatibility issues when ordinal values are used for "
120+
+ "iteration, serialization, etc.", definition.getValue()))
121+
.shape(change.getNewShape())
122+
.id(getEventId() + ORDER_CHANGED)
123+
.build()
124+
);
100125
} else {
101126
events.add(note(change.getNewShape(), String.format(
102127
"Enum value `%s` was appended", definition.getValue())));

smithy-diff/src/test/java/software/amazon/smithy/diff/evaluators/ChangedEnumTraitTest.java

+25-14
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@
1616
package software.amazon.smithy.diff.evaluators;
1717

1818
import static org.hamcrest.MatcherAssert.assertThat;
19+
import static org.hamcrest.Matchers.allOf;
1920
import static org.hamcrest.Matchers.equalTo;
2021
import static org.hamcrest.Matchers.stringContainsInOrder;
2122

2223
import java.util.List;
24+
25+
import org.hamcrest.core.Every;
2326
import org.junit.jupiter.api.Test;
2427
import software.amazon.smithy.diff.ModelDiff;
2528
import software.amazon.smithy.model.Model;
@@ -74,7 +77,8 @@ public void detectsAppendedEnumsEnumTraitNoNameToEnumShape() {
7477
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
7578

7679
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").size(), equalTo(2));
77-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").get(0).getSeverity(),
80+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.NameChanged").size(), equalTo(1));
81+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.NameChanged").get(0).getSeverity(),
7882
equalTo(Severity.ERROR));
7983
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").get(1).getSeverity(),
8084
equalTo(Severity.NOTE));
@@ -124,7 +128,7 @@ public void detectsRemovedEnums() {
124128
Model modelB = Model.assembler().addShape(s2).assemble().unwrap();
125129
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
126130

127-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").size(), equalTo(1));
131+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.Removed").size(), equalTo(1));
128132
assertThat(TestHelper.findEvents(events, Severity.ERROR).size(), equalTo(1));
129133
}
130134

@@ -149,6 +153,8 @@ public void detectsRemovedEnumsEnumTraitNoNameToEnumShape() {
149153
Model modelB = Model.assembler().addShape(s2).assemble().unwrap();
150154
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
151155

156+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.Removed").size(), equalTo(1));
157+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.NameChanged").size(), equalTo(1));
152158
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").stream()
153159
.allMatch(e -> e.getSeverity() == Severity.ERROR), equalTo(true));
154160
}
@@ -176,8 +182,8 @@ public void detectsRemovedEnumsEnumTraitWithNameToEnumShape() {
176182
Model modelB = Model.assembler().addShape(s2).assemble().unwrap();
177183
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
178184

179-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").size(), equalTo(1));
180-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").stream()
185+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.Removed").size(), equalTo(1));
186+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.Removed").stream()
181187
.allMatch(e -> e.getSeverity() == Severity.ERROR), equalTo(true));
182188
}
183189

@@ -199,7 +205,7 @@ public void detectsRenamedEnums() {
199205
Model modelB = Model.assembler().addShape(s2).assemble().unwrap();
200206
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
201207

202-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").size(), equalTo(1));
208+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.NameChanged").size(), equalTo(1));
203209
assertThat(TestHelper.findEvents(events, Severity.ERROR).size(), equalTo(1));
204210
}
205211

@@ -221,8 +227,8 @@ public void detectsRenamedEnumsEnumTraitNoNameToEnumShape() {
221227
Model modelB = Model.assembler().addShape(s2).assemble().unwrap();
222228
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
223229

224-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").size(), equalTo(1));
225-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").get(0).getSeverity(),
230+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.NameChanged").size(), equalTo(1));
231+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.NameChanged").get(0).getSeverity(),
226232
equalTo(Severity.ERROR));
227233
}
228234

@@ -245,8 +251,8 @@ public void detectsRenamedEnumsEnumTraitWithNameToEnumShape() {
245251
Model modelB = Model.assembler().addShape(s2).assemble().unwrap();
246252
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
247253

248-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").size(), equalTo(1));
249-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").get(0).getSeverity(),
254+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.NameChanged").size(), equalTo(1));
255+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.NameChanged").get(0).getSeverity(),
250256
equalTo(Severity.ERROR));
251257
}
252258

@@ -269,8 +275,8 @@ public void detectsInsertedEnums() {
269275
Model modelB = Model.assembler().addShape(s2).assemble().unwrap();
270276
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
271277

272-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").size(), equalTo(1));
273-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").get(0).getSeverity(), equalTo(Severity.ERROR));
278+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.OrderChanged").size(), equalTo(1));
279+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.OrderChanged").get(0).getSeverity(), equalTo(Severity.ERROR));
274280
}
275281

276282
@Test
@@ -293,6 +299,7 @@ public void detectsInsertedEnumsEnumTraitNoNameToEnumShape() {
293299
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
294300

295301
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").size(), equalTo(2));
302+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.OrderChanged").size(), equalTo(1));
296303
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").stream()
297304
.allMatch(e -> e.getSeverity() == Severity.ERROR), equalTo(true));
298305
}
@@ -317,8 +324,8 @@ public void detectsInsertedEnumsEnumTraitWithNameToEnumShape() {
317324
Model modelB = Model.assembler().addShape(s2).assemble().unwrap();
318325
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
319326

320-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").size(), equalTo(1));
321-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").stream()
327+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.OrderChanged").size(), equalTo(1));
328+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.OrderChanged").stream()
322329
.allMatch(e -> e.getSeverity() == Severity.ERROR), equalTo(true));
323330
}
324331

@@ -346,6 +353,7 @@ public void detectsAppendedEnumsAfterRemovedEnums() {
346353

347354
List<ValidationEvent> changeEvents = TestHelper.findEvents(allEvents, "ChangedEnumTrait");
348355
assertThat(changeEvents.size(), equalTo(2));
356+
assertThat(TestHelper.findEvents(changeEvents, "ChangedEnumTrait.Removed").size(), equalTo(1));
349357

350358
ValidationEvent removedEvent = changeEvents.get(0);
351359
assertThat(removedEvent.getSeverity(), equalTo(Severity.ERROR));
@@ -383,6 +391,8 @@ public void detectsAppendedEnumsAfterRemovedEnumsEnumTraitNoNameToEnumShape() {
383391
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
384392

385393
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").size(), equalTo(4));
394+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.NameChanged").size(), equalTo(2));
395+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.Removed").size(), equalTo(1));
386396
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").subList(0, 3).stream()
387397
.allMatch(e -> e.getSeverity() == Severity.ERROR), equalTo(true));
388398
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").subList(3, 4).stream()
@@ -419,7 +429,8 @@ public void detectsAppendedEnumsAfterRemovedEnumsEnumTraitWithNameToEnumShape()
419429
List<ValidationEvent> events = ModelDiff.compare(modelA, modelB);
420430

421431
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").size(), equalTo(2));
422-
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").subList(0, 1).stream()
432+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.Removed").size(), equalTo(1));
433+
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait.Removed").stream()
423434
.allMatch(e -> e.getSeverity() == Severity.ERROR), equalTo(true));
424435
assertThat(TestHelper.findEvents(events, "ChangedEnumTrait").subList(1, 2).stream()
425436
.allMatch(e -> e.getSeverity() == Severity.NOTE), equalTo(true));

0 commit comments

Comments
 (0)