TestNames.java revision 698:d2aaaec153e8
1/*
2 * Copyright (c) 2006, 2010, 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 6380016
27 * @summary Test that the constraints guaranteed by the Filer and maintained
28 * @author  Joseph D. Darcy
29 * @library ../../../lib
30 * @build   JavacTestingAbstractProcessor TestNames
31 * @compile -processor TestNames -proc:only TestNames.java
32 */
33
34import java.util.Set;
35import javax.annotation.processing.*;
36import javax.lang.model.SourceVersion;
37import static javax.lang.model.SourceVersion.*;
38import javax.lang.model.element.*;
39import javax.lang.model.util.*;
40import static javax.lang.model.util.ElementFilter.*;
41import static javax.tools.Diagnostic.Kind.*;
42import static javax.tools.StandardLocation.*;
43
44import java.io.*;
45
46/**
47 * Basic tests of semantics of javax.lang.model.element.Name
48 */
49public class TestNames extends JavacTestingAbstractProcessor {
50    private int round = 0;
51
52    String stringStringName = "java.lang.String";
53    Name stringName = null;
54
55    public boolean process(Set<? extends TypeElement> annotations,
56                           RoundEnvironment roundEnv) {
57        round++;
58        if (!roundEnv.processingOver()) {
59            boolean failed = false;
60
61            switch(round) {
62            case 1:
63
64            TypeElement stringMirror = eltUtils.getTypeElement(stringStringName);
65            stringName = stringMirror.getQualifiedName();
66            Name stringPseudoName = Pseudonym.getName(stringName.toString());
67
68
69            if (stringName.equals(stringPseudoName))
70                failed = true;
71            if (!stringName.contentEquals(stringStringName))
72                failed = true;
73            if (!stringName.contentEquals(stringPseudoName))
74                failed = true;
75
76
77            try {
78                // Force another round with a new context
79                PrintWriter pw = new PrintWriter(filer.createSourceFile("Foo").openWriter());
80                pw.println("public class Foo {}");
81                pw.close();
82            } catch (IOException ioe) {
83                throw new RuntimeException();
84            }
85            break;
86
87            case 2:
88                Name stringStringAsName = eltUtils.getName(stringStringName);
89                TypeElement stringMirror2 = eltUtils.getTypeElement(stringStringName);
90                Name stringName2 = stringMirror2.getQualifiedName();
91
92                if (stringStringAsName != stringName ||
93                    stringName != stringName2)
94                    failed = true;
95                break;
96
97            default:
98                throw new RuntimeException("Unexpected round " + round);
99            }
100
101            if (failed)
102                throw new RuntimeException("Invalid name equality checks.");
103        }
104        return true;
105    }
106
107    private static class Pseudonym implements Name {
108        private String name;
109
110        private Pseudonym(String name) {
111            this.name = name;
112        }
113
114        public static Pseudonym getName(String name) {
115            return new Pseudonym(name);
116        }
117
118        public boolean contentEquals(CharSequence cs) {
119            return name.contentEquals(cs);
120        }
121
122        public char charAt(int index) {
123            return name.charAt(index);
124        }
125
126        public int length() {
127            return name.length();
128        }
129
130        public CharSequence subSequence(int start, int end) {
131            return name.subSequence(start, end);
132        }
133
134        public String toString() {
135            return name;
136        }
137    }
138}
139