test/tools/javac/annotations/repeatingAnnotations/combo/BasicSyntaxCombo.java

changeset 1401
2986e7052952
child 1492
df694c775e8a
equal deleted inserted replaced
1400:19d6ba779759 1401:2986e7052952
1 /*
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
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
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /**
25 * @test
26 * @bug 8002157
27 * @author sogoel
28 * @summary Basic Syntax test for repeating annotations on all elements
29 * @build Helper
30 * @compile BasicSyntaxCombo.java
31 * @run main BasicSyntaxCombo
32 */
33
34
35 import java.util.Arrays;
36 import javax.tools.DiagnosticCollector;
37 import javax.tools.JavaFileObject;
38 import javax.tools.Diagnostic;
39
40 /*
41 * Generate test src for element kinds with repeating annotations.
42 * The test uses Helper.java to get the template to create test src and
43 * compile the test src.
44 * The test passes if valid test src compile as expected and
45 * and invalid test src fail as expected.
46 */
47
48 public class BasicSyntaxCombo extends Helper{
49 static int errors = 0;
50 static boolean exitMode = false;
51 static String TESTPKG = "testpkg";
52 static String srcContent = "";
53 static String pkgInfoContent = "";
54
55 static {
56 // If EXIT_ON_FAIL is set, the combo test will exit at the first error
57 String exitOnFail = System.getenv("EXIT_ON_FAIL");
58 if (exitOnFail == null || exitOnFail == "" ) {
59 exitMode = false;
60 }
61 else {
62 if (exitOnFail.equalsIgnoreCase("YES") ||
63 exitOnFail.equalsIgnoreCase("Y") ||
64 exitOnFail.equalsIgnoreCase("TRUE") ||
65 exitOnFail.equalsIgnoreCase("T")) {
66 exitMode = true;
67 }
68 }
69 }
70
71 enum TestElem {
72 ANNOTATION_TYPE(true),
73 PACKAGE(true),
74 CONSTRUCTOR(true),
75 FIELD(true),
76 LOCAL_VARIABLE(true),
77 METHOD(true),
78 TYPE(true),
79 PARAMETER(true),
80 INNER_CLASS(true),
81 STATIC_INI(false),
82 INSTANCE_INI(false);
83
84 TestElem(boolean compile) {
85 this.compile = compile;
86 }
87
88 boolean compile;
89 boolean shouldCompile() {
90 return compile;
91 }
92 }
93
94 public static void main(String[] args) throws Exception {
95 new BasicSyntaxCombo().runTest();
96 }
97
98 public void runTest() throws Exception {
99 boolean result = false;
100 Iterable<? extends JavaFileObject> files = null;
101 int testCtr = 0;
102 for (TestElem type : TestElem.values()) {
103 testCtr++;
104 String className = "BasicCombo_"+type;
105 files = getFileList(className, type);
106
107 boolean shouldCompile = type.shouldCompile();
108 result = getCompileResult(className, shouldCompile,files);
109
110 if (shouldCompile && !result) {
111 error(className + " did not compile as expected", srcContent);
112 if(!pkgInfoContent.isEmpty()) {
113 System.out.println("package-info.java contents: " + pkgInfoContent);
114 }
115 }
116
117 if (!shouldCompile && !result) {
118 error(className + " compiled unexpectedly", srcContent);
119 if(!pkgInfoContent.isEmpty()) {
120 System.out.println("package-info.java contents: " + pkgInfoContent);
121 }
122 }
123 }
124
125 System.out.println("Total number of tests run: " + testCtr);
126 System.out.println("Total number of errors: " + errors);
127
128 if (errors > 0)
129 throw new Exception(errors + " errors found");
130 }
131
132 private boolean getCompileResult(String className, boolean shouldCompile,
133 Iterable<? extends JavaFileObject> files) throws Exception {
134
135 DiagnosticCollector<JavaFileObject> diagnostics =
136 new DiagnosticCollector<JavaFileObject>();
137 boolean ok = Helper.compileCode(diagnostics,files);
138 if (!shouldCompile && !ok) {
139 checkErrorKeys(className, diagnostics);
140 }
141 return (shouldCompile == ok);
142 }
143
144 private void checkErrorKeys (
145 String className, DiagnosticCollector<JavaFileObject> diagnostics) throws Exception {
146 String expectedErrKey = "compiler.err.illegal.start.of.type";
147 for (Diagnostic<?> d : diagnostics.getDiagnostics()) {
148 if ((d.getKind() == Diagnostic.Kind.ERROR) &&
149 d.getCode().contains(expectedErrKey)) {
150 break; // Found the expected error
151 } else {
152 error("Incorrect error key, expected = "
153 + expectedErrKey + ", Actual = " + d.getCode()
154 + " for className = " + className, srcContent);
155 }
156 }
157 }
158
159 private Iterable<? extends JavaFileObject> getFileList(String className,
160 TestElem type ) {
161
162 String template = Helper.template;
163 String replaceStr = "/*"+type+"*/";
164 StringBuilder annoData = new StringBuilder();
165 annoData.append(Helper.ContentVars.IMPORTCONTAINERSTMTS.getVal())
166 .append(Helper.ContentVars.CONTAINERFOR.getVal())
167 .append(Helper.ContentVars.CONTAINER.getVal())
168 .append(Helper.ContentVars.CONTAINEDBY.getVal())
169 .append(Helper.ContentVars.BASE.getVal());
170
171 JavaFileObject pkgInfoFile = null;
172
173 if (type.equals("PACKAGE")) {
174 srcContent = template.replace(replaceStr, "package testpkg;")
175 .replace("#ClassName", className);
176
177 String pkgInfoName = TESTPKG+"."+"package-info";
178 pkgInfoContent = Helper.ContentVars.REPEATABLEANNO.getVal()
179 + "package " + TESTPKG + ";"
180 + annoData;
181 pkgInfoFile = getFile(pkgInfoName, pkgInfoContent);
182 } else {
183 template = template.replace(replaceStr, Helper.ContentVars.REPEATABLEANNO.getVal())
184 .replace("#ClassName", className);
185 srcContent = annoData + template;
186 }
187
188 JavaFileObject srcFile = getFile(className, srcContent);
189
190 Iterable<? extends JavaFileObject> files = null;
191 if (pkgInfoFile != null) {
192 files = Arrays.asList(pkgInfoFile,srcFile);
193 }
194 else {
195 files = Arrays.asList(srcFile);
196 }
197 return files;
198 }
199
200 private void error(String msg, String... contents) throws Exception {
201 System.out.println("error: " + msg);
202 errors++;
203 if (contents.length == 1) {
204 System.out.println("Contents = " + contents[0]);
205 }
206 // Test exits as soon as it gets a failure
207 if (exitMode) throw new Exception();
208 }
209 }

mercurial