1/*
2 * Copyright (c) 2003, 2017, 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 8175200
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 * @modules jdk.javadoc/jdk.javadoc.internal.tool
42 * @build    JavadocTester
43 * @run main TestPrivateClasses
44 */
45
46public class TestPrivateClasses extends JavadocTester {
47
48    public static void main(String... args) throws Exception {
49        TestPrivateClasses tester = new TestPrivateClasses();
50        tester.runTests();
51    }
52
53    @Test
54    void testDefault() {
55        javadoc("-d", "out-default",
56                "-sourcepath", testSrc,
57                "pkg", "pkg2");
58        checkExit(Exit.OK);
59
60        checkOutput("pkg/PublicChild.html", true,
61                // Field inheritence from non-public superclass.
62                "<a href=\"../pkg/PublicChild.html#fieldInheritedFromParent\">"
63                + "fieldInheritedFromParent</a>",
64                // Method inheritance from non-public superclass.
65                "<a href=\"../pkg/PublicChild.html#methodInheritedFromParent-int-\">"
66                + "methodInheritedFromParent</a>",
67                // private class does not show up in tree
68                "<ul class=\"inheritance\">\n"
69                + "<li>java.lang.Object</li>\n"
70                + "<li>\n"
71                + "<ul class=\"inheritance\">\n"
72                + "<li>pkg.PublicChild</li>\n"
73                + "</ul>\n"
74                + "</li>\n"
75                + "</ul>",
76                // Method is documented as though it is declared in the inheriting method.
77                "<pre>public&nbsp;void&nbsp;methodInheritedFromParent&#8203;(int&nbsp;p1)",
78                "<dl>\n"
79                + "<dt>All Implemented Interfaces:</dt>\n"
80                + "<dd><code><a href=\"../pkg/PublicInterface.html\" title=\"interface in pkg\">"
81                + "PublicInterface</a></code></dd>\n"
82                + "</dl>");
83
84        checkOutput("pkg/PublicChild.html", false,
85                // Should not document that a method overrides method from private class.
86                "<span class=\"overrideSpecifyLabel\">Overrides:</span>",
87                // Should not document that a method specified by private interface.
88                "<span class=\"overrideSpecifyLabel\">Specified by:</span>",
89                // Should not mention that any documentation was copied.
90                "Description copied from",
91                // Don't extend private classes or interfaces
92                "PrivateParent",
93                "PrivateInterface");
94
95        checkOutput("pkg/PublicChild.html", false,
96                // Should not document comments from private inherited interfaces
97                "<td class=\"colLast\"><code><span class=\"memberNameLink\">" +
98                "<a href=\"../pkg/PublicChild.html#methodInterface-int-\">" +
99                "methodInterface</a></span>&#8203;(int&nbsp;p1)</code>\n" +
100                "<div class=\"block\">Comment from interface.</div>\n</td>",
101                // and similarly one more
102                "<td class=\"colLast\"><code><span class=\"memberNameLink\">" +
103                "<a href=\"../pkg/PublicChild.html#methodInterface2-int-\">" +
104                "methodInterface2</a></span>&#8203;(int&nbsp;p1)</code>\n" +
105                "<div class=\"block\">Comment from interface.</div>\n</td>"
106        );
107
108        checkOutput("pkg/PublicInterface.html", true,
109                // Field inheritance from non-public superinterface.
110                "<a href=\"../pkg/PublicInterface.html#fieldInheritedFromInterface\">"
111                + "fieldInheritedFromInterface</a>",
112                // Method inheritance from non-public superinterface.
113                "<a href=\"../pkg/PublicInterface.html#methodInterface-int-\">"
114                + "methodInterface</a>",
115                //Make sure implemented interfaces from private superclass are inherited
116                "<dl>\n"
117                + "<dt>All Known Implementing Classes:</dt>\n"
118                + "<dd><code><a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">"
119                + "PublicChild</a></code></dd>\n"
120                + "</dl>");
121
122        checkOutput("pkg/PublicInterface.html", false,
123                "<span class=\"overrideSpecifyLabel\">Specified by:</span>",
124                "Description copied from",
125                "PrivateInterface",
126                "All Superinterfaces");
127
128        checkOutput("pkg2/C.html", false,
129                //Generic interface method test.
130                "This comment should get copied to the implementing class");
131
132        checkOutput("pkg2/C.html", false,
133                //Do not inherit private interface method with generic parameters.
134                //This method has been implemented.
135                "<span class=\"memberNameLink\"><a href=\"../pkg2/I.html#hello-T-\">hello</a></span>");
136
137        checkOutput("constant-values.html", false,
138                // Make inherited constant are documented correctly.
139                "PrivateInterface");
140    }
141
142    @Test
143    void testPrivate() {
144        javadoc("-d", "out-private",
145                "-sourcepath", testSrc,
146                "-private",
147                "pkg", "pkg2");
148        checkExit(Exit.OK);
149
150        checkOutput("pkg/PublicChild.html", true,
151                // Field inheritence from non-public superclass.
152                "Fields inherited from class&nbsp;pkg."
153                + "<a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">"
154                + "PrivateParent</a>",
155                "<a href=\"../pkg/PrivateParent.html#fieldInheritedFromParent\">"
156                + "fieldInheritedFromParent</a>",
157                // Method inheritence from non-public superclass.
158                "Methods inherited from class&nbsp;pkg."
159                + "<a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">"
160                + "PrivateParent</a>",
161                "<a href=\"../pkg/PrivateParent.html#methodInheritedFromParent-int-\">"
162                + "methodInheritedFromParent</a>",
163                // Should document that a method overrides method from private class.
164                "<dt><span class=\"overrideSpecifyLabel\">Overrides:</span></dt>\n"
165                + "<dd><code><a href=\"../pkg/PrivateParent.html#methodOverridenFromParent-char:A-int-T-V-java.util.List-\">"
166                + "methodOverridenFromParent</a></code>&nbsp;in class&nbsp;<code>"
167                + "<a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">"
168                + "PrivateParent</a></code></dd>",
169                // Should document that a method is specified by private interface.
170                "<dt><span class=\"overrideSpecifyLabel\">Specified by:</span></dt>\n"
171                + "<dd><code><a href=\"../pkg/PrivateInterface.html#methodInterface-int-\">"
172                + "methodInterface</a></code>&nbsp;in interface&nbsp;<code>"
173                + "<a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">"
174                + "PrivateInterface</a></code></dd>",
175                // Should mention that any documentation was copied.
176                "Description copied from",
177                // Extend documented private classes or interfaces
178                "extends",
179                "<dl>\n"
180                + "<dt>All Implemented Interfaces:</dt>\n"
181                + "<dd><code><a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">"
182                + "PrivateInterface</a></code>, "
183                + "<code><a href=\"../pkg/PublicInterface.html\" title=\"interface in pkg\">"
184                + "PublicInterface</a></code></dd>\n"
185                + "</dl>",
186                "<pre>public class <span class=\"typeNameLabel\">PublicChild</span>");
187
188        checkOutput("pkg/PublicInterface.html", true,
189                // Field inheritence from non-public superinterface.
190                "Fields inherited from interface&nbsp;pkg."
191                + "<a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">"
192                + "PrivateInterface</a>",
193                "<a href=\"../pkg/PrivateInterface.html#fieldInheritedFromInterface\">"
194                + "fieldInheritedFromInterface</a>",
195                // Method inheritance from non-public superinterface.
196                "Methods inherited from interface&nbsp;pkg."
197                + "<a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">"
198                + "PrivateInterface</a>",
199                // Extend documented private classes or interfaces
200                "extends",
201                "All Superinterfaces",
202                //Make sure implemented interfaces from private superclass are inherited
203                "<dl>\n"
204                + "<dt>All Known Implementing Classes:</dt>\n"
205                + "<dd><code><a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">"
206                + "PrivateParent</a></code>, "
207                + "<code><a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">PublicChild"
208                + "</a></code></dd>\n"
209                + "</dl>");
210
211        checkOutput("pkg/PrivateInterface.html", true,
212                "<a href=\"../pkg/PrivateInterface.html#methodInterface-int-\">"
213                + "methodInterface</a>"
214        );
215
216        checkOutput("pkg2/C.html", true,
217                //Since private flag is used, we can document that private interface method
218                //with generic parameters has been implemented.
219                "<span class=\"descfrmTypeLabel\">Description copied from interface:&nbsp;<code>"
220                + "<a href=\"../pkg2/I.html#hello-T-\">I</a></code></span>",
221                "<dt><span class=\"overrideSpecifyLabel\">Specified by:</span></dt>\n"
222                + "<dd><code><a href=\"../pkg2/I.html#hello-T-\">hello</a></code>"
223                + "&nbsp;in interface&nbsp;<code>"
224                + "<a href=\"../pkg2/I.html\" title=\"interface in pkg2\">I</a>"
225                + "&lt;java.lang.String&gt;</code></dd>");
226
227        checkOutput("pkg/PrivateParent.html", true,
228                //Make sure when no modifier appear in the class signature, the
229                //signature is displayed correctly without extra space at the beginning.
230                "<pre>class <span class=\"typeNameLabel\">PrivateParent</span>");
231
232        checkOutput("pkg/PrivateParent.html", false,
233                "<pre> class <span class=\"typeNameLabel\">PrivateParent</span>");
234    }
235}
236