/* * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @test * @bug 4789689 4905985 4927164 4827184 4993906 5004549 7025314 7010344 8025633 8026567 * @summary Run Javadoc on a set of source files that demonstrate new * language features. Check the output to ensure that the new * language features are properly documented. * @author jamieh * @library ../lib/ * @build JavadocTester TestNewLanguageFeatures * @run main TestNewLanguageFeatures */ public class TestNewLanguageFeatures extends JavadocTester { //Javadoc arguments. private static final String[] ARGS = new String[] { "-Xdoclint:none", "-d", OUTPUT_DIR, "-use", "-sourcepath", SRC_DIR, "pkg", "pkg1", "pkg2" }; //Input for string search tests. private static final String[][] TEST = { //================================= // ENUM TESTING //================================= //Make sure enum header is correct. { "pkg/Coin.html", "Enum Coin"}, //Make sure enum signature is correct. { "pkg/Coin.html", "
public enum " +
                     "Coin\n" +
                     "extends java.lang.Enum<Coin>
" }, //Check for enum constant section { "pkg/Coin.html", "Enum Constants" + " "}, //Detail for enum constant { "pkg/Coin.html", "Dime"}, //Automatically insert documentation for values() and valueOf(). { "pkg/Coin.html", "Returns an array containing the constants of this enum type,"}, { "pkg/Coin.html", "Returns the enum constant of this type with the specified name"}, { "pkg/Coin.html", "for (Coin c : Coin.values())"}, { "pkg/Coin.html", "Overloaded valueOf() method has correct documentation."}, { "pkg/Coin.html", "Overloaded values method has correct documentation."}, //================================= // TYPE PARAMETER TESTING //================================= //Make sure the header is correct. { "pkg/TypeParameters.html", "Class TypeParameters<E>"}, //Check class type parameters section. { "pkg/TypeParameters.html", "
Type Parameters:
\n" + "
E - " + "the type parameter for this class."}, //Type parameters in @see/@link { "pkg/TypeParameters.html", "
\n" + "
See Also:
\n" + "
" + "" + "TypeParameters
\n" + "
"}, //Method that uses class type parameter. { "pkg/TypeParameters.html", "(E param)"}, //Method type parameter section. { "pkg/TypeParameters.html", "Type Parameters:\n" + "
T - This is the first " + "type parameter.
\n" + "
V - This is the second type " + "parameter."}, //Signature of method with type parameters { "pkg/TypeParameters.html", "public <T extends java.util.List,V> " + "java.lang.String[] methodThatHasTypeParameters"}, //Wildcard testing. { "pkg/Wildcards.html", "" + "TypeParameters<? super java.lang.String> a"}, { "pkg/Wildcards.html", "" + "TypeParameters<? extends java.lang.StringBuffer> b"}, { "pkg/Wildcards.html", "" + "TypeParameters c"}, //Bad type parameter warnings. {WARNING_OUTPUT, "warning - @param argument " + "\"\" is not a type parameter name."}, {WARNING_OUTPUT, "warning - @param argument " + "\"\" is not a type parameter name."}, //Signature of subclass that has type parameters. { "pkg/TypeParameterSubClass.html", "
public class TypeParameterSubClass<T extends " +
                "java.lang.String>\n" +
                "extends " +
                "" +
                "TypeParameterSuperClass<T>
"}, //Interface generic parameter substitution //Signature of subclass that has type parameters. { "pkg/TypeParameters.html", "
\n" + "
All Implemented Interfaces:
\n" + "
" + "SubInterface<E>, SuperInterface<E>
\n" + "
"}, { "pkg/SuperInterface.html", "
\n" + "
All Known Subinterfaces:
\n" + "
" + "SubInterface<V>
\n" + "
"}, { "pkg/SubInterface.html", "
\n" + "
All Superinterfaces:
\n" + "
" + "SuperInterface<V>
\n" + "
"}, //================================= // VAR ARG TESTING //================================= { "pkg/VarArgs.html", "(int... i)"}, { "pkg/VarArgs.html", "(int[][]... i)"}, { "pkg/VarArgs.html", "-int:A...-"}, { "pkg/VarArgs.html", "" + "TypeParameters... t"}, //================================= // ANNOTATION TYPE TESTING //================================= //Make sure the summary links are correct. { "pkg/AnnotationType.html", "
  • Summary: 
  • \n" + "
  • Field | 
  • \n" + "
  • " + "Required | 
  • \n" + "
  • " + "Optional
  • "}, //Make sure the detail links are correct. { "pkg/AnnotationType.html", "
  • Detail: 
  • \n" + "
  • Field | 
  • \n" + "
  • Element
  • "}, //Make sure the heading is correct. { "pkg/AnnotationType.html", "Annotation Type AnnotationType"}, //Make sure the signature is correct. { "pkg/AnnotationType.html", "public @interface AnnotationType"}, //Make sure member summary headings are correct. { "pkg/AnnotationType.html", "

    Required Element Summary

    "}, { "pkg/AnnotationType.html", "

    Optional Element Summary

    "}, //Make sure element detail heading is correct { "pkg/AnnotationType.html", "Element Detail"}, //Make sure default annotation type value is printed when necessary. { "pkg/AnnotationType.html", "
    \n" + "
    Default:
    \n" + "
    \"unknown\"
    \n" + "
    "}, //================================= // ANNOTATION TYPE USAGE TESTING //================================= //PACKAGE { "pkg/package-summary.html", "@AnnotationType(optional=\"Package Annotation\",\n" + " required=1994)"}, //CLASS { "pkg/AnnotationTypeUsage.html", "
    @AnnotationType(" +
                    "optional" +
                    "=\"Class Annotation\",\n" +
                    "                " +
                    "required=1994)\n" +
                    "public class " +
                    "AnnotationTypeUsage\n" +
                    "extends java.lang.Object
    "}, //FIELD { "pkg/AnnotationTypeUsage.html", "
    @AnnotationType(" +
                    "optional" +
                    "=\"Field Annotation\",\n" +
                    "                " +
                    "required=1994)\n" +
                    "public int field
    "}, //CONSTRUCTOR { "pkg/AnnotationTypeUsage.html", "
    @AnnotationType(" +
                    "optional" +
                    "=\"Constructor Annotation\",\n" +
                    "                " +
                    "required=1994)\n" +
                    "public AnnotationTypeUsage()
    "}, //METHOD { "pkg/AnnotationTypeUsage.html", "
    @AnnotationType(" +
                    "optional" +
                    "=\"Method Annotation\",\n" +
                    "                " +
                    "required=1994)\n" +
                    "public void method()
    "}, //METHOD PARAMS { "pkg/AnnotationTypeUsage.html", "
    public void methodWithParams(" +
                    "" +
                    "@AnnotationType(" +
                    "optional=\"Parameter Annotation\",required=1994)\n" +
                    "                             int documented,\n" +
                    "                             int undocmented)
    "}, //CONSTRUCTOR PARAMS { "pkg/AnnotationTypeUsage.html", "
    public AnnotationTypeUsage(" +
                    "@AnnotationType(" +
                    "optional=\"Constructor Param Annotation\",required=1994)\n" +
                    "                           int documented,\n" +
                    "                           int undocmented)
    "}, //================================= // ANNOTATION TYPE USAGE TESTING (All Different Types). //================================= //Integer { "pkg1/B.html", "d=3.14,"}, //Double { "pkg1/B.html", "d=3.14,"}, //Boolean { "pkg1/B.html", "b=true,"}, //String { "pkg1/B.html", "s=\"sigh\","}, //Class { "pkg1/B.html", "c=Foo.class,"}, //Bounded Class { "pkg1/B.html", "w=TypeParameterSubClass.class,"}, //Enum { "pkg1/B.html", "e=Penny,"}, //Annotation Type { "pkg1/B.html", "a=@AnnotationType(optional=\"foo\",required=1994),"}, //String Array { "pkg1/B.html", "sa={\"up\",\"down\"},"}, //Primitive { "pkg1/B.html", "primitiveClassTest=boolean.class,"}, //XXX: Add array test case after this if fixed: //5020899: Incorrect internal representation of class-valued annotation elements //Make sure that annotations are surrounded by
     and 
    { "pkg1/B.html", "
    @A"},
                { "pkg1/B.html",
                    "public interface B
    "}, //============================================================== // Handle multiple bounds. //============================================================== { "pkg/MultiTypeParameters.html", "public <T extends java.lang.Number & java.lang.Runnable> T foo(T t)"}, //============================================================== // Test Class-Use Documenation for Type Parameters. //============================================================== //ClassUseTest1: { "pkg2/class-use/Foo.html", "Classes in pkg2 with type parameters of " + "type " + "Foo " }, { "pkg2/class-use/Foo.html", "ClassUseTest1<T extends " + "Foo" + " & " + "Foo2> " }, { "pkg2/class-use/Foo.html", "Methods in pkg2 with type parameters of " + "type Foo " }, { "pkg2/class-use/Foo.html", "ClassUseTest1." + "method" + "(T t) " }, { "pkg2/class-use/Foo.html", "Fields in pkg2 with type parameters of " + "type " + "Foo " }, { "pkg2/class-use/Foo.html", "td class=\"colFirst\">ParamTest" + "<Foo>" }, { "pkg2/class-use/ParamTest.html", "Fields in pkg2 declared as ParamTest" + " " }, { "pkg2/class-use/ParamTest.html", "ParamTest<Foo>" }, { "pkg2/class-use/Foo2.html", "Classes in pkg2 with type parameters of " + "type Foo2 " + "" }, { "pkg2/class-use/Foo2.html", "ClassUseTest1<T extends " + "Foo" + " & " + "Foo2> " }, { "pkg2/class-use/Foo2.html", "Methods in pkg2 with type parameters of " + "type Foo2 " + "" }, { "pkg2/class-use/Foo2.html", "" + "ClassUseTest1.method" + "(T t) " }, //ClassUseTest2: > { "pkg2/class-use/ParamTest.html", "Classes in pkg2 with type parameters of " + "type ParamTest" + " " }, { "pkg2/class-use/ParamTest.html", "ClassUseTest2<T extends " + "" + "ParamTest<" + "Foo3>> " }, { "pkg2/class-use/ParamTest.html", "Methods in pkg2 with type parameters of " + "type ParamTest" + " " }, { "pkg2/class-use/ParamTest.html", "ClassUseTest2." + "method" + "(T t) " }, { "pkg2/class-use/ParamTest.html", "Fields in pkg2 declared as ParamTest" + " " }, { "pkg2/class-use/ParamTest.html", "ParamTest" + "<" + "Foo>" }, { "pkg2/class-use/ParamTest.html", "Methods in pkg2 with type parameters of " + "type ParamTest" + " " }, { "pkg2/class-use/ParamTest.html", "<T extends ParamTest" + "<Foo3>>
    ParamTest" + "<Foo3>
    " }, { "pkg2/class-use/Foo3.html", "Classes in pkg2 with type parameters of " + "type " + "Foo3 " }, { "pkg2/class-use/Foo3.html", "ClassUseTest2<T extends " + "" + "ParamTest<" + "Foo3>> " }, { "pkg2/class-use/Foo3.html", "Methods in pkg2 with type parameters of " + "type Foo3 " + "" }, { "pkg2/class-use/Foo3.html", "ClassUseTest2." + "method" + "(T t) " }, { "pkg2/class-use/Foo3.html", "Methods in pkg2 that return types with " + "arguments of type Foo3" + " " }, { "pkg2/class-use/Foo3.html", "<T extends ParamTest<" + "Foo3" + ">>
    ParamTest<Foo3>
    " }, //ClassUseTest3: >> { "pkg2/class-use/ParamTest2.html", "Classes in pkg2 with type parameters of " + "type ParamTest2" + " " }, { "pkg2/class-use/ParamTest2.html", "ClassUseTest3<T extends " + "" + "ParamTest2<java.util.List<? extends " + "" + "Foo4>>> " }, { "pkg2/class-use/ParamTest2.html", "Methods in pkg2 with type parameters of " + "type ParamTest2" + " " }, { "pkg2/class-use/ParamTest2.html", "ClassUseTest3" + ".method(T t) " }, { "pkg2/class-use/ParamTest2.html", "<T extends " + "ParamTest2<java.util.List<? extends Foo4>" + ">>
    ParamTest2<java.util.List" + "<? extends Foo4>>
    " }, { "pkg2/class-use/Foo4.html", "Classes in pkg2 with type parameters of " + "type Foo4 " + "" }, { "pkg2/class-use/Foo4.html", "ClassUseTest3<T extends " + "" + "ParamTest2<java.util.List<? extends " + "" + "Foo4>>> " }, { "pkg2/class-use/Foo4.html", "Methods in pkg2 with type parameters of " + "type Foo4 " }, { "pkg2/class-use/Foo4.html", "ClassUseTest3." + "method(T t)" + " " }, { "pkg2/class-use/Foo4.html", "Methods in pkg2 that return types with " + "arguments of type Foo4 " }, { "pkg2/class-use/Foo4.html", "<T extends " + "ParamTest2<java.util.List<? extends Foo4>" + ">>
    ParamTest2<java.util.List" + "<? extends Foo4>>
    " }, //Type parameters in constructor and method args { "pkg2/class-use/Foo4.html", "Method parameters in pkg2 with type arguments of " + "type Foo4 " + "\n" + "\n" + "Modifier and Type\n" + "Method and Description\n" + "\n" + "\n" + "\n" + "void\n" + "ClassUseTest3." + "method(java." + "util.Set<Foo4> p) \n" + "\n" + "" }, { "pkg2/class-use/Foo4.html", "Constructor parameters in pkg2 with type arguments " + "of type Foo4 " + "" }, //================================= // Annotatation Type Usage //================================= { "pkg/class-use/AnnotationType.html", "Packages with annotations of type " + "AnnotationType " + "" }, { "pkg/class-use/AnnotationType.html", "Classes in pkg with annotations of type " + "AnnotationType " }, { "pkg/class-use/AnnotationType.html", "Fields in pkg with annotations of type " + "AnnotationType" + " " }, { "pkg/class-use/AnnotationType.html", "Methods in pkg with annotations of type " + "AnnotationType" + " " }, { "pkg/class-use/AnnotationType.html", "Method parameters in pkg with annotations of type " + "AnnotationType" + " " }, { "pkg/class-use/AnnotationType.html", "Constructors in pkg with annotations of type " + "AnnotationType" + " " }, { "pkg/class-use/AnnotationType.html", "Constructor parameters in pkg with annotations of " + "type AnnotationType " }, //================================= // TYPE PARAMETER IN INDEX //================================= { "index-all.html", "" + "method(Vector<Object>)" }, //================================= // TYPE PARAMETER IN INDEX //================================= { "index-all.html", "" + "method(Vector<Object>)" }, }; private static final String[][] NEGATED_TEST = { //================================= // ENUM TESTING //================================= //NO constructor section { "pkg/Coin.html", "

    Constructor Summary

    "}, //================================= // TYPE PARAMETER TESTING //================================= //No type parameters in class frame. { "allclasses-frame.html", "" + "TypeParameters<E>" }, //============================================================== // ANNOTATION TYPE USAGE TESTING (When @Documented is omitted) //=============================================================== //CLASS { "pkg/AnnotationTypeUsage.html", "@AnnotationTypeUndocumented(optional=\"Class Annotation\",\n" + " required=1994)\n" + "public class AnnotationTypeUsage
    extends java.lang.Object
    "}, //FIELD { "pkg/AnnotationTypeUsage.html", "@AnnotationTypeUndocumented(optional=\"Field Annotation\",\n" + " required=1994)\n" + "public int field"}, //CONSTRUCTOR { "pkg/AnnotationTypeUsage.html", "@AnnotationTypeUndocumented(optional=\"Constructor Annotation\",\n" + " required=1994)\n" + "public AnnotationTypeUsage()"}, //METHOD { "pkg/AnnotationTypeUsage.html", "@AnnotationTypeUndocumented(optional=\"Method Annotation\",\n" + " required=1994)\n" + "public void method()"}, //================================= // Make sure annotation types do not // trigger this warning. //================================= {WARNING_OUTPUT, "Internal error: package sets don't match: [] with: null" }, }; /** * The entry point of the test. * @param args the array of command line arguments. */ public static void main(String[] args) { TestNewLanguageFeatures tester = new TestNewLanguageFeatures(); tester.run(ARGS, TEST, NEGATED_TEST); tester.printSummary(); } }