• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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