test/tools/javac/parser/JavacParserTest.java

Wed, 27 Apr 2016 01:34:52 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:34:52 +0800
changeset 0
959103a6100f
child 2525
2eb010b6cb22
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/langtools/
changeset: 2573:53ca196be1ae
tag: jdk8u25-b17

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 */
aoqi@0 23
aoqi@0 24 /*
aoqi@0 25 * @test
aoqi@0 26 * @bug 7073631 7159445 7156633
aoqi@0 27 * @summary tests error and diagnostics positions
aoqi@0 28 * @author Jan Lahoda
aoqi@0 29 */
aoqi@0 30
aoqi@0 31 import com.sun.source.tree.BinaryTree;
aoqi@0 32 import com.sun.source.tree.BlockTree;
aoqi@0 33 import com.sun.source.tree.ClassTree;
aoqi@0 34 import com.sun.source.tree.CompilationUnitTree;
aoqi@0 35 import com.sun.source.tree.ErroneousTree;
aoqi@0 36 import com.sun.source.tree.ExpressionStatementTree;
aoqi@0 37 import com.sun.source.tree.ExpressionTree;
aoqi@0 38 import com.sun.source.tree.MethodInvocationTree;
aoqi@0 39 import com.sun.source.tree.MethodTree;
aoqi@0 40 import com.sun.source.tree.ModifiersTree;
aoqi@0 41 import com.sun.source.tree.StatementTree;
aoqi@0 42 import com.sun.source.tree.Tree;
aoqi@0 43 import com.sun.source.tree.Tree.Kind;
aoqi@0 44 import com.sun.source.tree.VariableTree;
aoqi@0 45 import com.sun.source.tree.WhileLoopTree;
aoqi@0 46 import com.sun.source.util.SourcePositions;
aoqi@0 47 import com.sun.source.util.TreeScanner;
aoqi@0 48 import com.sun.source.util.Trees;
aoqi@0 49 import com.sun.tools.javac.api.JavacTaskImpl;
aoqi@0 50 import com.sun.tools.javac.tree.JCTree;
aoqi@0 51 import java.io.IOException;
aoqi@0 52 import java.lang.annotation.ElementType;
aoqi@0 53 import java.lang.annotation.Retention;
aoqi@0 54 import java.lang.annotation.RetentionPolicy;
aoqi@0 55 import java.lang.annotation.Target;
aoqi@0 56 import java.lang.reflect.Method;
aoqi@0 57 import java.net.URI;
aoqi@0 58 import java.util.ArrayList;
aoqi@0 59 import java.util.Arrays;
aoqi@0 60 import java.util.LinkedList;
aoqi@0 61 import java.util.List;
aoqi@0 62 import java.util.regex.Pattern;
aoqi@0 63 import javax.tools.Diagnostic;
aoqi@0 64 import javax.tools.DiagnosticCollector;
aoqi@0 65 import javax.tools.DiagnosticListener;
aoqi@0 66 import javax.tools.JavaCompiler;
aoqi@0 67 import javax.tools.JavaFileObject;
aoqi@0 68 import javax.tools.SimpleJavaFileObject;
aoqi@0 69 import javax.tools.ToolProvider;
aoqi@0 70
aoqi@0 71 public class JavacParserTest extends TestCase {
aoqi@0 72 static final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
aoqi@0 73
aoqi@0 74 private JavacParserTest(){}
aoqi@0 75
aoqi@0 76 public static void main(String... args) throws Exception {
aoqi@0 77 new JavacParserTest().run(args);
aoqi@0 78 }
aoqi@0 79
aoqi@0 80 class MyFileObject extends SimpleJavaFileObject {
aoqi@0 81
aoqi@0 82 private String text;
aoqi@0 83
aoqi@0 84 public MyFileObject(String text) {
aoqi@0 85 super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
aoqi@0 86 this.text = text;
aoqi@0 87 }
aoqi@0 88
aoqi@0 89 @Override
aoqi@0 90 public CharSequence getCharContent(boolean ignoreEncodingErrors) {
aoqi@0 91 return text;
aoqi@0 92 }
aoqi@0 93 }
aoqi@0 94 /*
aoqi@0 95 * converts Windows to Unix style LFs for comparing strings
aoqi@0 96 */
aoqi@0 97 String normalize(String in) {
aoqi@0 98 return in.replace(System.getProperty("line.separator"), "\n");
aoqi@0 99 }
aoqi@0 100
aoqi@0 101 CompilationUnitTree getCompilationUnitTree(String code) throws IOException {
aoqi@0 102
aoqi@0 103 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
aoqi@0 104 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 105 CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 106 return cut;
aoqi@0 107 }
aoqi@0 108
aoqi@0 109 List<String> getErroneousTreeValues(ErroneousTree node) {
aoqi@0 110
aoqi@0 111 List<String> values = new ArrayList<>();
aoqi@0 112 if (node.getErrorTrees() != null) {
aoqi@0 113 for (Tree t : node.getErrorTrees()) {
aoqi@0 114 values.add(t.toString());
aoqi@0 115 }
aoqi@0 116 } else {
aoqi@0 117 throw new RuntimeException("ERROR: No Erroneous tree "
aoqi@0 118 + "has been created.");
aoqi@0 119 }
aoqi@0 120 return values;
aoqi@0 121 }
aoqi@0 122
aoqi@0 123 @Test
aoqi@0 124 void testPositionForSuperConstructorCalls() throws IOException {
aoqi@0 125 assert tool != null;
aoqi@0 126
aoqi@0 127 String code = "package test; public class Test {public Test() {super();}}";
aoqi@0 128
aoqi@0 129 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
aoqi@0 130 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 131 CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 132 SourcePositions pos = Trees.instance(ct).getSourcePositions();
aoqi@0 133
aoqi@0 134 MethodTree method =
aoqi@0 135 (MethodTree) ((ClassTree) cut.getTypeDecls().get(0)).getMembers().get(0);
aoqi@0 136 ExpressionStatementTree es =
aoqi@0 137 (ExpressionStatementTree) method.getBody().getStatements().get(0);
aoqi@0 138
aoqi@0 139 final int esStartPos = code.indexOf(es.toString());
aoqi@0 140 final int esEndPos = esStartPos + es.toString().length();
aoqi@0 141 assertEquals("testPositionForSuperConstructorCalls",
aoqi@0 142 esStartPos, pos.getStartPosition(cut, es));
aoqi@0 143 assertEquals("testPositionForSuperConstructorCalls",
aoqi@0 144 esEndPos, pos.getEndPosition(cut, es));
aoqi@0 145
aoqi@0 146 MethodInvocationTree mit = (MethodInvocationTree) es.getExpression();
aoqi@0 147
aoqi@0 148 final int mitStartPos = code.indexOf(mit.toString());
aoqi@0 149 final int mitEndPos = mitStartPos + mit.toString().length();
aoqi@0 150 assertEquals("testPositionForSuperConstructorCalls",
aoqi@0 151 mitStartPos, pos.getStartPosition(cut, mit));
aoqi@0 152 assertEquals("testPositionForSuperConstructorCalls",
aoqi@0 153 mitEndPos, pos.getEndPosition(cut, mit));
aoqi@0 154
aoqi@0 155 final int methodStartPos = mitStartPos;
aoqi@0 156 final int methodEndPos = methodStartPos + mit.getMethodSelect().toString().length();
aoqi@0 157 assertEquals("testPositionForSuperConstructorCalls",
aoqi@0 158 methodStartPos, pos.getStartPosition(cut, mit.getMethodSelect()));
aoqi@0 159 assertEquals("testPositionForSuperConstructorCalls",
aoqi@0 160 methodEndPos, pos.getEndPosition(cut, mit.getMethodSelect()));
aoqi@0 161 }
aoqi@0 162
aoqi@0 163 @Test
aoqi@0 164 void testPositionForEnumModifiers() throws IOException {
aoqi@0 165 final String theString = "public";
aoqi@0 166 String code = "package test; " + theString + " enum Test {A;}";
aoqi@0 167
aoqi@0 168 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
aoqi@0 169 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 170 CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 171 SourcePositions pos = Trees.instance(ct).getSourcePositions();
aoqi@0 172
aoqi@0 173 ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
aoqi@0 174 ModifiersTree mt = clazz.getModifiers();
aoqi@0 175 int spos = code.indexOf(theString);
aoqi@0 176 int epos = spos + theString.length();
aoqi@0 177 assertEquals("testPositionForEnumModifiers",
aoqi@0 178 spos, pos.getStartPosition(cut, mt));
aoqi@0 179 assertEquals("testPositionForEnumModifiers",
aoqi@0 180 epos, pos.getEndPosition(cut, mt));
aoqi@0 181 }
aoqi@0 182
aoqi@0 183 @Test
aoqi@0 184 void testNewClassWithEnclosing() throws IOException {
aoqi@0 185
aoqi@0 186 final String theString = "Test.this.new d()";
aoqi@0 187 String code = "package test; class Test { " +
aoqi@0 188 "class d {} private void method() { " +
aoqi@0 189 "Object o = " + theString + "; } }";
aoqi@0 190
aoqi@0 191 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
aoqi@0 192 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 193 CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 194 SourcePositions pos = Trees.instance(ct).getSourcePositions();
aoqi@0 195
aoqi@0 196 ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
aoqi@0 197 ExpressionTree est =
aoqi@0 198 ((VariableTree) ((MethodTree) clazz.getMembers().get(1)).getBody().getStatements().get(0)).getInitializer();
aoqi@0 199
aoqi@0 200 final int spos = code.indexOf(theString);
aoqi@0 201 final int epos = spos + theString.length();
aoqi@0 202 assertEquals("testNewClassWithEnclosing",
aoqi@0 203 spos, pos.getStartPosition(cut, est));
aoqi@0 204 assertEquals("testNewClassWithEnclosing",
aoqi@0 205 epos, pos.getEndPosition(cut, est));
aoqi@0 206 }
aoqi@0 207
aoqi@0 208 @Test
aoqi@0 209 void testPreferredPositionForBinaryOp() throws IOException {
aoqi@0 210
aoqi@0 211 String code = "package test; public class Test {"
aoqi@0 212 + "private void test() {"
aoqi@0 213 + "Object o = null; boolean b = o != null && o instanceof String;"
aoqi@0 214 + "} private Test() {}}";
aoqi@0 215
aoqi@0 216 CompilationUnitTree cut = getCompilationUnitTree(code);
aoqi@0 217 ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
aoqi@0 218 MethodTree method = (MethodTree) clazz.getMembers().get(0);
aoqi@0 219 VariableTree condSt = (VariableTree) method.getBody().getStatements().get(1);
aoqi@0 220 BinaryTree cond = (BinaryTree) condSt.getInitializer();
aoqi@0 221
aoqi@0 222 JCTree condJC = (JCTree) cond;
aoqi@0 223 int condStartPos = code.indexOf("&&");
aoqi@0 224 assertEquals("testPreferredPositionForBinaryOp",
aoqi@0 225 condStartPos, condJC.pos);
aoqi@0 226 }
aoqi@0 227
aoqi@0 228 @Test
aoqi@0 229 void testErrorRecoveryForEnhancedForLoop142381() throws IOException {
aoqi@0 230
aoqi@0 231 String code = "package test; class Test { " +
aoqi@0 232 "private void method() { " +
aoqi@0 233 "java.util.Set<String> s = null; for (a : s) {} } }";
aoqi@0 234
aoqi@0 235 final List<Diagnostic<? extends JavaFileObject>> errors =
aoqi@0 236 new LinkedList<Diagnostic<? extends JavaFileObject>>();
aoqi@0 237
aoqi@0 238 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null,
aoqi@0 239 new DiagnosticListener<JavaFileObject>() {
aoqi@0 240 public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
aoqi@0 241 errors.add(diagnostic);
aoqi@0 242 }
aoqi@0 243 }, null, null, Arrays.asList(new MyFileObject(code)));
aoqi@0 244
aoqi@0 245 CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 246
aoqi@0 247 ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
aoqi@0 248 StatementTree forStatement =
aoqi@0 249 ((MethodTree) clazz.getMembers().get(0)).getBody().getStatements().get(1);
aoqi@0 250
aoqi@0 251 assertEquals("testErrorRecoveryForEnhancedForLoop142381",
aoqi@0 252 Kind.ENHANCED_FOR_LOOP, forStatement.getKind());
aoqi@0 253 assertFalse("testErrorRecoveryForEnhancedForLoop142381", errors.isEmpty());
aoqi@0 254 }
aoqi@0 255
aoqi@0 256 @Test
aoqi@0 257 void testPositionAnnotationNoPackage187551() throws IOException {
aoqi@0 258
aoqi@0 259 String code = "\n@interface Test {}";
aoqi@0 260
aoqi@0 261 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
aoqi@0 262 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 263
aoqi@0 264 CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 265 ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
aoqi@0 266 Trees t = Trees.instance(ct);
aoqi@0 267
aoqi@0 268 assertEquals("testPositionAnnotationNoPackage187551",
aoqi@0 269 1, t.getSourcePositions().getStartPosition(cut, clazz));
aoqi@0 270 }
aoqi@0 271
aoqi@0 272 @Test
aoqi@0 273 void testPositionsSane1() throws IOException {
aoqi@0 274 performPositionsSanityTest("package test; class Test { " +
aoqi@0 275 "private void method() { " +
aoqi@0 276 "java.util.List<? extends java.util.List<? extends String>> l; " +
aoqi@0 277 "} }");
aoqi@0 278 }
aoqi@0 279
aoqi@0 280 @Test
aoqi@0 281 void testPositionsSane2() throws IOException {
aoqi@0 282 performPositionsSanityTest("package test; class Test { " +
aoqi@0 283 "private void method() { " +
aoqi@0 284 "java.util.List<? super java.util.List<? super String>> l; " +
aoqi@0 285 "} }");
aoqi@0 286 }
aoqi@0 287
aoqi@0 288 @Test
aoqi@0 289 void testPositionsSane3() throws IOException {
aoqi@0 290 performPositionsSanityTest("package test; class Test { " +
aoqi@0 291 "private void method() { " +
aoqi@0 292 "java.util.List<? super java.util.List<?>> l; } }");
aoqi@0 293 }
aoqi@0 294
aoqi@0 295 private void performPositionsSanityTest(String code) throws IOException {
aoqi@0 296
aoqi@0 297 final List<Diagnostic<? extends JavaFileObject>> errors =
aoqi@0 298 new LinkedList<Diagnostic<? extends JavaFileObject>>();
aoqi@0 299
aoqi@0 300 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null,
aoqi@0 301 new DiagnosticListener<JavaFileObject>() {
aoqi@0 302
aoqi@0 303 public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
aoqi@0 304 errors.add(diagnostic);
aoqi@0 305 }
aoqi@0 306 }, null, null, Arrays.asList(new MyFileObject(code)));
aoqi@0 307
aoqi@0 308 final CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 309 final Trees trees = Trees.instance(ct);
aoqi@0 310
aoqi@0 311 new TreeScanner<Void, Void>() {
aoqi@0 312
aoqi@0 313 private long parentStart = 0;
aoqi@0 314 private long parentEnd = Integer.MAX_VALUE;
aoqi@0 315
aoqi@0 316 @Override
aoqi@0 317 public Void scan(Tree node, Void p) {
aoqi@0 318 if (node == null) {
aoqi@0 319 return null;
aoqi@0 320 }
aoqi@0 321
aoqi@0 322 long start = trees.getSourcePositions().getStartPosition(cut, node);
aoqi@0 323
aoqi@0 324 if (start == (-1)) {
aoqi@0 325 return null; // synthetic tree
aoqi@0 326 }
aoqi@0 327 assertTrue(node.toString() + ":" + start + "/" + parentStart,
aoqi@0 328 parentStart <= start);
aoqi@0 329
aoqi@0 330 long prevParentStart = parentStart;
aoqi@0 331
aoqi@0 332 parentStart = start;
aoqi@0 333
aoqi@0 334 long end = trees.getSourcePositions().getEndPosition(cut, node);
aoqi@0 335
aoqi@0 336 assertTrue(node.toString() + ":" + end + "/" + parentEnd,
aoqi@0 337 end <= parentEnd);
aoqi@0 338
aoqi@0 339 long prevParentEnd = parentEnd;
aoqi@0 340
aoqi@0 341 parentEnd = end;
aoqi@0 342
aoqi@0 343 super.scan(node, p);
aoqi@0 344
aoqi@0 345 parentStart = prevParentStart;
aoqi@0 346 parentEnd = prevParentEnd;
aoqi@0 347
aoqi@0 348 return null;
aoqi@0 349 }
aoqi@0 350
aoqi@0 351 private void assertTrue(String message, boolean b) {
aoqi@0 352 if (!b) fail(message);
aoqi@0 353 }
aoqi@0 354 }.scan(cut, null);
aoqi@0 355 }
aoqi@0 356
aoqi@0 357 @Test
aoqi@0 358 void testCorrectWilcardPositions1() throws IOException {
aoqi@0 359 performWildcardPositionsTest("package test; import java.util.List; " +
aoqi@0 360 "class Test { private void method() { List<? extends List<? extends String>> l; } }",
aoqi@0 361
aoqi@0 362 Arrays.asList("List<? extends List<? extends String>> l;",
aoqi@0 363 "List<? extends List<? extends String>>",
aoqi@0 364 "List",
aoqi@0 365 "? extends List<? extends String>",
aoqi@0 366 "List<? extends String>",
aoqi@0 367 "List",
aoqi@0 368 "? extends String",
aoqi@0 369 "String"));
aoqi@0 370 }
aoqi@0 371
aoqi@0 372 @Test
aoqi@0 373 void testCorrectWilcardPositions2() throws IOException {
aoqi@0 374 performWildcardPositionsTest("package test; import java.util.List; "
aoqi@0 375 + "class Test { private void method() { List<? super List<? super String>> l; } }",
aoqi@0 376 Arrays.asList("List<? super List<? super String>> l;",
aoqi@0 377 "List<? super List<? super String>>",
aoqi@0 378 "List",
aoqi@0 379 "? super List<? super String>",
aoqi@0 380 "List<? super String>",
aoqi@0 381 "List",
aoqi@0 382 "? super String",
aoqi@0 383 "String"));
aoqi@0 384 }
aoqi@0 385
aoqi@0 386 @Test
aoqi@0 387 void testCorrectWilcardPositions3() throws IOException {
aoqi@0 388 performWildcardPositionsTest("package test; import java.util.List; " +
aoqi@0 389 "class Test { private void method() { List<? super List<?>> l; } }",
aoqi@0 390
aoqi@0 391 Arrays.asList("List<? super List<?>> l;",
aoqi@0 392 "List<? super List<?>>",
aoqi@0 393 "List",
aoqi@0 394 "? super List<?>",
aoqi@0 395 "List<?>",
aoqi@0 396 "List",
aoqi@0 397 "?"));
aoqi@0 398 }
aoqi@0 399
aoqi@0 400 @Test
aoqi@0 401 void testCorrectWilcardPositions4() throws IOException {
aoqi@0 402 performWildcardPositionsTest("package test; import java.util.List; " +
aoqi@0 403 "class Test { private void method() { " +
aoqi@0 404 "List<? extends List<? extends List<? extends String>>> l; } }",
aoqi@0 405
aoqi@0 406 Arrays.asList("List<? extends List<? extends List<? extends String>>> l;",
aoqi@0 407 "List<? extends List<? extends List<? extends String>>>",
aoqi@0 408 "List",
aoqi@0 409 "? extends List<? extends List<? extends String>>",
aoqi@0 410 "List<? extends List<? extends String>>",
aoqi@0 411 "List",
aoqi@0 412 "? extends List<? extends String>",
aoqi@0 413 "List<? extends String>",
aoqi@0 414 "List",
aoqi@0 415 "? extends String",
aoqi@0 416 "String"));
aoqi@0 417 }
aoqi@0 418
aoqi@0 419 @Test
aoqi@0 420 void testCorrectWilcardPositions5() throws IOException {
aoqi@0 421 performWildcardPositionsTest("package test; import java.util.List; " +
aoqi@0 422 "class Test { private void method() { " +
aoqi@0 423 "List<? extends List<? extends List<? extends String >>> l; } }",
aoqi@0 424 Arrays.asList("List<? extends List<? extends List<? extends String >>> l;",
aoqi@0 425 "List<? extends List<? extends List<? extends String >>>",
aoqi@0 426 "List",
aoqi@0 427 "? extends List<? extends List<? extends String >>",
aoqi@0 428 "List<? extends List<? extends String >>",
aoqi@0 429 "List",
aoqi@0 430 "? extends List<? extends String >",
aoqi@0 431 "List<? extends String >",
aoqi@0 432 "List",
aoqi@0 433 "? extends String",
aoqi@0 434 "String"));
aoqi@0 435 }
aoqi@0 436
aoqi@0 437 void performWildcardPositionsTest(final String code,
aoqi@0 438 List<String> golden) throws IOException {
aoqi@0 439
aoqi@0 440 final List<Diagnostic<? extends JavaFileObject>> errors =
aoqi@0 441 new LinkedList<Diagnostic<? extends JavaFileObject>>();
aoqi@0 442
aoqi@0 443 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null,
aoqi@0 444 new DiagnosticListener<JavaFileObject>() {
aoqi@0 445 public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
aoqi@0 446 errors.add(diagnostic);
aoqi@0 447 }
aoqi@0 448 }, null, null, Arrays.asList(new MyFileObject(code)));
aoqi@0 449
aoqi@0 450 final CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 451 final List<String> content = new LinkedList<String>();
aoqi@0 452 final Trees trees = Trees.instance(ct);
aoqi@0 453
aoqi@0 454 new TreeScanner<Void, Void>() {
aoqi@0 455 @Override
aoqi@0 456 public Void scan(Tree node, Void p) {
aoqi@0 457 if (node == null) {
aoqi@0 458 return null;
aoqi@0 459 }
aoqi@0 460 long start = trees.getSourcePositions().getStartPosition(cut, node);
aoqi@0 461
aoqi@0 462 if (start == (-1)) {
aoqi@0 463 return null; // synthetic tree
aoqi@0 464 }
aoqi@0 465 long end = trees.getSourcePositions().getEndPosition(cut, node);
aoqi@0 466 String s = code.substring((int) start, (int) end);
aoqi@0 467 content.add(s);
aoqi@0 468
aoqi@0 469 return super.scan(node, p);
aoqi@0 470 }
aoqi@0 471 }.scan(((MethodTree) ((ClassTree) cut.getTypeDecls().get(0)).getMembers().get(0)).getBody().getStatements().get(0), null);
aoqi@0 472
aoqi@0 473 assertEquals("performWildcardPositionsTest",golden.toString(),
aoqi@0 474 content.toString());
aoqi@0 475 }
aoqi@0 476
aoqi@0 477 @Test
aoqi@0 478 void testStartPositionForMethodWithoutModifiers() throws IOException {
aoqi@0 479
aoqi@0 480 String code = "package t; class Test { <T> void t() {} }";
aoqi@0 481
aoqi@0 482 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
aoqi@0 483 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 484 CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 485 ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
aoqi@0 486 MethodTree mt = (MethodTree) clazz.getMembers().get(0);
aoqi@0 487 Trees t = Trees.instance(ct);
aoqi@0 488 int start = (int) t.getSourcePositions().getStartPosition(cut, mt);
aoqi@0 489 int end = (int) t.getSourcePositions().getEndPosition(cut, mt);
aoqi@0 490
aoqi@0 491 assertEquals("testStartPositionForMethodWithoutModifiers",
aoqi@0 492 "<T> void t() {}", code.substring(start, end));
aoqi@0 493 }
aoqi@0 494
aoqi@0 495 @Test
aoqi@0 496 void testVariableInIfThen1() throws IOException {
aoqi@0 497
aoqi@0 498 String code = "package t; class Test { " +
aoqi@0 499 "private static void t(String name) { " +
aoqi@0 500 "if (name != null) String nn = name.trim(); } }";
aoqi@0 501
aoqi@0 502 DiagnosticCollector<JavaFileObject> coll =
aoqi@0 503 new DiagnosticCollector<JavaFileObject>();
aoqi@0 504
aoqi@0 505 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, coll, null,
aoqi@0 506 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 507
aoqi@0 508 ct.parse();
aoqi@0 509
aoqi@0 510 List<String> codes = new LinkedList<String>();
aoqi@0 511
aoqi@0 512 for (Diagnostic<? extends JavaFileObject> d : coll.getDiagnostics()) {
aoqi@0 513 codes.add(d.getCode());
aoqi@0 514 }
aoqi@0 515
aoqi@0 516 assertEquals("testVariableInIfThen1",
aoqi@0 517 Arrays.<String>asList("compiler.err.variable.not.allowed"),
aoqi@0 518 codes);
aoqi@0 519 }
aoqi@0 520
aoqi@0 521 @Test
aoqi@0 522 void testVariableInIfThen2() throws IOException {
aoqi@0 523
aoqi@0 524 String code = "package t; class Test { " +
aoqi@0 525 "private static void t(String name) { " +
aoqi@0 526 "if (name != null) class X {} } }";
aoqi@0 527 DiagnosticCollector<JavaFileObject> coll =
aoqi@0 528 new DiagnosticCollector<JavaFileObject>();
aoqi@0 529 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, coll, null,
aoqi@0 530 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 531
aoqi@0 532 ct.parse();
aoqi@0 533
aoqi@0 534 List<String> codes = new LinkedList<String>();
aoqi@0 535
aoqi@0 536 for (Diagnostic<? extends JavaFileObject> d : coll.getDiagnostics()) {
aoqi@0 537 codes.add(d.getCode());
aoqi@0 538 }
aoqi@0 539
aoqi@0 540 assertEquals("testVariableInIfThen2",
aoqi@0 541 Arrays.<String>asList("compiler.err.class.not.allowed"), codes);
aoqi@0 542 }
aoqi@0 543
aoqi@0 544 @Test
aoqi@0 545 void testVariableInIfThen3() throws IOException {
aoqi@0 546
aoqi@0 547 String code = "package t; class Test { "+
aoqi@0 548 "private static void t() { " +
aoqi@0 549 "if (true) abstract class F {} }}";
aoqi@0 550 DiagnosticCollector<JavaFileObject> coll =
aoqi@0 551 new DiagnosticCollector<JavaFileObject>();
aoqi@0 552 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, coll, null,
aoqi@0 553 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 554
aoqi@0 555 ct.parse();
aoqi@0 556
aoqi@0 557 List<String> codes = new LinkedList<String>();
aoqi@0 558
aoqi@0 559 for (Diagnostic<? extends JavaFileObject> d : coll.getDiagnostics()) {
aoqi@0 560 codes.add(d.getCode());
aoqi@0 561 }
aoqi@0 562
aoqi@0 563 assertEquals("testVariableInIfThen3",
aoqi@0 564 Arrays.<String>asList("compiler.err.class.not.allowed"), codes);
aoqi@0 565 }
aoqi@0 566
aoqi@0 567 @Test
aoqi@0 568 void testVariableInIfThen4() throws IOException {
aoqi@0 569
aoqi@0 570 String code = "package t; class Test { "+
aoqi@0 571 "private static void t(String name) { " +
aoqi@0 572 "if (name != null) interface X {} } }";
aoqi@0 573 DiagnosticCollector<JavaFileObject> coll =
aoqi@0 574 new DiagnosticCollector<JavaFileObject>();
aoqi@0 575 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, coll, null,
aoqi@0 576 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 577
aoqi@0 578 ct.parse();
aoqi@0 579
aoqi@0 580 List<String> codes = new LinkedList<String>();
aoqi@0 581
aoqi@0 582 for (Diagnostic<? extends JavaFileObject> d : coll.getDiagnostics()) {
aoqi@0 583 codes.add(d.getCode());
aoqi@0 584 }
aoqi@0 585
aoqi@0 586 assertEquals("testVariableInIfThen4",
aoqi@0 587 Arrays.<String>asList("compiler.err.class.not.allowed"), codes);
aoqi@0 588 }
aoqi@0 589
aoqi@0 590 @Test
aoqi@0 591 void testVariableInIfThen5() throws IOException {
aoqi@0 592
aoqi@0 593 String code = "package t; class Test { "+
aoqi@0 594 "private static void t() { " +
aoqi@0 595 "if (true) } }";
aoqi@0 596 DiagnosticCollector<JavaFileObject> coll =
aoqi@0 597 new DiagnosticCollector<JavaFileObject>();
aoqi@0 598 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, coll, null,
aoqi@0 599 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 600
aoqi@0 601 ct.parse();
aoqi@0 602
aoqi@0 603 List<String> codes = new LinkedList<String>();
aoqi@0 604
aoqi@0 605 for (Diagnostic<? extends JavaFileObject> d : coll.getDiagnostics()) {
aoqi@0 606 codes.add(d.getCode());
aoqi@0 607 }
aoqi@0 608
aoqi@0 609 assertEquals("testVariableInIfThen5",
aoqi@0 610 Arrays.<String>asList("compiler.err.illegal.start.of.stmt"),
aoqi@0 611 codes);
aoqi@0 612 }
aoqi@0 613
aoqi@0 614 // see javac bug #6882235, NB bug #98234:
aoqi@0 615 @Test
aoqi@0 616 void testMissingExponent() throws IOException {
aoqi@0 617
aoqi@0 618 String code = "\nclass Test { { System.err.println(0e); } }";
aoqi@0 619
aoqi@0 620 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
aoqi@0 621 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 622
aoqi@0 623 assertNotNull(ct.parse().iterator().next());
aoqi@0 624 }
aoqi@0 625
aoqi@0 626 @Test
aoqi@0 627 void testTryResourcePos() throws IOException {
aoqi@0 628
aoqi@0 629 final String code = "package t; class Test { " +
aoqi@0 630 "{ try (java.io.InputStream in = null) { } } }";
aoqi@0 631
aoqi@0 632 CompilationUnitTree cut = getCompilationUnitTree(code);
aoqi@0 633
aoqi@0 634 new TreeScanner<Void, Void>() {
aoqi@0 635 @Override
aoqi@0 636 public Void visitVariable(VariableTree node, Void p) {
aoqi@0 637 if ("in".contentEquals(node.getName())) {
aoqi@0 638 JCTree.JCVariableDecl var = (JCTree.JCVariableDecl) node;
aoqi@0 639 assertEquals("testTryResourcePos", "in = null) { } } }",
aoqi@0 640 code.substring(var.pos));
aoqi@0 641 }
aoqi@0 642 return super.visitVariable(node, p);
aoqi@0 643 }
aoqi@0 644 }.scan(cut, null);
aoqi@0 645 }
aoqi@0 646
aoqi@0 647 @Test
aoqi@0 648 void testVarPos() throws IOException {
aoqi@0 649
aoqi@0 650 final String code = "package t; class Test { " +
aoqi@0 651 "{ java.io.InputStream in = null; } }";
aoqi@0 652
aoqi@0 653 CompilationUnitTree cut = getCompilationUnitTree(code);
aoqi@0 654
aoqi@0 655 new TreeScanner<Void, Void>() {
aoqi@0 656
aoqi@0 657 @Override
aoqi@0 658 public Void visitVariable(VariableTree node, Void p) {
aoqi@0 659 if ("in".contentEquals(node.getName())) {
aoqi@0 660 JCTree.JCVariableDecl var = (JCTree.JCVariableDecl) node;
aoqi@0 661 assertEquals("testVarPos","in = null; } }",
aoqi@0 662 code.substring(var.pos));
aoqi@0 663 }
aoqi@0 664 return super.visitVariable(node, p);
aoqi@0 665 }
aoqi@0 666 }.scan(cut, null);
aoqi@0 667 }
aoqi@0 668
aoqi@0 669 // expected erroneous tree: int x = y;(ERROR);
aoqi@0 670 @Test
aoqi@0 671 void testOperatorMissingError() throws IOException {
aoqi@0 672
aoqi@0 673 String code = "package test; public class ErrorTest { "
aoqi@0 674 + "void method() { int x = y z } }";
aoqi@0 675 CompilationUnitTree cut = getCompilationUnitTree(code);
aoqi@0 676 final List<String> values = new ArrayList<>();
aoqi@0 677 final List<String> expectedValues =
aoqi@0 678 new ArrayList<>(Arrays.asList("[z]"));
aoqi@0 679
aoqi@0 680 new TreeScanner<Void, Void>() {
aoqi@0 681 @Override
aoqi@0 682 public Void visitErroneous(ErroneousTree node, Void p) {
aoqi@0 683 values.add(getErroneousTreeValues(node).toString());
aoqi@0 684 return null;
aoqi@0 685
aoqi@0 686 }
aoqi@0 687 }.scan(cut, null);
aoqi@0 688
aoqi@0 689 assertEquals("testSwitchError: The Erroneous tree "
aoqi@0 690 + "error values: " + values
aoqi@0 691 + " do not match expected error values: "
aoqi@0 692 + expectedValues, values, expectedValues);
aoqi@0 693 }
aoqi@0 694
aoqi@0 695 // expected erroneous tree: String s = (ERROR);
aoqi@0 696 @Test
aoqi@0 697 void testMissingParenthesisError() throws IOException {
aoqi@0 698
aoqi@0 699 String code = "package test; public class ErrorTest { "
aoqi@0 700 + "void f() {String s = new String; } }";
aoqi@0 701 CompilationUnitTree cut = getCompilationUnitTree(code);
aoqi@0 702 final List<String> values = new ArrayList<>();
aoqi@0 703 final List<String> expectedValues =
aoqi@0 704 new ArrayList<>(Arrays.asList("[new String()]"));
aoqi@0 705
aoqi@0 706 new TreeScanner<Void, Void>() {
aoqi@0 707 @Override
aoqi@0 708 public Void visitErroneous(ErroneousTree node, Void p) {
aoqi@0 709 values.add(getErroneousTreeValues(node).toString());
aoqi@0 710 return null;
aoqi@0 711 }
aoqi@0 712 }.scan(cut, null);
aoqi@0 713
aoqi@0 714 assertEquals("testSwitchError: The Erroneous tree "
aoqi@0 715 + "error values: " + values
aoqi@0 716 + " do not match expected error values: "
aoqi@0 717 + expectedValues, values, expectedValues);
aoqi@0 718 }
aoqi@0 719
aoqi@0 720 // expected erroneous tree: package test; (ERROR)(ERROR)
aoqi@0 721 @Test
aoqi@0 722 void testMissingClassError() throws IOException {
aoqi@0 723
aoqi@0 724 String code = "package Test; clas ErrorTest { "
aoqi@0 725 + "void f() {String s = new String(); } }";
aoqi@0 726 CompilationUnitTree cut = getCompilationUnitTree(code);
aoqi@0 727 final List<String> values = new ArrayList<>();
aoqi@0 728 final List<String> expectedValues =
aoqi@0 729 new ArrayList<>(Arrays.asList("[, clas]", "[]"));
aoqi@0 730
aoqi@0 731 new TreeScanner<Void, Void>() {
aoqi@0 732 @Override
aoqi@0 733 public Void visitErroneous(ErroneousTree node, Void p) {
aoqi@0 734 values.add(getErroneousTreeValues(node).toString());
aoqi@0 735 return null;
aoqi@0 736 }
aoqi@0 737 }.scan(cut, null);
aoqi@0 738
aoqi@0 739 assertEquals("testSwitchError: The Erroneous tree "
aoqi@0 740 + "error values: " + values
aoqi@0 741 + " do not match expected error values: "
aoqi@0 742 + expectedValues, values, expectedValues);
aoqi@0 743 }
aoqi@0 744
aoqi@0 745 // expected erroneous tree: void m1(int i) {(ERROR);{(ERROR);}
aoqi@0 746 @Test
aoqi@0 747 void testSwitchError() throws IOException {
aoqi@0 748
aoqi@0 749 String code = "package test; public class ErrorTest { "
aoqi@0 750 + "int numDays; void m1(int i) { switchh {i} { case 1: "
aoqi@0 751 + "numDays = 31; break; } } }";
aoqi@0 752 CompilationUnitTree cut = getCompilationUnitTree(code);
aoqi@0 753 final List<String> values = new ArrayList<>();
aoqi@0 754 final List<String> expectedValues =
aoqi@0 755 new ArrayList<>(Arrays.asList("[switchh]", "[i]"));
aoqi@0 756
aoqi@0 757 new TreeScanner<Void, Void>() {
aoqi@0 758 @Override
aoqi@0 759 public Void visitErroneous(ErroneousTree node, Void p) {
aoqi@0 760 values.add(getErroneousTreeValues(node).toString());
aoqi@0 761 return null;
aoqi@0 762 }
aoqi@0 763 }.scan(cut, null);
aoqi@0 764
aoqi@0 765 assertEquals("testSwitchError: The Erroneous tree "
aoqi@0 766 + "error values: " + values
aoqi@0 767 + " do not match expected error values: "
aoqi@0 768 + expectedValues, values, expectedValues);
aoqi@0 769 }
aoqi@0 770
aoqi@0 771 // expected erroneous tree: class ErrorTest {(ERROR)
aoqi@0 772 @Test
aoqi@0 773 void testMethodError() throws IOException {
aoqi@0 774
aoqi@0 775 String code = "package Test; class ErrorTest { "
aoqi@0 776 + "static final void f) {String s = new String(); } }";
aoqi@0 777 CompilationUnitTree cut = cut = getCompilationUnitTree(code);
aoqi@0 778
aoqi@0 779 final List<String> values = new ArrayList<>();
aoqi@0 780 final List<String> expectedValues =
aoqi@0 781 new ArrayList<>(Arrays.asList("[\nstatic final void f();]"));
aoqi@0 782
aoqi@0 783 new TreeScanner<Void, Void>() {
aoqi@0 784 @Override
aoqi@0 785 public Void visitErroneous(ErroneousTree node, Void p) {
aoqi@0 786 values.add(normalize(getErroneousTreeValues(node).toString()));
aoqi@0 787 return null;
aoqi@0 788 }
aoqi@0 789 }.scan(cut, null);
aoqi@0 790
aoqi@0 791 assertEquals("testMethodError: The Erroneous tree "
aoqi@0 792 + "error value: " + values
aoqi@0 793 + " does not match expected error values: "
aoqi@0 794 + expectedValues, values, expectedValues);
aoqi@0 795 }
aoqi@0 796
aoqi@0 797 /*
aoqi@0 798 * The following tests do not work just yet with nb-javac nor javac,
aoqi@0 799 * they need further investigation, see CR: 7167356
aoqi@0 800 */
aoqi@0 801
aoqi@0 802 void testPositionBrokenSource126732a() throws IOException {
aoqi@0 803 String[] commands = new String[]{
aoqi@0 804 "return Runnable()",
aoqi@0 805 "do { } while (true)",
aoqi@0 806 "throw UnsupportedOperationException()",
aoqi@0 807 "assert true",
aoqi@0 808 "1 + 1",};
aoqi@0 809
aoqi@0 810 for (String command : commands) {
aoqi@0 811
aoqi@0 812 String code = "package test;\n"
aoqi@0 813 + "public class Test {\n"
aoqi@0 814 + " public static void test() {\n"
aoqi@0 815 + " " + command + " {\n"
aoqi@0 816 + " new Runnable() {\n"
aoqi@0 817 + " };\n"
aoqi@0 818 + " }\n"
aoqi@0 819 + "}";
aoqi@0 820 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null,
aoqi@0 821 null, null, Arrays.asList(new MyFileObject(code)));
aoqi@0 822 CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 823
aoqi@0 824 ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
aoqi@0 825 MethodTree method = (MethodTree) clazz.getMembers().get(0);
aoqi@0 826 List<? extends StatementTree> statements =
aoqi@0 827 method.getBody().getStatements();
aoqi@0 828
aoqi@0 829 StatementTree ret = statements.get(0);
aoqi@0 830 StatementTree block = statements.get(1);
aoqi@0 831
aoqi@0 832 Trees t = Trees.instance(ct);
aoqi@0 833 int len = code.indexOf(command + " {") + (command + " ").length();
aoqi@0 834 assertEquals(command, len,
aoqi@0 835 t.getSourcePositions().getEndPosition(cut, ret));
aoqi@0 836 assertEquals(command, len,
aoqi@0 837 t.getSourcePositions().getStartPosition(cut, block));
aoqi@0 838 }
aoqi@0 839 }
aoqi@0 840
aoqi@0 841 void testPositionBrokenSource126732b() throws IOException {
aoqi@0 842 String[] commands = new String[]{
aoqi@0 843 "break",
aoqi@0 844 "break A",
aoqi@0 845 "continue ",
aoqi@0 846 "continue A",};
aoqi@0 847
aoqi@0 848 for (String command : commands) {
aoqi@0 849
aoqi@0 850 String code = "package test;\n"
aoqi@0 851 + "public class Test {\n"
aoqi@0 852 + " public static void test() {\n"
aoqi@0 853 + " while (true) {\n"
aoqi@0 854 + " " + command + " {\n"
aoqi@0 855 + " new Runnable() {\n"
aoqi@0 856 + " };\n"
aoqi@0 857 + " }\n"
aoqi@0 858 + " }\n"
aoqi@0 859 + "}";
aoqi@0 860
aoqi@0 861 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null,
aoqi@0 862 null, null, Arrays.asList(new MyFileObject(code)));
aoqi@0 863 CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 864
aoqi@0 865 ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
aoqi@0 866 MethodTree method = (MethodTree) clazz.getMembers().get(0);
aoqi@0 867 List<? extends StatementTree> statements =
aoqi@0 868 ((BlockTree) ((WhileLoopTree) method.getBody().getStatements().get(0)).getStatement()).getStatements();
aoqi@0 869
aoqi@0 870 StatementTree ret = statements.get(0);
aoqi@0 871 StatementTree block = statements.get(1);
aoqi@0 872
aoqi@0 873 Trees t = Trees.instance(ct);
aoqi@0 874 int len = code.indexOf(command + " {") + (command + " ").length();
aoqi@0 875 assertEquals(command, len,
aoqi@0 876 t.getSourcePositions().getEndPosition(cut, ret));
aoqi@0 877 assertEquals(command, len,
aoqi@0 878 t.getSourcePositions().getStartPosition(cut, block));
aoqi@0 879 }
aoqi@0 880 }
aoqi@0 881
aoqi@0 882 void testStartPositionEnumConstantInit() throws IOException {
aoqi@0 883
aoqi@0 884 String code = "package t; enum Test { AAA; }";
aoqi@0 885
aoqi@0 886 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
aoqi@0 887 null, Arrays.asList(new MyFileObject(code)));
aoqi@0 888 CompilationUnitTree cut = ct.parse().iterator().next();
aoqi@0 889 ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
aoqi@0 890 VariableTree enumAAA = (VariableTree) clazz.getMembers().get(0);
aoqi@0 891 Trees t = Trees.instance(ct);
aoqi@0 892 int start = (int) t.getSourcePositions().getStartPosition(cut,
aoqi@0 893 enumAAA.getInitializer());
aoqi@0 894
aoqi@0 895 assertEquals("testStartPositionEnumConstantInit", -1, start);
aoqi@0 896 }
aoqi@0 897
aoqi@0 898 void run(String[] args) throws Exception {
aoqi@0 899 int passed = 0, failed = 0;
aoqi@0 900 final Pattern p = (args != null && args.length > 0)
aoqi@0 901 ? Pattern.compile(args[0])
aoqi@0 902 : null;
aoqi@0 903 for (Method m : this.getClass().getDeclaredMethods()) {
aoqi@0 904 boolean selected = (p == null)
aoqi@0 905 ? m.isAnnotationPresent(Test.class)
aoqi@0 906 : p.matcher(m.getName()).matches();
aoqi@0 907 if (selected) {
aoqi@0 908 try {
aoqi@0 909 m.invoke(this, (Object[]) null);
aoqi@0 910 System.out.println(m.getName() + ": OK");
aoqi@0 911 passed++;
aoqi@0 912 } catch (Throwable ex) {
aoqi@0 913 System.out.printf("Test %s failed: %s %n", m, ex.getCause());
aoqi@0 914 failed++;
aoqi@0 915 }
aoqi@0 916 }
aoqi@0 917 }
aoqi@0 918 System.out.printf("Passed: %d, Failed %d%n", passed, failed);
aoqi@0 919 if (failed > 0) {
aoqi@0 920 throw new RuntimeException("Tests failed: " + failed);
aoqi@0 921 }
aoqi@0 922 if (passed == 0 && failed == 0) {
aoqi@0 923 throw new AssertionError("No test(s) selected: passed = " +
aoqi@0 924 passed + ", failed = " + failed + " ??????????");
aoqi@0 925 }
aoqi@0 926 }
aoqi@0 927 }
aoqi@0 928
aoqi@0 929 abstract class TestCase {
aoqi@0 930
aoqi@0 931 void assertEquals(String message, int i, int pos) {
aoqi@0 932 if (i != pos) {
aoqi@0 933 fail(message);
aoqi@0 934 }
aoqi@0 935 }
aoqi@0 936
aoqi@0 937 void assertFalse(String message, boolean bvalue) {
aoqi@0 938 if (bvalue == true) {
aoqi@0 939 fail(message);
aoqi@0 940 }
aoqi@0 941 }
aoqi@0 942
aoqi@0 943 void assertEquals(String message, int i, long l) {
aoqi@0 944 if (i != l) {
aoqi@0 945 fail(message + ":" + i + ":" + l);
aoqi@0 946 }
aoqi@0 947 }
aoqi@0 948
aoqi@0 949 void assertEquals(String message, Object o1, Object o2) {
aoqi@0 950 if (o1 != null && o2 != null && !o1.equals(o2)) {
aoqi@0 951 fail(message);
aoqi@0 952 }
aoqi@0 953 if (o1 == null && o2 != null) {
aoqi@0 954 fail(message);
aoqi@0 955 }
aoqi@0 956 }
aoqi@0 957
aoqi@0 958 void assertNotNull(Object o) {
aoqi@0 959 if (o == null) {
aoqi@0 960 fail();
aoqi@0 961 }
aoqi@0 962 }
aoqi@0 963
aoqi@0 964 void fail() {
aoqi@0 965 fail("test failed");
aoqi@0 966 }
aoqi@0 967
aoqi@0 968 void fail(String message) {
aoqi@0 969 throw new RuntimeException(message);
aoqi@0 970 }
aoqi@0 971
aoqi@0 972 /**
aoqi@0 973 * Indicates that the annotated method is a test method.
aoqi@0 974 */
aoqi@0 975 @Retention(RetentionPolicy.RUNTIME)
aoqi@0 976 @Target(ElementType.METHOD)
aoqi@0 977 public @interface Test {}
aoqi@0 978 }

mercurial