1 package com.github.javaparser.ast.validator;
2 
3 import com.github.javaparser.JavaParser;
4 import com.github.javaparser.ParseResult;
5 import com.github.javaparser.ParserConfiguration;
6 import com.github.javaparser.ast.CompilationUnit;
7 import com.github.javaparser.ast.expr.Expression;
8 import com.github.javaparser.ast.stmt.Statement;
9 import org.junit.Test;
10 
11 import static com.github.javaparser.ParseStart.COMPILATION_UNIT;
12 import static com.github.javaparser.ParseStart.EXPRESSION;
13 import static com.github.javaparser.ParseStart.STATEMENT;
14 import static com.github.javaparser.ParserConfiguration.LanguageLevel.*;
15 import static com.github.javaparser.Providers.provider;
16 import static com.github.javaparser.utils.TestUtils.assertNoProblems;
17 import static com.github.javaparser.utils.TestUtils.assertProblems;
18 
19 public class Java1_1ValidatorTest {
20     public static final JavaParser javaParser = new JavaParser(new ParserConfiguration().setLanguageLevel(JAVA_1_1));
21 
22     public static final String allModifiers = "public protected private abstract static final transient volatile synchronized native strictfp transitive default ";
23 
24     @Test
topClass()25     public void topClass() {
26         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider(allModifiers + "class X{}"));
27         assertProblems(result,
28                 "(line 1,col 1) Can have only one of 'public', 'protected', 'private'.",
29                 "(line 1,col 1) Can have only one of 'final', 'abstract'.",
30                 "(line 1,col 1) 'transient' is not allowed here.",
31                 "(line 1,col 1) 'default' is not allowed here.",
32                 "(line 1,col 1) 'volatile' is not allowed here.",
33                 "(line 1,col 1) 'strictfp' is not allowed here.",
34                 "(line 1,col 1) 'private' is not allowed here.",
35                 "(line 1,col 1) 'protected' is not allowed here.",
36                 "(line 1,col 1) 'synchronized' is not allowed here.",
37                 "(line 1,col 1) 'native' is not allowed here.",
38                 "(line 1,col 1) 'transitive' is not allowed here.",
39                 "(line 1,col 1) 'static' is not allowed here."
40         );
41     }
42 
43     @Test
nestedClass()44     public void nestedClass() {
45         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{" + allModifiers + "class I{}}"));
46         assertProblems(result,
47                 "(line 1,col 9) Can have only one of 'public', 'protected', 'private'.",
48                 "(line 1,col 9) Can have only one of 'final', 'abstract'.",
49                 "(line 1,col 9) 'transient' is not allowed here.",
50                 "(line 1,col 9) 'default' is not allowed here.",
51                 "(line 1,col 9) 'strictfp' is not allowed here.",
52                 "(line 1,col 9) 'volatile' is not allowed here.",
53                 "(line 1,col 9) 'synchronized' is not allowed here.",
54                 "(line 1,col 9) 'native' is not allowed here.",
55                 "(line 1,col 9) 'transitive' is not allowed here."
56         );
57     }
58 
59     @Test
localClass()60     public void localClass() {
61         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{ void x() {" + allModifiers + "class I{}}}"));
62         assertProblems(result,
63                 "(line 1,col 20) Can have only one of 'public', 'protected', 'private'.",
64                 "(line 1,col 20) Can have only one of 'final', 'abstract'.",
65                 "(line 1,col 20) 'transient' is not allowed here.",
66                 "(line 1,col 20) 'volatile' is not allowed here.",
67                 "(line 1,col 20) 'default' is not allowed here.",
68                 "(line 1,col 20) 'synchronized' is not allowed here.",
69                 "(line 1,col 20) 'native' is not allowed here.",
70                 "(line 1,col 20) 'transitive' is not allowed here.",
71                 "(line 1,col 20) 'strictfp' is not allowed here.",
72                 "(line 1,col 20) 'static' is not allowed here.",
73                 "(line 1,col 20) 'public' is not allowed here.",
74                 "(line 1,col 20) 'private' is not allowed here.",
75                 "(line 1,col 20) 'protected' is not allowed here."
76         );
77     }
78 
79     @Test
topInterface()80     public void topInterface() {
81         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider(allModifiers + "interface X{}"));
82         assertProblems(result,
83                 "(line 1,col 1) Can have only one of 'public', 'protected', 'private'.",
84                 "(line 1,col 1) Can have only one of 'final', 'abstract'.",
85                 "(line 1,col 1) 'transient' is not allowed here.",
86                 "(line 1,col 1) 'volatile' is not allowed here.",
87                 "(line 1,col 1) 'default' is not allowed here.",
88                 "(line 1,col 1) 'strictfp' is not allowed here.",
89                 "(line 1,col 1) 'synchronized' is not allowed here.",
90                 "(line 1,col 1) 'native' is not allowed here.",
91                 "(line 1,col 1) 'transitive' is not allowed here.",
92                 "(line 1,col 1) 'static' is not allowed here.",
93                 "(line 1,col 1) 'final' is not allowed here.",
94                 "(line 1,col 1) 'private' is not allowed here.",
95                 "(line 1,col 1) 'protected' is not allowed here."
96         );
97     }
98 
99     @Test
nestedInterface()100     public void nestedInterface() {
101         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{" + allModifiers + "interface I{}}"));
102         assertProblems(result,
103                 "(line 1,col 9) Can have only one of 'public', 'protected', 'private'.",
104                 "(line 1,col 9) Can have only one of 'final', 'abstract'.",
105                 "(line 1,col 9) 'transient' is not allowed here.",
106                 "(line 1,col 9) 'volatile' is not allowed here.",
107                 "(line 1,col 9) 'default' is not allowed here.",
108                 "(line 1,col 9) 'final' is not allowed here.",
109                 "(line 1,col 9) 'strictfp' is not allowed here.",
110                 "(line 1,col 9) 'synchronized' is not allowed here.",
111                 "(line 1,col 9) 'native' is not allowed here.",
112                 "(line 1,col 9) 'transitive' is not allowed here."
113         );
114     }
115 
116     @Test
constructor()117     public void constructor() {
118         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{" + allModifiers + "X(){};}"));
119         assertProblems(result,
120                 "(line 1,col 9) Can have only one of 'public', 'protected', 'private'.",
121                 "(line 1,col 9) Can have only one of 'final', 'abstract'.",
122                 "(line 1,col 9) 'transient' is not allowed here.",
123                 "(line 1,col 9) 'volatile' is not allowed here.",
124                 "(line 1,col 9) 'final' is not allowed here.",
125                 "(line 1,col 9) 'strictfp' is not allowed here.",
126                 "(line 1,col 9) 'synchronized' is not allowed here.",
127                 "(line 1,col 9) 'default' is not allowed here.",
128                 "(line 1,col 9) 'native' is not allowed here.",
129                 "(line 1,col 9) 'strictfp' is not allowed here.",
130                 "(line 1,col 9) 'abstract' is not allowed here.",
131                 "(line 1,col 9) 'static' is not allowed here.",
132                 "(line 1,col 9) 'transitive' is not allowed here."
133         );
134     }
135 
136     @Test
constructorParameter()137     public void constructorParameter() {
138         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{X(" + allModifiers + " int i){};}"));
139         assertProblems(result,
140                 "(line 1,col 11) Can have only one of 'public', 'protected', 'private'.",
141                 "(line 1,col 11) Can have only one of 'final', 'abstract'.",
142                 "(line 1,col 11) 'transient' is not allowed here.",
143                 "(line 1,col 11) 'volatile' is not allowed here.",
144                 "(line 1,col 11) 'synchronized' is not allowed here.",
145                 "(line 1,col 11) 'native' is not allowed here.",
146                 "(line 1,col 11) 'strictfp' is not allowed here.",
147                 "(line 1,col 11) 'default' is not allowed here.",
148                 "(line 1,col 11) 'abstract' is not allowed here.",
149                 "(line 1,col 11) 'static' is not allowed here.",
150                 "(line 1,col 11) 'transitive' is not allowed here.",
151                 "(line 1,col 11) 'private' is not allowed here.",
152                 "(line 1,col 11) 'public' is not allowed here.",
153                 "(line 1,col 11) 'protected' is not allowed here."
154         );
155     }
156 
157     @Test
classMethod()158     public void classMethod() {
159         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{" + allModifiers + "int x(){};}"));
160         assertProblems(result,
161                 "(line 1,col 9) Can have only one of 'public', 'protected', 'private'.",
162                 "(line 1,col 9) Can have only one of 'final', 'abstract'.",
163                 "(line 1,col 9) Cannot be 'abstract' and also 'private', 'static', 'final', 'native', 'strictfp', 'synchronized'.",
164                 "(line 1,col 9) 'transient' is not allowed here.",
165                 "(line 1,col 9) 'default' is not allowed here.",
166                 "(line 1,col 9) 'strictfp' is not allowed here.",
167                 "(line 1,col 9) 'volatile' is not allowed here.",
168                 "(line 1,col 9) 'transitive' is not allowed here."
169         );
170     }
171 
172     @Test
interfaceMethod()173     public void interfaceMethod() {
174         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("interface X{" + allModifiers + "int x(){};}"));
175         assertProblems(result,
176                 "(line 1,col 13) Can have only one of 'public', 'protected', 'private'.",
177                 "(line 1,col 13) Can have only one of 'final', 'abstract'.",
178                 "(line 1,col 13) Cannot be 'abstract' and also 'private', 'static', 'final', 'native', 'strictfp', 'synchronized'.",
179                 "(line 1,col 13) 'transient' is not allowed here.",
180                 "(line 1,col 13) 'strictfp' is not allowed here.",
181                 "(line 1,col 13) 'volatile' is not allowed here.",
182                 "(line 1,col 13) 'default' is not allowed here.",
183                 "(line 1,col 13) 'transitive' is not allowed here.",
184                 "(line 1,col 13) 'private' is not allowed here.",
185                 "(line 1,col 13) 'static' is not allowed here."
186         );
187     }
188 
189     @Test
methodParameter()190     public void methodParameter() {
191         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{int x(" + allModifiers + " int i){};}"));
192         assertProblems(result,
193                 "(line 1,col 15) Can have only one of 'public', 'protected', 'private'.",
194                 "(line 1,col 15) Can have only one of 'final', 'abstract'.",
195                 "(line 1,col 15) 'transient' is not allowed here.",
196                 "(line 1,col 15) 'volatile' is not allowed here.",
197                 "(line 1,col 15) 'synchronized' is not allowed here.",
198                 "(line 1,col 15) 'native' is not allowed here.",
199                 "(line 1,col 15) 'strictfp' is not allowed here.",
200                 "(line 1,col 15) 'abstract' is not allowed here.",
201                 "(line 1,col 15) 'default' is not allowed here.",
202                 "(line 1,col 15) 'static' is not allowed here.",
203                 "(line 1,col 15) 'transitive' is not allowed here.",
204                 "(line 1,col 15) 'private' is not allowed here.",
205                 "(line 1,col 15) 'public' is not allowed here.",
206                 "(line 1,col 15) 'protected' is not allowed here."
207         );
208     }
209 
210     @Test
field()211     public void field() {
212         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{" + allModifiers + "int i;}"));
213         assertProblems(result,
214                 "(line 1,col 9) Can have only one of 'public', 'protected', 'private'.",
215                 "(line 1,col 9) Can have only one of 'final', 'abstract'.",
216                 "(line 1,col 9) 'synchronized' is not allowed here.",
217                 "(line 1,col 9) 'native' is not allowed here.",
218                 "(line 1,col 9) 'strictfp' is not allowed here.",
219                 "(line 1,col 9) 'default' is not allowed here.",
220                 "(line 1,col 9) 'abstract' is not allowed here.",
221                 "(line 1,col 9) 'transitive' is not allowed here."
222         );
223     }
224 
225     @Test
localVariable()226     public void localVariable() {
227         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{int x(){" + allModifiers + "int i;}}"));
228         assertProblems(result,
229                 "(line 1,col 17) Can have only one of 'public', 'protected', 'private'.",
230                 "(line 1,col 17) Can have only one of 'final', 'abstract'.",
231                 "(line 1,col 17) 'transient' is not allowed here.",
232                 "(line 1,col 17) 'volatile' is not allowed here.",
233                 "(line 1,col 17) 'synchronized' is not allowed here.",
234                 "(line 1,col 17) 'native' is not allowed here.",
235                 "(line 1,col 17) 'default' is not allowed here.",
236                 "(line 1,col 17) 'strictfp' is not allowed here.",
237                 "(line 1,col 17) 'abstract' is not allowed here.",
238                 "(line 1,col 17) 'static' is not allowed here.",
239                 "(line 1,col 17) 'transitive' is not allowed here.",
240                 "(line 1,col 17) 'private' is not allowed here.",
241                 "(line 1,col 17) 'public' is not allowed here.",
242                 "(line 1,col 17) 'protected' is not allowed here."
243         );
244     }
245 
246 
247     @Test
catchParameter()248     public void catchParameter() {
249         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{int x(){ try{}catch(" + allModifiers + " Integer x){}}}"));
250         assertProblems(result,
251                 "(line 1,col 144) Can have only one of 'public', 'protected', 'private'.",
252                 "(line 1,col 144) Can have only one of 'final', 'abstract'.",
253                 "(line 1,col 144) 'transient' is not allowed here.",
254                 "(line 1,col 144) 'volatile' is not allowed here.",
255                 "(line 1,col 144) 'synchronized' is not allowed here.",
256                 "(line 1,col 144) 'native' is not allowed here.",
257                 "(line 1,col 144) 'default' is not allowed here.",
258                 "(line 1,col 144) 'strictfp' is not allowed here.",
259                 "(line 1,col 144) 'abstract' is not allowed here.",
260                 "(line 1,col 144) 'static' is not allowed here.",
261                 "(line 1,col 144) 'transitive' is not allowed here.",
262                 "(line 1,col 144) 'private' is not allowed here.",
263                 "(line 1,col 144) 'public' is not allowed here.",
264                 "(line 1,col 144) 'protected' is not allowed here."
265         );
266     }
267 
268     @Test
innerClasses()269     public void innerClasses() {
270         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{class Y{}}"));
271         assertNoProblems(result);
272     }
273 
274     @Test
localInterface()275     public void localInterface() {
276         ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("class X{ void x() {" + allModifiers + "interface I{}}}"));
277         assertProblems(result, "(line 1,col 20) There is no such thing as a local interface."
278         );
279     }
280 
281     @Test
reflection()282     public void reflection() {
283         ParseResult<Expression> result = javaParser.parse(EXPRESSION, provider("Abc.class"));
284         assertNoProblems(result);
285     }
286 
287     @Test
strictfpAllowedAsIdentifier()288     public void strictfpAllowedAsIdentifier() {
289         ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("int strictfp;"));
290         assertNoProblems(result);
291     }
292 }
293