1 package com.github.javaparser.printer.lexicalpreservation; 2 3 import com.github.javaparser.StaticJavaParser; 4 import com.github.javaparser.ast.CompilationUnit; 5 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; 6 import com.github.javaparser.ast.body.FieldDeclaration; 7 import com.github.javaparser.ast.body.MethodDeclaration; 8 import com.github.javaparser.ast.body.VariableDeclarator; 9 import com.github.javaparser.ast.expr.Expression; 10 import com.github.javaparser.ast.expr.NameExpr; 11 import com.github.javaparser.ast.expr.NullLiteralExpr; 12 import com.github.javaparser.ast.stmt.BlockStmt; 13 import com.github.javaparser.ast.stmt.ReturnStmt; 14 import com.github.javaparser.ast.stmt.Statement; 15 import com.github.javaparser.ast.type.ArrayType; 16 import com.github.javaparser.ast.type.ClassOrInterfaceType; 17 import com.github.javaparser.ast.type.PrimitiveType; 18 import org.junit.jupiter.api.Test; 19 20 import java.io.IOException; 21 import java.lang.reflect.Method; 22 23 import static com.github.javaparser.ast.Modifier.Keyword.STATIC; 24 import static com.github.javaparser.utils.TestUtils.assertEqualsNoEol; 25 import static com.github.javaparser.utils.Utils.EOL; 26 27 /** 28 * These tests are more "high level" than the ones in LexicalPreservingPrinterTest. 29 * The idea is to perform some transformations on the code, print it back and see if the generated code 30 * is the expected one. We do not care about the internal state of LexicalPreservingPrinter, just the visible result. 31 */ 32 class TransformationsTest extends AbstractLexicalPreservingTest { 33 34 @Test unchangedSimpleClasses()35 void unchangedSimpleClasses() throws IOException { 36 assertUnchanged("Example1"); 37 assertUnchanged("Example2"); 38 } 39 40 @Test unchangedComplexFile()41 void unchangedComplexFile() throws IOException { 42 assertUnchanged("Example4"); 43 } 44 45 @Test example1()46 void example1() throws IOException { 47 considerExample("Example1_original"); 48 cu.getClassByName("A").get().getFieldByName("a").get().setModifiers(STATIC); 49 assertTransformed("Example1", cu); 50 } 51 52 @Test example2()53 void example2() throws IOException { 54 considerExample("Example2_original"); 55 cu.getClassByName("A").get().getFieldByName("a").get().getVariable(0).setInitializer("10"); 56 assertTransformed("Example2", cu); 57 } 58 59 @Test example3()60 void example3() throws IOException { 61 considerExample("Example3_original"); 62 cu.getClassByName("A").get().getFieldByName("a").get().getVariable(0).setInitializer((Expression) null); 63 assertTransformed("Example3", cu); 64 } 65 66 @Test example5()67 void example5() throws IOException { 68 considerExample("Example5_original"); 69 cu.getClassByName("A").get().getFieldByName("a").get().getVariable(0).setInitializer(new NullLiteralExpr()); 70 assertTransformed("Example5", cu); 71 } 72 73 @Test example6()74 void example6() throws IOException { 75 considerExample("Example6_original"); 76 cu.getClassByName("A").get().getFieldByName("a").get().getVariable(0).setName("someOtherName"); 77 assertTransformed("Example6", cu); 78 } 79 80 @Test example7()81 void example7() throws IOException { 82 considerExample("Example7_original"); 83 cu.getClassByName("A").get().getFieldByName("a").get().getVariable(0).setType(new ArrayType(PrimitiveType.intType())); 84 assertTransformed("Example7", cu); 85 } 86 87 @Test example8()88 void example8() throws IOException { 89 considerExample("Example8_original"); 90 FieldDeclaration fd = cu.getClassByName("A").get().getMember(0).asFieldDeclaration(); 91 fd.addVariable(new VariableDeclarator(PrimitiveType.intType(), "b")); 92 assertTransformed("Example8", cu); 93 } 94 95 @Test example9()96 void example9() throws IOException { 97 considerExample("Example9_original"); 98 FieldDeclaration fd = cu.getClassByName("A").get().getMember(0).asFieldDeclaration(); 99 fd.addVariable(new VariableDeclarator(new ArrayType(PrimitiveType.intType()), "b")); 100 assertTransformed("Example9", cu); 101 } 102 103 @Test example10()104 void example10() throws IOException { 105 considerExample("Example10_original"); 106 cu.getClassByName("A").get().getMembers().remove(0); 107 assertTransformed("Example10", cu); 108 } 109 110 @Test exampleParam1()111 void exampleParam1() throws IOException { 112 considerExample("Example_param1_original"); 113 MethodDeclaration md = cu.getClassByName("A").get().getMember(0).asMethodDeclaration(); 114 md.addParameter("int", "p1"); 115 assertTransformed("Example_param1", cu); 116 } 117 118 @Test exampleParam2()119 void exampleParam2() throws IOException { 120 considerExample("Example_param1_original"); 121 MethodDeclaration md = cu.getClassByName("A").get().getMember(0).asMethodDeclaration(); 122 md.addParameter(new ArrayType(PrimitiveType.intType()), "p1"); 123 md.addParameter("char", "p2"); 124 assertTransformed("Example_param2", cu); 125 } 126 127 @Test exampleParam3()128 void exampleParam3() throws IOException { 129 considerExample("Example_param3_original"); 130 MethodDeclaration md = cu.getClassByName("A").get().getMember(0).asMethodDeclaration(); 131 md.getParameters().remove(0); 132 assertTransformed("Example_param3", cu); 133 } 134 135 @Test exampleParam4()136 void exampleParam4() throws IOException { 137 considerExample("Example_param3_original"); 138 MethodDeclaration md = cu.getClassByName("A").get().getMember(0).asMethodDeclaration(); 139 md.getParameters().remove(1); 140 assertTransformed("Example_param4", cu); 141 } 142 143 @Test exampleParam5()144 void exampleParam5() throws IOException { 145 considerExample("Example_param3_original"); 146 MethodDeclaration md = cu.getClassByName("A").get().getMember(0).asMethodDeclaration(); 147 md.setType(PrimitiveType.intType()); 148 assertTransformed("Example_param5b", cu); 149 md.getBody().get().getStatements().add(new ReturnStmt(new NameExpr("p1"))); 150 assertTransformed("Example_param5", cu); 151 } 152 153 @Test issue2099AddingStatementAfterTraillingComment1()154 void issue2099AddingStatementAfterTraillingComment1() { 155 Statement statement = LexicalPreservingPrinter.setup(StaticJavaParser.parseStatement( 156 " if(value != null) {" + EOL + 157 " value.value();" + EOL + 158 " }")); 159 160 BlockStmt blockStmt = LexicalPreservingPrinter.setup(StaticJavaParser.parseBlock("{" + EOL + 161 " value1();" + EOL + 162 " value2(); // Test" + EOL + 163 "}")); 164 165 blockStmt.addStatement(statement); 166 String s = LexicalPreservingPrinter.print(blockStmt); 167 String expected = "{\n" + 168 " value1();\n" + 169 " value2(); // Test\n" + 170 " if(value != null) {\n" + 171 " value.value();\n" + 172 " }\n" + 173 "}"; 174 assertEqualsNoEol(expected, s); 175 } 176 177 @Test issue2099AddingStatementAfterTraillingComment2()178 void issue2099AddingStatementAfterTraillingComment2() { 179 Statement statement = LexicalPreservingPrinter.setup(StaticJavaParser.parseStatement( 180 " if(value != null) {" + EOL + 181 " value.value();" + EOL + 182 " }")); 183 184 BlockStmt blockStmt = LexicalPreservingPrinter.setup(StaticJavaParser.parseBlock("{" + EOL + 185 " value1();" + EOL + 186 " value2(); /* test */" + EOL + 187 "}")); 188 189 blockStmt.addStatement(statement); 190 String s = LexicalPreservingPrinter.print(blockStmt); 191 String expected = "{\n" + 192 " value1();\n" + 193 " value2(); /* test */\n" + 194 " if(value != null) {\n" + 195 " value.value();\n" + 196 " }\n" + 197 "}"; 198 assertEqualsNoEol(expected, s); 199 } 200 201 202 @Test addingStatement1()203 void addingStatement1() { 204 Statement statement = LexicalPreservingPrinter.setup(StaticJavaParser.parseStatement( 205 " if(value != null) {" + EOL + 206 " value.value();" + EOL + 207 " }")); 208 209 CompilationUnit compilationUnit = LexicalPreservingPrinter.setup(StaticJavaParser.parse("public class Test {" + EOL + 210 " public void method() {" + EOL + 211 " value1();" + EOL + 212 " value2(); // Test" + EOL + 213 " }" + EOL + 214 "}")); 215 ClassOrInterfaceDeclaration classOrInterfaceDeclaration = (ClassOrInterfaceDeclaration)compilationUnit.getChildNodes().get(0); 216 MethodDeclaration methodDeclaration = (MethodDeclaration)classOrInterfaceDeclaration.getChildNodes().get(2); 217 methodDeclaration.getBody().get().addStatement(statement); 218 219 String s = LexicalPreservingPrinter.print(compilationUnit); 220 String expected = "public class Test {\n" + 221 " public void method() {\n" + 222 " value1();\n" + 223 " value2(); // Test\n" + 224 " if(value != null) {\n" + 225 " value.value();\n" + 226 " }\n" + 227 " }\n" + 228 "}"; 229 assertEqualsNoEol(expected, s); 230 } 231 232 @Test addingStatement2()233 void addingStatement2() { 234 Statement statement = LexicalPreservingPrinter.setup(StaticJavaParser.parseStatement( 235 " if(value != null) {" + EOL + 236 " value.value();" + EOL + 237 " }")); 238 239 CompilationUnit compilationUnit = LexicalPreservingPrinter.setup(StaticJavaParser.parse("public class Test {" + EOL + 240 " public void method() {" + EOL + 241 " value1();" + EOL + 242 " value2();" + EOL + 243 " }" + EOL + 244 "}")); 245 ClassOrInterfaceDeclaration classOrInterfaceDeclaration = (ClassOrInterfaceDeclaration)compilationUnit.getChildNodes().get(0); 246 MethodDeclaration methodDeclaration = (MethodDeclaration)classOrInterfaceDeclaration.getChildNodes().get(2); 247 methodDeclaration.getBody().get().addStatement(statement); 248 249 String s = LexicalPreservingPrinter.print(compilationUnit); 250 String expected = "public class Test {\n" + 251 " public void method() {\n" + 252 " value1();\n" + 253 " value2();\n" + 254 " if(value != null) {\n" + 255 " value.value();\n" + 256 " }\n" + 257 " }\n" + 258 "}"; 259 assertEqualsNoEol(expected, s); 260 } 261 262 @Test addingStatement3()263 void addingStatement3() { 264 Statement statement = LexicalPreservingPrinter.setup(StaticJavaParser.parseStatement( 265 " if(value != null) {" + EOL + 266 " value.value();" + EOL + 267 " }")); 268 269 CompilationUnit compilationUnit = LexicalPreservingPrinter.setup(StaticJavaParser.parse("public class Test {" + EOL + 270 " public void method() {" + EOL + 271 " value1();" + EOL + 272 " value2();" + EOL + EOL + 273 " }" + EOL + 274 "}")); 275 ClassOrInterfaceDeclaration classOrInterfaceDeclaration = (ClassOrInterfaceDeclaration)compilationUnit.getChildNodes().get(0); 276 MethodDeclaration methodDeclaration = (MethodDeclaration)classOrInterfaceDeclaration.getChildNodes().get(2); 277 methodDeclaration.getBody().get().addStatement(statement); 278 279 String s = LexicalPreservingPrinter.print(compilationUnit); 280 String expected = "public class Test {\n" + 281 " public void method() {\n" + 282 " value1();\n" + 283 " value2();\n" + 284 " if(value != null) {\n" + 285 " value.value();\n" + 286 " }\n\n" + 287 " }\n" + 288 "}"; 289 assertEqualsNoEol(expected, s); 290 } 291 } 292