test/tools/javac/lambda/LambdaParserTest.java

changeset 1482
954541f13717
parent 1436
f6f1fd261f57
child 1503
2d2b2be57c78
equal deleted inserted replaced
1481:d07340b61e6a 1482:954541f13717
1 /* 1 /*
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
25 * @test 25 * @test
26 * @bug 7115050 26 * @bug 7115050
27 * @bug 8003280 27 * @bug 8003280
28 * @summary Add lambda tests 28 * @summary Add lambda tests
29 * Add parser support for lambda expressions 29 * Add parser support for lambda expressions
30 * @library ../lib
31 * @build JavacTestingAbstractThreadedTest
32 * @run main LambdaParserTest
30 */ 33 */
31 34
32 import com.sun.source.util.JavacTask;
33 import java.net.URI; 35 import java.net.URI;
34 import java.util.Arrays; 36 import java.util.Arrays;
35 import javax.tools.Diagnostic; 37 import javax.tools.Diagnostic;
36 import javax.tools.JavaCompiler;
37 import javax.tools.JavaFileObject; 38 import javax.tools.JavaFileObject;
38 import javax.tools.SimpleJavaFileObject; 39 import javax.tools.SimpleJavaFileObject;
39 import javax.tools.StandardJavaFileManager; 40 import com.sun.source.util.JavacTask;
40 import javax.tools.ToolProvider; 41
41 42 public class LambdaParserTest
42 public class LambdaParserTest { 43 extends JavacTestingAbstractThreadedTest
43 44 implements Runnable {
44 static int checkCount = 0;
45 45
46 enum LambdaKind { 46 enum LambdaKind {
47 NILARY_EXPR("()->x"), 47 NILARY_EXPR("()->x"),
48 NILARY_STMT("()->{ return x; }"), 48 NILARY_STMT("()->{ return x; }"),
49 ONEARY_SHORT_EXPR("x->x"), 49 ONEARY_SHORT_EXPR("x->x"),
171 this.subExpression = subExpression; 171 this.subExpression = subExpression;
172 } 172 }
173 } 173 }
174 174
175 public static void main(String... args) throws Exception { 175 public static void main(String... args) throws Exception {
176
177 //create default shared JavaCompiler - reused across multiple compilations
178 JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
179 StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
180
181 for (LambdaKind lk : LambdaKind.values()) { 176 for (LambdaKind lk : LambdaKind.values()) {
182 for (LambdaParameterKind pk1 : LambdaParameterKind.values()) { 177 for (LambdaParameterKind pk1 : LambdaParameterKind.values()) {
183 if (lk.arity() < 1 && pk1 != LambdaParameterKind.IMPLICIT) continue; 178 if (lk.arity() < 1 && pk1 != LambdaParameterKind.IMPLICIT)
179 continue;
184 for (LambdaParameterKind pk2 : LambdaParameterKind.values()) { 180 for (LambdaParameterKind pk2 : LambdaParameterKind.values()) {
185 if (lk.arity() < 2 && pk2 != LambdaParameterKind.IMPLICIT) continue; 181 if (lk.arity() < 2 && pk2 != LambdaParameterKind.IMPLICIT)
182 continue;
186 for (ModifierKind mk1 : ModifierKind.values()) { 183 for (ModifierKind mk1 : ModifierKind.values()) {
187 if (mk1 != ModifierKind.NONE && lk.isShort()) continue; 184 if (mk1 != ModifierKind.NONE && lk.isShort())
188 if (lk.arity() < 1 && mk1 != ModifierKind.NONE) continue; 185 continue;
186 if (lk.arity() < 1 && mk1 != ModifierKind.NONE)
187 continue;
189 for (ModifierKind mk2 : ModifierKind.values()) { 188 for (ModifierKind mk2 : ModifierKind.values()) {
190 if (lk.arity() < 2 && mk2 != ModifierKind.NONE) continue; 189 if (lk.arity() < 2 && mk2 != ModifierKind.NONE)
190 continue;
191 for (SubExprKind sk : SubExprKind.values()) { 191 for (SubExprKind sk : SubExprKind.values()) {
192 for (ExprKind ek : ExprKind.values()) { 192 for (ExprKind ek : ExprKind.values()) {
193 new LambdaParserTest(pk1, pk2, mk1, mk2, lk, sk, ek) 193 pool.execute(
194 .run(comp, fm); 194 new LambdaParserTest(pk1, pk2, mk1,
195 mk2, lk, sk, ek));
195 } 196 }
196 } 197 }
197 } 198 }
198 } 199 }
199 } 200 }
200 } 201 }
201 } 202 }
202 System.out.println("Total check executed: " + checkCount); 203
204 checkAfterExec();
203 } 205 }
204 206
205 LambdaParameterKind pk1; 207 LambdaParameterKind pk1;
206 LambdaParameterKind pk2; 208 LambdaParameterKind pk2;
207 ModifierKind mk1; 209 ModifierKind mk1;
210 SubExprKind sk; 212 SubExprKind sk;
211 ExprKind ek; 213 ExprKind ek;
212 JavaSource source; 214 JavaSource source;
213 DiagnosticChecker diagChecker; 215 DiagnosticChecker diagChecker;
214 216
215 LambdaParserTest(LambdaParameterKind pk1, LambdaParameterKind pk2, ModifierKind mk1, 217 LambdaParserTest(LambdaParameterKind pk1, LambdaParameterKind pk2,
216 ModifierKind mk2, LambdaKind lk, SubExprKind sk, ExprKind ek) { 218 ModifierKind mk1, ModifierKind mk2, LambdaKind lk,
219 SubExprKind sk, ExprKind ek) {
217 this.pk1 = pk1; 220 this.pk1 = pk1;
218 this.pk2 = pk2; 221 this.pk2 = pk2;
219 this.mk1 = mk1; 222 this.mk1 = mk1;
220 this.mk2 = mk2; 223 this.mk2 = mk2;
221 this.lk = lk; 224 this.lk = lk;
233 236
234 String source; 237 String source;
235 238
236 public JavaSource() { 239 public JavaSource() {
237 super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE); 240 super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
238 source = template.replaceAll("#E", ek.expressionString(pk1, pk2, mk1, mk2, lk, sk)); 241 source = template.replaceAll("#E",
242 ek.expressionString(pk1, pk2, mk1, mk2, lk, sk));
239 } 243 }
240 244
241 @Override 245 @Override
242 public CharSequence getCharContent(boolean ignoreEncodingErrors) { 246 public CharSequence getCharContent(boolean ignoreEncodingErrors) {
243 return source; 247 return source;
244 } 248 }
245 } 249 }
246 250
247 void run(JavaCompiler tool, StandardJavaFileManager fm) throws Exception { 251 public void run() {
248 JavacTask ct = (JavacTask)tool.getTask(null, fm, diagChecker, 252 JavacTask ct = (JavacTask)comp.getTask(null, fm.get(), diagChecker,
249 null, null, Arrays.asList(source)); 253 null, null, Arrays.asList(source));
250 try { 254 try {
251 ct.parse(); 255 ct.parse();
252 } catch (Throwable ex) { 256 } catch (Throwable ex) {
253 throw new AssertionError("Error thrown when parsing the following source:\n" + source.getCharContent(true)); 257 processException(ex);
258 return;
254 } 259 }
255 check(); 260 check();
256 } 261 }
257 262
258 void check() { 263 void check() {
259 checkCount++; 264 checkCount.incrementAndGet();
260 265
261 boolean errorExpected = (lk.arity() > 0 && !mk1.compatibleWith(pk1)) || 266 boolean errorExpected = (lk.arity() > 0 && !mk1.compatibleWith(pk1)) ||
262 (lk.arity() > 1 && !mk2.compatibleWith(pk2)); 267 (lk.arity() > 1 && !mk2.compatibleWith(pk2));
263 268
264 if (lk.arity() == 2 && 269 if (lk.arity() == 2 &&
273 "\nFound error: " + diagChecker.errorFound + 278 "\nFound error: " + diagChecker.errorFound +
274 "\nExpected error: " + errorExpected); 279 "\nExpected error: " + errorExpected);
275 } 280 }
276 } 281 }
277 282
278 static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> { 283 static class DiagnosticChecker
284 implements javax.tools.DiagnosticListener<JavaFileObject> {
279 285
280 boolean errorFound; 286 boolean errorFound;
281 287
282 public void report(Diagnostic<? extends JavaFileObject> diagnostic) { 288 public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
283 if (diagnostic.getKind() == Diagnostic.Kind.ERROR) { 289 if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
284 errorFound = true; 290 errorFound = true;
285 } 291 }
286 } 292 }
287 } 293 }
294
288 } 295 }

mercurial