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