• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.github.javaparser.printer.lexicalpreservation;
2 
3 import com.github.javaparser.GeneratedJavaParserConstants;
4 import com.github.javaparser.ast.Modifier;
5 import com.github.javaparser.ast.Node;
6 import com.github.javaparser.ast.NodeList;
7 import com.github.javaparser.ast.PackageDeclaration;
8 import com.github.javaparser.ast.body.*;
9 import com.github.javaparser.ast.comments.JavadocComment;
10 import com.github.javaparser.ast.expr.*;
11 import com.github.javaparser.ast.observer.ObservableProperty;
12 import com.github.javaparser.ast.stmt.ExpressionStmt;
13 import com.github.javaparser.ast.stmt.Statement;
14 import com.github.javaparser.ast.type.ArrayType;
15 import com.github.javaparser.ast.type.PrimitiveType;
16 import com.github.javaparser.printer.ConcreteSyntaxModel;
17 import com.github.javaparser.printer.concretesyntaxmodel.CsmElement;
18 import com.github.javaparser.printer.concretesyntaxmodel.CsmIndent;
19 import com.github.javaparser.printer.concretesyntaxmodel.CsmToken;
20 import com.github.javaparser.printer.concretesyntaxmodel.CsmUnindent;
21 import com.github.javaparser.printer.lexicalpreservation.LexicalDifferenceCalculator.CsmChild;
22 import org.junit.jupiter.api.Test;
23 
24 import java.io.IOException;
25 import java.util.Arrays;
26 import java.util.Collections;
27 import java.util.List;
28 
29 import static com.github.javaparser.TokenTypes.eolTokenKind;
30 import static com.github.javaparser.TokenTypes.spaceTokenKind;
31 import static com.github.javaparser.ast.Modifier.Keyword.PUBLIC;
32 import static com.github.javaparser.ast.Modifier.createModifierList;
33 import static com.github.javaparser.printer.lexicalpreservation.DifferenceElement.*;
34 import static org.junit.jupiter.api.Assertions.assertEquals;
35 
36 class DifferenceElementCalculatorTest extends AbstractLexicalPreservingTest {
37 
38     @Test
calculateDifferenceEmpty()39     void calculateDifferenceEmpty() {
40         LexicalDifferenceCalculator.CalculatedSyntaxModel a = new LexicalDifferenceCalculator.CalculatedSyntaxModel(Collections.emptyList());
41         LexicalDifferenceCalculator.CalculatedSyntaxModel b = new LexicalDifferenceCalculator.CalculatedSyntaxModel(Collections.emptyList());
42         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(a, b);
43         assertEquals(0, differenceElements.size());
44     }
45 
46     @Test
calculateDifferenceAIsEmpty()47     void calculateDifferenceAIsEmpty() {
48         Node n1 = new FieldDeclaration();
49         Node n2 = new MethodDeclaration();
50 
51         LexicalDifferenceCalculator.CalculatedSyntaxModel a = new LexicalDifferenceCalculator.CalculatedSyntaxModel(Collections.emptyList());
52         LexicalDifferenceCalculator.CalculatedSyntaxModel b = new LexicalDifferenceCalculator.CalculatedSyntaxModel(Arrays.asList(
53                 new CsmToken(GeneratedJavaParserConstants.LPAREN),
54                 new CsmChild(n1),
55                 new CsmToken(GeneratedJavaParserConstants.RPAREN),
56                 new CsmChild(n2)));
57         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(a, b);
58         assertEquals(4, differenceElements.size());
59         assertEquals(added(new CsmToken(GeneratedJavaParserConstants.LPAREN)), differenceElements.get(0));
60         assertEquals(added(new CsmChild(n1)), differenceElements.get(1));
61         assertEquals(added(new CsmToken(GeneratedJavaParserConstants.RPAREN)), differenceElements.get(2));
62         assertEquals(added(new CsmChild(n2)), differenceElements.get(3));
63     }
64 
65     @Test
calculateDifferenceBIsEmpty()66     void calculateDifferenceBIsEmpty() {
67         Node n1 = new FieldDeclaration();
68         Node n2 = new MethodDeclaration();
69 
70         LexicalDifferenceCalculator.CalculatedSyntaxModel a = new LexicalDifferenceCalculator.CalculatedSyntaxModel(Arrays.asList(
71                 new CsmToken(GeneratedJavaParserConstants.LPAREN),
72                 new CsmChild(n1),
73                 new CsmToken(GeneratedJavaParserConstants.RPAREN),
74                 new CsmChild(n2)));
75         LexicalDifferenceCalculator.CalculatedSyntaxModel b = new LexicalDifferenceCalculator.CalculatedSyntaxModel(Collections.emptyList());
76         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(a, b);
77         assertEquals(4, differenceElements.size());
78         assertEquals(removed(new CsmToken(GeneratedJavaParserConstants.LPAREN)), differenceElements.get(0));
79         assertEquals(removed(new CsmChild(n1)), differenceElements.get(1));
80         assertEquals(removed(new CsmToken(GeneratedJavaParserConstants.RPAREN)), differenceElements.get(2));
81         assertEquals(removed(new CsmChild(n2)), differenceElements.get(3));
82     }
83 
84     @Test
compilationUnitExampleWithPackageSetDiff()85     void compilationUnitExampleWithPackageSetDiff() {
86         considerCode("class A {}");
87         CsmElement element = ConcreteSyntaxModel.forClass(cu.getClass());
88         PackageDeclaration packageDeclaration = new PackageDeclaration(new Name(new Name("foo"), "bar"));
89         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(element, cu);
90         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterPropertyChange(element, cu, ObservableProperty.PACKAGE_DECLARATION, null, packageDeclaration);
91         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
92         assertEquals(3, differenceElements.size());
93         assertEquals(added(new CsmChild(packageDeclaration)), differenceElements.get(0));
94         assertEquals(kept(new CsmChild(cu.getType(0))), differenceElements.get(1));
95         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(2));
96     }
97 
98     @Test
annotationDeclarationExampleWithModifierAdded()99     void annotationDeclarationExampleWithModifierAdded() throws IOException {
100         considerExample("AnnotationDeclaration_Example1_original");
101         AnnotationDeclaration annotationDeclaration = (AnnotationDeclaration)cu.getType(0);
102         CsmElement element = ConcreteSyntaxModel.forClass(annotationDeclaration.getClass());
103         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(element, annotationDeclaration);
104         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterPropertyChange(element, annotationDeclaration, ObservableProperty.MODIFIERS, new NodeList<>(), createModifierList(PUBLIC));
105         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
106         DifferenceElementCalculator.removeIndentationElements(differenceElements);
107         int i = 0;
108         assertEquals(added(new CsmChild(Modifier.publicModifier())), differenceElements.get(i++));
109         assertEquals(added(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
110         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.AT)), differenceElements.get(i++));
111         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.INTERFACE)), differenceElements.get(i++));
112         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
113         assertEquals(kept(new CsmChild(annotationDeclaration.getName())), differenceElements.get(i++));
114         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
115         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.LBRACE)), differenceElements.get(i++));
116         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
117         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(0))), differenceElements.get(i++));
118         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
119         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(1))), differenceElements.get(i++));
120         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
121         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(2))), differenceElements.get(i++));
122         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
123         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(3))), differenceElements.get(i++));
124         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
125         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(4))), differenceElements.get(i++));
126         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
127         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(5))), differenceElements.get(i++));
128         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
129         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.RBRACE)), differenceElements.get(i++));
130         assertEquals(i, differenceElements.size());
131     }
132 
133     @Test
annotationDeclarationExampleWithNameChanged()134     void annotationDeclarationExampleWithNameChanged() throws IOException {
135         considerExample("AnnotationDeclaration_Example1_original");
136         AnnotationDeclaration annotationDeclaration = (AnnotationDeclaration)cu.getType(0);
137         CsmElement element = ConcreteSyntaxModel.forClass(annotationDeclaration.getClass());
138         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(element, annotationDeclaration);
139         SimpleName newName = new SimpleName("NewName");
140         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterPropertyChange(element, annotationDeclaration, ObservableProperty.NAME,
141                 annotationDeclaration.getName(), newName);
142         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
143         DifferenceElementCalculator.removeIndentationElements(differenceElements);
144         int i = 0;
145         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.AT)), differenceElements.get(i++));
146         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.INTERFACE)), differenceElements.get(i++));
147         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
148         assertEquals(removed(new CsmChild(annotationDeclaration.getName())), differenceElements.get(i++));
149         assertEquals(added(new CsmChild(newName)), differenceElements.get(i++));
150         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
151         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.LBRACE)), differenceElements.get(i++));
152         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
153         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(0))), differenceElements.get(i++));
154         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
155         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(1))), differenceElements.get(i++));
156         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
157         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(2))), differenceElements.get(i++));
158         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
159         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(3))), differenceElements.get(i++));
160         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
161         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(4))), differenceElements.get(i++));
162         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
163         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(5))), differenceElements.get(i++));
164         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
165         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.RBRACE)), differenceElements.get(i++));
166         assertEquals(i, differenceElements.size());
167     }
168 
169     @Test
annotationDeclarationExampleWithJavadocAdded()170     void annotationDeclarationExampleWithJavadocAdded() throws IOException {
171         considerExample("AnnotationDeclaration_Example3_original");
172         AnnotationDeclaration annotationDeclaration = (AnnotationDeclaration)cu.getType(0);
173         CsmElement element = ConcreteSyntaxModel.forClass(annotationDeclaration.getClass());
174         JavadocComment comment = new JavadocComment("Cool this annotation!");
175         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(element, annotationDeclaration);
176         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterPropertyChange(element, annotationDeclaration, ObservableProperty.COMMENT, null, comment);
177         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
178         DifferenceElementCalculator.removeIndentationElements(differenceElements);
179         int i = 0;
180         assertEquals(kept(new CsmChild(Modifier.publicModifier())), differenceElements.get(i++));
181         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
182         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.AT)), differenceElements.get(i++));
183         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.INTERFACE)), differenceElements.get(i++));
184         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
185         assertEquals(kept(new CsmChild(annotationDeclaration.getName())), differenceElements.get(i++));
186         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
187         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.LBRACE)), differenceElements.get(i++));
188         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
189         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(0))), differenceElements.get(i++));
190         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
191         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(1))), differenceElements.get(i++));
192         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
193         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(2))), differenceElements.get(i++));
194         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
195         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(3))), differenceElements.get(i++));
196         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
197         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(4))), differenceElements.get(i++));
198         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
199         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(5))), differenceElements.get(i++));
200         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
201         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.RBRACE)), differenceElements.get(i++));
202         assertEquals(i, differenceElements.size());
203     }
204 
205     @Test
annotationDeclarationExampleWithJavadocRemoved()206     void annotationDeclarationExampleWithJavadocRemoved() throws IOException {
207         considerExample("AnnotationDeclaration_Example9_original");
208         AnnotationDeclaration annotationDeclaration = (AnnotationDeclaration)cu.getType(0);
209         CsmElement element = ConcreteSyntaxModel.forClass(annotationDeclaration.getClass());
210         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(element, annotationDeclaration);
211         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterPropertyChange(element, annotationDeclaration, ObservableProperty.COMMENT, annotationDeclaration.getComment().get(), null);
212         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
213         DifferenceElementCalculator.removeIndentationElements(differenceElements);
214         int i = 0;
215         assertEquals(kept(new CsmChild(Modifier.publicModifier())), differenceElements.get(i++));
216         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
217         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.AT)), differenceElements.get(i++));
218         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.INTERFACE)), differenceElements.get(i++));
219         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
220         assertEquals(kept(new CsmChild(annotationDeclaration.getName())), differenceElements.get(i++));
221         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
222         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.LBRACE)), differenceElements.get(i++));
223         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
224         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(0))), differenceElements.get(i++));
225         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
226         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(1))), differenceElements.get(i++));
227         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
228         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(2))), differenceElements.get(i++));
229         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
230         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(3))), differenceElements.get(i++));
231         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
232         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(4))), differenceElements.get(i++));
233         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
234         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(5))), differenceElements.get(i++));
235         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
236         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.RBRACE)), differenceElements.get(i++));
237         assertEquals(i, differenceElements.size());
238     }
239 
240     @Test
annotationDeclarationExampleWithModifierRemoved()241     void annotationDeclarationExampleWithModifierRemoved() throws IOException {
242         considerExample("AnnotationDeclaration_Example3_original");
243         AnnotationDeclaration annotationDeclaration = (AnnotationDeclaration)cu.getType(0);
244         CsmElement element = ConcreteSyntaxModel.forClass(annotationDeclaration.getClass());
245         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(element, annotationDeclaration);
246         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterPropertyChange(element, annotationDeclaration, ObservableProperty.MODIFIERS, createModifierList(PUBLIC), new NodeList<>());
247         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
248         DifferenceElementCalculator.removeIndentationElements(differenceElements);
249         int i = 0;
250         assertEquals(removed(new CsmChild(Modifier.publicModifier())), differenceElements.get(i++));
251         assertEquals(removed(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
252         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.AT)), differenceElements.get(i++));
253         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.INTERFACE)), differenceElements.get(i++));
254         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
255         assertEquals(kept(new CsmChild(annotationDeclaration.getName())), differenceElements.get(i++));
256         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
257         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.LBRACE)), differenceElements.get(i++));
258         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
259         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(0))), differenceElements.get(i++));
260         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
261         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(1))), differenceElements.get(i++));
262         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
263         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(2))), differenceElements.get(i++));
264         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
265         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(3))), differenceElements.get(i++));
266         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
267         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(4))), differenceElements.get(i++));
268         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
269         assertEquals(kept(new CsmChild(annotationDeclaration.getMember(5))), differenceElements.get(i++));
270         assertEquals(kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
271         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.RBRACE)), differenceElements.get(i++));
272         assertEquals(i, differenceElements.size());
273     }
274 
275     @Test
removeDefaultValueInAnnotationMemberDeclaration()276     void removeDefaultValueInAnnotationMemberDeclaration() {
277         AnnotationMemberDeclaration md = considerAmd("int foo() default 10;");
278         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(md);
279         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterPropertyChange(md, ObservableProperty.DEFAULT_VALUE, md.getDefaultValue(), null);
280         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
281         int i = 0;
282         assertEquals(kept(new CsmChild(md.getType())), differenceElements.get(i++));
283         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
284         assertEquals(kept(new CsmChild(md.getName())), differenceElements.get(i++));
285         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.LPAREN)), differenceElements.get(i++));
286         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.RPAREN)), differenceElements.get(i++));
287         assertEquals(removed(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
288         assertEquals(removed(new CsmToken(GeneratedJavaParserConstants._DEFAULT)), differenceElements.get(i++));
289         assertEquals(removed(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
290         assertEquals(removed(new CsmChild(md.getDefaultValue().get())), differenceElements.get(i++));
291         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.SEMICOLON)), differenceElements.get(i++));
292         assertEquals(i, differenceElements.size());
293     }
294 
295     @Test
addedDefaultValueInAnnotationMemberDeclaration()296     void addedDefaultValueInAnnotationMemberDeclaration() {
297         AnnotationMemberDeclaration md = considerAmd("int foo();");
298         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(md);
299         Expression defaultValue = new IntegerLiteralExpr(("10"));
300         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterPropertyChange(md, ObservableProperty.DEFAULT_VALUE, null, defaultValue);
301         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
302         int i = 0;
303         assertEquals(kept(new CsmChild(md.getType())), differenceElements.get(i++));
304         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
305         assertEquals(kept(new CsmChild(md.getName())), differenceElements.get(i++));
306         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.LPAREN)), differenceElements.get(i++));
307         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.RPAREN)), differenceElements.get(i++));
308         assertEquals(added(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
309         assertEquals(added(new CsmToken(GeneratedJavaParserConstants._DEFAULT)), differenceElements.get(i++));
310         assertEquals(added(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
311         assertEquals(added(new CsmChild(defaultValue)), differenceElements.get(i++));
312         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.SEMICOLON)), differenceElements.get(i++));
313         assertEquals(i, differenceElements.size());
314     }
315 
316     @Test
addedModifierToConstructorDeclaration()317     void addedModifierToConstructorDeclaration() {
318         ConstructorDeclaration cd = considerCd("A(){}");
319         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(cd);
320         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterPropertyChange(cd, ObservableProperty.MODIFIERS,
321                 new NodeList<>(), createModifierList(PUBLIC));
322         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
323         int i = 0;
324         assertEquals(added(new CsmChild(Modifier.publicModifier())), differenceElements.get(i++));
325         assertEquals(added(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
326         assertEquals(kept(new CsmChild(cd.getName())), differenceElements.get(i++));
327         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.LPAREN)), differenceElements.get(i++));
328         assertEquals(kept(new CsmToken(GeneratedJavaParserConstants.RPAREN)), differenceElements.get(i++));
329         assertEquals(kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
330         assertEquals(kept(new CsmChild(cd.getBody())), differenceElements.get(i++));
331         assertEquals(i, differenceElements.size());
332     }
333 
334     @Test
replacingNameForEnumConstantDeclaration()335     void replacingNameForEnumConstantDeclaration() {
336         EnumConstantDeclaration ecd = considerEcd("A");
337         SimpleName newName = new SimpleName("B");
338         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(ecd);
339         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterPropertyChange(ecd, ObservableProperty.NAME,
340                 ecd.getName(), newName);
341         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
342         int i = 0;
343         assertEquals(DifferenceElement.removed(new CsmChild(ecd.getName())), differenceElements.get(i++));
344         assertEquals(DifferenceElement.added(new CsmChild(newName)), differenceElements.get(i++));
345         assertEquals(i, differenceElements.size());
346     }
347 
348     @Test
addingStatementToEmptyMethodBody()349     void addingStatementToEmptyMethodBody() {
350         String code = "class A { void foo(char p1, int p2) {} }";
351         considerCode(code);
352 
353         Statement s = new ExpressionStmt(new BinaryExpr(
354                 new IntegerLiteralExpr("10"), new IntegerLiteralExpr("2"), BinaryExpr.Operator.PLUS
355         ));
356         MethodDeclaration m = cu.getClassByName("A").get().getMethodsByName("foo").get(0);
357         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(m.getBody().get());
358         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterListAddition(m.getBody().get(), ObservableProperty.STATEMENTS, 0, s);
359         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
360         int i = 0;
361         assertEquals(DifferenceElement.kept(new CsmToken(GeneratedJavaParserConstants.LBRACE)), differenceElements.get(i++));
362         assertEquals(DifferenceElement.kept(new CsmToken(eolTokenKind())), differenceElements.get(i++));
363         assertEquals(DifferenceElement.added(new CsmIndent()), differenceElements.get(i++));
364         assertEquals(DifferenceElement.added(new CsmChild(s)), differenceElements.get(i++));
365         assertEquals(DifferenceElement.added(new CsmToken(eolTokenKind())), differenceElements.get(i++));
366         assertEquals(DifferenceElement.added(new CsmUnindent()), differenceElements.get(i++));
367         assertEquals(DifferenceElement.kept(new CsmToken(GeneratedJavaParserConstants.RBRACE)), differenceElements.get(i++));
368         assertEquals(i, differenceElements.size());
369     }
370 
371     @Test
methodDeclarationRemovingParameter()372     void methodDeclarationRemovingParameter() {
373         MethodDeclaration md = considerMd("public void foo(float f){}");
374         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(md);
375         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterListRemoval(md, ObservableProperty.PARAMETERS, 0);
376         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
377         int i = 0;
378         assertEquals(DifferenceElement.kept(new CsmChild(Modifier.publicModifier())), differenceElements.get(i++));
379         assertEquals(DifferenceElement.kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
380         assertEquals(DifferenceElement.kept(new CsmChild(md.getType())), differenceElements.get(i++));
381         assertEquals(DifferenceElement.kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
382         assertEquals(DifferenceElement.kept(new CsmChild(md.getName())), differenceElements.get(i++));
383         assertEquals(DifferenceElement.kept(new CsmToken(GeneratedJavaParserConstants.LPAREN)), differenceElements.get(i++));
384         assertEquals(DifferenceElement.removed(new CsmChild(md.getParameter(0))), differenceElements.get(i++));
385         assertEquals(DifferenceElement.kept(new CsmToken(GeneratedJavaParserConstants.RPAREN)), differenceElements.get(i++));
386         assertEquals(DifferenceElement.kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
387         assertEquals(DifferenceElement.kept(new CsmChild(md.getBody().get())), differenceElements.get(i++));
388         assertEquals(i, differenceElements.size());
389     }
390 
391     @Test
methodDeclarationAddingParameter()392     void methodDeclarationAddingParameter() {
393         MethodDeclaration md = considerMd("public void foo(){}");
394         Parameter newParameter = new Parameter(new ArrayType(PrimitiveType.intType()), new SimpleName("foo"));
395         LexicalDifferenceCalculator.CalculatedSyntaxModel csmOriginal = new LexicalDifferenceCalculator().calculatedSyntaxModelForNode(md);
396         LexicalDifferenceCalculator.CalculatedSyntaxModel csmChanged = new LexicalDifferenceCalculator().calculatedSyntaxModelAfterListAddition(md, ObservableProperty.PARAMETERS, 0, newParameter);
397         List<DifferenceElement> differenceElements = DifferenceElementCalculator.calculate(csmOriginal, csmChanged);
398         int i = 0;
399         assertEquals(DifferenceElement.kept(new CsmChild(Modifier.publicModifier())), differenceElements.get(i++));
400         assertEquals(DifferenceElement.kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
401         assertEquals(DifferenceElement.kept(new CsmChild(md.getType())), differenceElements.get(i++));
402         assertEquals(DifferenceElement.kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
403         assertEquals(DifferenceElement.kept(new CsmChild(md.getName())), differenceElements.get(i++));
404         assertEquals(DifferenceElement.kept(new CsmToken(GeneratedJavaParserConstants.LPAREN)), differenceElements.get(i++));
405         assertEquals(DifferenceElement.added(new CsmChild(newParameter)), differenceElements.get(i++));
406         assertEquals(DifferenceElement.kept(new CsmToken(GeneratedJavaParserConstants.RPAREN)), differenceElements.get(i++));
407         assertEquals(DifferenceElement.kept(new CsmToken(spaceTokenKind())), differenceElements.get(i++));
408         assertEquals(DifferenceElement.kept(new CsmChild(md.getBody().get())), differenceElements.get(i++));
409         assertEquals(i, differenceElements.size());
410     }
411 
considerAmd(String code)412     private AnnotationMemberDeclaration considerAmd(String code) {
413         considerCode("@interface AD { " + code + " }");
414         return (AnnotationMemberDeclaration)cu.getAnnotationDeclarationByName("AD").get().getMember(0);
415     }
416 
considerCd(String code)417     private ConstructorDeclaration considerCd(String code) {
418         considerCode("class A { " + code + " }");
419         return (ConstructorDeclaration) cu.getType(0).getMembers().get(0);
420     }
421 
considerEcd(String code)422     private EnumConstantDeclaration considerEcd(String code) {
423         considerCode("enum A { " + code + " }");
424         return ((EnumDeclaration)cu.getType(0)).getEntries().get(0);
425     }
426 
considerMd(String code)427     private MethodDeclaration considerMd(String code) {
428         considerCode("class A { " + code + " }");
429         return (MethodDeclaration) cu.getType(0).getMembers().get(0);
430     }
431 }
432