TestPrivateClasses.java revision 2375:adf34d48dc1f
1/*
2 * Copyright (c) 2003, 2014, 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      4780441 4874845 4978816 8014017 8016328 8025633 8026567
27 * @summary  Make sure that when the -private flag is not used, members
28 *           inherited from package private class are documented in the child.
29 *
30 *           Make sure that when a method inherits documentation from a method
31 *           in a non-public class/interface, the non-public class/interface
32 *           is not mentioned anywhere (not even in the signature or tree).
33 *
34 *           Make sure that when a private interface method with generic parameters
35 *           is implemented, the comments can be inherited properly.
36 *
37 *           Make sure when no modifier appear in the class signature, the
38 *           signature is displayed correctly without extra space at the beginning.
39 * @author   jamieh
40 * @library  ../lib/
41 * @build    JavadocTester TestPrivateClasses
42 * @run main TestPrivateClasses
43 */
44
45public class TestPrivateClasses extends JavadocTester {
46
47    //Test information.
48    private static final String BUG_ID = "4780441-4874845-4978816-8014017";
49
50    //Javadoc arguments.
51    private static final String[] ARGS1 = new String[] {
52        "-d", BUG_ID + "-1", "-sourcepath", SRC_DIR, "pkg", "pkg2"
53    };
54    private static final String[] ARGS2 = new String[] {
55        "-d", BUG_ID + "-2", "-sourcepath", SRC_DIR, "-private",
56            "pkg", "pkg2"
57    };
58
59    // Test output when -private flag is not used.
60    private static final String[][] TEST1 = {
61        // Field inheritence from non-public superclass.
62        {BUG_ID + "-1/pkg/PublicChild.html",
63            "<a href=\"../pkg/PublicChild.html#fieldInheritedFromParent\">" +
64                "fieldInheritedFromParent</a>"
65        },
66
67        // Method inheritence from non-public superclass.
68        {BUG_ID + "-1/pkg/PublicChild.html",
69            "<a href=\"../pkg/PublicChild.html#methodInheritedFromParent-int-\">" +
70                "methodInheritedFromParent</a>"
71        },
72
73        // Field inheritence from non-public superinterface.
74        {BUG_ID + "-1/pkg/PublicInterface.html",
75            "<a href=\"../pkg/PublicInterface.html#fieldInheritedFromInterface\">" +
76                "fieldInheritedFromInterface</a>"
77        },
78
79        // Method inheritence from non-public superinterface.
80        {BUG_ID + "-1/pkg/PublicInterface.html",
81            "<a href=\"../pkg/PublicInterface.html#methodInterface-int-\">" +
82                "methodInterface</a>"
83        },
84
85        // private class does not show up in tree
86        {BUG_ID + "-1/pkg/PublicChild.html",
87            "<ul class=\"inheritance\">\n" +
88            "<li>java.lang.Object</li>\n" +
89            "<li>\n" +
90            "<ul class=\"inheritance\">\n" +
91            "<li>pkg.PublicChild</li>\n" +
92            "</ul>\n" +
93            "</li>\n" +
94            "</ul>"
95        },
96
97        // Method is documented as though it is declared in the inheriting method.
98        {BUG_ID + "-1/pkg/PublicChild.html",
99            "<pre>public&nbsp;void&nbsp;methodInheritedFromParent(int&nbsp;p1)"
100        },
101
102        //Make sure implemented interfaces from private superclass are inherited
103        {BUG_ID + "-1/pkg/PublicInterface.html",
104            "<dl>\n" +
105            "<dt>All Known Implementing Classes:</dt>\n" +
106            "<dd><a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">" +
107            "PublicChild</a></dd>\n" +
108            "</dl>"},
109
110        {BUG_ID + "-1/pkg/PublicChild.html",
111            "<dl>\n" +
112            "<dt>All Implemented Interfaces:</dt>\n" +
113            "<dd><a href=\"../pkg/PublicInterface.html\" title=\"interface in pkg\">" +
114            "PublicInterface</a></dd>\n" +
115            "</dl>"},
116
117        //Generic interface method test.
118        {BUG_ID + "-1/pkg2/C.html",
119            "This comment should get copied to the implementing class"},
120    };
121    private static final String[][] NEGATED_TEST1 = {
122       // Should not document that a method overrides method from private class.
123      {BUG_ID + "-1/pkg/PublicChild.html",
124        "<span class=\"overrideSpecifyLabel\">Overrides:</span>"},
125      // Should not document that a method specified by private interface.
126      {BUG_ID + "-1/pkg/PublicChild.html",
127        "<span class=\"overrideSpecifyLabel\">Specified by:</span>"},
128      {BUG_ID + "-1/pkg/PublicInterface.html",
129        "<span class=\"overrideSpecifyLabel\">Specified by:</span>"},
130      // Should not mention that any documentation was copied.
131      {BUG_ID + "-1/pkg/PublicChild.html",
132        "Description copied from"},
133      {BUG_ID + "-1/pkg/PublicInterface.html",
134        "Description copied from"},
135      // Don't extend private classes or interfaces
136      {BUG_ID + "-1/pkg/PublicChild.html",
137        "PrivateParent"},
138      {BUG_ID + "-1/pkg/PublicInterface.html",
139        "PrivateInterface"},
140      {BUG_ID + "-1/pkg/PublicChild.html",
141        "PrivateInterface"},
142      {BUG_ID + "-1/pkg/PublicInterface.html",
143        "All Superinterfaces"},
144      // Make inherited constant are documented correctly.
145      {BUG_ID + "-1/constant-values.html",
146        "PrivateInterface"},
147
148        //Do not inherit private interface method with generic parameters.
149        //This method has been implemented.
150        {BUG_ID + "-1/pkg2/C.html",
151            "<span class=\"memberNameLink\"><a href=\"../pkg2/I.html#hello-T-\">hello</a></span>"},
152    };
153
154    // Test output when -private flag is used.
155    private static final String[][] TEST2 = {
156        // Field inheritence from non-public superclass.
157        {BUG_ID + "-2/pkg/PublicChild.html",
158            "Fields inherited from class&nbsp;pkg." +
159            "<a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">" +
160            "PrivateParent</a>"
161        },
162        {BUG_ID + "-2/pkg/PublicChild.html",
163            "<a href=\"../pkg/PrivateParent.html#fieldInheritedFromParent\">" +
164                "fieldInheritedFromParent</a>"
165        },
166        // Field inheritence from non-public superinterface.
167        {BUG_ID + "-2/pkg/PublicInterface.html",
168            "Fields inherited from interface&nbsp;pkg." +
169            "<a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">" +
170            "PrivateInterface</a>"
171        },
172        {BUG_ID + "-2/pkg/PublicInterface.html",
173            "<a href=\"../pkg/PrivateInterface.html#fieldInheritedFromInterface\">" +
174                "fieldInheritedFromInterface</a>"
175        },
176        // Method inheritence from non-public superclass.
177        {BUG_ID + "-2/pkg/PublicChild.html",
178            "Methods inherited from class&nbsp;pkg." +
179            "<a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">" +
180            "PrivateParent</a>"
181        },
182        {BUG_ID + "-2/pkg/PublicChild.html",
183            "<a href=\"../pkg/PrivateParent.html#methodInheritedFromParent-int-\">" +
184                "methodInheritedFromParent</a>"
185        },
186        // Should document that a method overrides method from private class.
187       {BUG_ID + "-2/pkg/PublicChild.html",
188            "<dt><span class=\"overrideSpecifyLabel\">Overrides:</span></dt>\n" +
189            "<dd><code><a href=\"../pkg/PrivateParent.html#methodOverridenFromParent-char:A-int-T-V-java.util.List-\">" +
190            "methodOverridenFromParent</a></code>&nbsp;in class&nbsp;<code>" +
191            "<a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">" +
192            "PrivateParent</a></code></dd>"},
193       // Should document that a method is specified by private interface.
194       {BUG_ID + "-2/pkg/PublicChild.html",
195            "<dt><span class=\"overrideSpecifyLabel\">Specified by:</span></dt>\n" +
196            "<dd><code><a href=\"../pkg/PrivateInterface.html#methodInterface-int-\">" +
197            "methodInterface</a></code>&nbsp;in interface&nbsp;<code>" +
198            "<a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">" +
199            "PrivateInterface</a></code></dd>"},
200       // Method inheritence from non-public superinterface.
201       {BUG_ID + "-2/pkg/PublicInterface.html",
202            "Methods inherited from interface&nbsp;pkg." +
203            "<a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">" +
204            "PrivateInterface</a>"
205        },
206        {BUG_ID + "-2/pkg/PrivateInterface.html",
207            "<a href=\"../pkg/PrivateInterface.html#methodInterface-int-\">" +
208                "methodInterface</a>"
209        },
210      // Should mention that any documentation was copied.
211      {BUG_ID + "-2/pkg/PublicChild.html",
212        "Description copied from"},
213      // Extend documented private classes or interfaces
214      {BUG_ID + "-2/pkg/PublicChild.html",
215        "extends"},
216      {BUG_ID + "-2/pkg/PublicInterface.html",
217        "extends"},
218      {BUG_ID + "-2/pkg/PublicInterface.html",
219        "All Superinterfaces"},
220
221      //Make sure implemented interfaces from private superclass are inherited
222      {BUG_ID + "-2/pkg/PublicInterface.html",
223        "<dl>\n" +
224        "<dt>All Known Implementing Classes:</dt>\n" +
225        "<dd><a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">" +
226        "PrivateParent</a>, " +
227        "<a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">PublicChild" +
228        "</a></dd>\n" +
229        "</dl>"},
230
231      {BUG_ID + "-2/pkg/PublicChild.html",
232        "<dl>\n" +
233        "<dt>All Implemented Interfaces:</dt>\n" +
234        "<dd><a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">" +
235        "PrivateInterface</a>, " +
236        "<a href=\"../pkg/PublicInterface.html\" title=\"interface in pkg\">" +
237        "PublicInterface</a></dd>\n" +
238        "</dl>"},
239
240      //Since private flag is used, we can document that private interface method
241      //with generic parameters has been implemented.
242      {BUG_ID + "-2/pkg2/C.html",
243            "<span class=\"descfrmTypeLabel\">Description copied from interface:&nbsp;<code>" +
244            "<a href=\"../pkg2/I.html#hello-T-\">I</a></code></span>"},
245
246      {BUG_ID + "-2/pkg2/C.html",
247            "<dt><span class=\"overrideSpecifyLabel\">Specified by:</span></dt>\n" +
248            "<dd><code><a href=\"../pkg2/I.html#hello-T-\">hello</a></code>" +
249            "&nbsp;in interface&nbsp;<code>" +
250            "<a href=\"../pkg2/I.html\" title=\"interface in pkg2\">I</a>" +
251            "&lt;java.lang.String&gt;</code></dd>"},
252
253      //Make sure when no modifier appear in the class signature, the
254      //signature is displayed correctly without extra space at the beginning.
255      {BUG_ID + "-2/pkg/PrivateParent.html",
256            "<pre>class <span class=\"typeNameLabel\">PrivateParent</span>"},
257
258      {BUG_ID + "-2/pkg/PublicChild.html",
259            "<pre>public class <span class=\"typeNameLabel\">PublicChild</span>"},
260    };
261    private static final String[][] NEGATED_TEST2 = {
262        {BUG_ID + "-2/pkg/PrivateParent.html",
263            "<pre> class <span class=\"typeNameLabel\">PrivateParent</span>"},
264    };
265
266    /**
267     * The entry point of the test.
268     * @param args the array of command line arguments.
269     */
270    public static void main(String[] args) {
271        TestPrivateClasses tester = new TestPrivateClasses();
272        tester.run(ARGS1, TEST1, NEGATED_TEST1);
273        tester.run(ARGS2, TEST2, NEGATED_TEST2);
274        tester.printSummary();
275    }
276
277    /**
278     * {@inheritDoc}
279     */
280    public String getBugId() {
281        return BUG_ID;
282    }
283
284    /**
285     * {@inheritDoc}
286     */
287    public String getBugName() {
288        return getClass().getName();
289    }
290}
291