OptionSyntaxTest.java revision 3673:8bf23828bb2f
1135446Strhodes/* 2135446Strhodes * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. 3135446Strhodes * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4135446Strhodes * 5135446Strhodes * This code is free software; you can redistribute it and/or modify it 6135446Strhodes * under the terms of the GNU General Public License version 2 only, as 7135446Strhodes * published by the Free Software Foundation. 8135446Strhodes * 9135446Strhodes * This code is distributed in the hope that it will be useful, but WITHOUT 10135446Strhodes * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11135446Strhodes * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12135446Strhodes * version 2 for more details (a copy is included in the LICENSE file that 13135446Strhodes * accompanied this code). 14135446Strhodes * 15135446Strhodes * You should have received a copy of the GNU General Public License version 16135446Strhodes * 2 along with this work; if not, write to the Free Software Foundation, 17135446Strhodes * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18143731Sdougb * 19135446Strhodes * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20135446Strhodes * or visit www.oracle.com if you need additional information or have any 21135446Strhodes * questions. 22135446Strhodes */ 23135446Strhodes 24135446Strhodes/* 25135446Strhodes * @test 26135446Strhodes * @bug 8166144 27135446Strhodes * @summary support new-style options 28135446Strhodes * @modules jdk.compiler/com.sun.tools.javac.api 29135446Strhodes * @modules jdk.compiler/com.sun.tools.javac.main 30135446Strhodes * @modules jdk.javadoc/jdk.javadoc.internal.api 31135446Strhodes * @modules jdk.javadoc/jdk.javadoc.internal.tool 32135446Strhodes * @library /tools/lib 33135446Strhodes * @build toolbox.JavacTask toolbox.JavadocTask toolbox.ModuleBuilder toolbox.TestRunner toolbox.ToolBox 34135446Strhodes * @run main OptionSyntaxTest 35135446Strhodes */ 36135446Strhodesimport java.io.IOException; 37135446Strhodesimport java.nio.file.Path; 38135446Strhodesimport java.nio.file.Paths; 39135446Strhodesimport java.util.ArrayList; 40135446Strhodesimport java.util.Arrays; 41135446Strhodesimport java.util.HashSet; 42135446Strhodesimport java.util.List; 43135446Strhodesimport java.util.ListIterator; 44135446Strhodesimport java.util.Locale; 45135446Strhodesimport java.util.Objects; 46135446Strhodesimport java.util.Set; 47135446Strhodes 48135446Strhodesimport javax.lang.model.SourceVersion; 49135446Strhodes 50135446Strhodesimport jdk.javadoc.doclet.Doclet; 51135446Strhodesimport jdk.javadoc.doclet.DocletEnvironment; 52135446Strhodesimport jdk.javadoc.doclet.Reporter; 53135446Strhodes 54135446Strhodesimport toolbox.JavadocTask; 55135446Strhodesimport toolbox.ModuleBuilder; 56135446Strhodesimport toolbox.Task; 57135446Strhodesimport toolbox.TestRunner; 58135446Strhodesimport toolbox.ToolBox; 59135446Strhodes 60135446Strhodes 61135446Strhodespublic class OptionSyntaxTest extends TestRunner { 62135446Strhodes public static class TestDoclet implements Doclet { 63135446Strhodes @Override 64135446Strhodes public boolean run(DocletEnvironment root) { 65135446Strhodes System.out.println("TestDoclet.run"); 66135446Strhodes return true; 67135446Strhodes } 68135446Strhodes 69135446Strhodes @Override 70135446Strhodes public String getName() { 71135446Strhodes return "Test"; 72135446Strhodes } 73135446Strhodes 74135446Strhodes @Override 75135446Strhodes public Set<Option> getSupportedOptions() { 76135446Strhodes return options; 77135446Strhodes } 78135446Strhodes 79135446Strhodes @Override 80135446Strhodes public SourceVersion getSupportedSourceVersion() { 81135446Strhodes return SourceVersion.latest(); 82135446Strhodes } 83135446Strhodes 84135446Strhodes @Override 85135446Strhodes public void init(Locale locale, Reporter reporter) { 86135446Strhodes } 87135446Strhodes 88135446Strhodes private final Set<Doclet.Option> options = new HashSet<>(Arrays.asList( 89135446Strhodes new DOption("-old", 0), 90135446Strhodes new DOption("-oldWithArg", 1), 91135446Strhodes new DOption("-oldWithArgs", 2), 92135446Strhodes new DOption("--new", 0), 93135446Strhodes new DOption("--newWithArg", 1), 94135446Strhodes new DOption("--newWithArgs", 2) 95135446Strhodes )); 96135446Strhodes 97135446Strhodes } 98135446Strhodes 99135446Strhodes static class DOption implements Doclet.Option { 100135446Strhodes private final String name; 101135446Strhodes private final int argCount; 102135446Strhodes 103135446Strhodes DOption(String name, int argCount) { 104135446Strhodes this.name = name; 105135446Strhodes this.argCount = argCount; 106135446Strhodes } 107135446Strhodes 108135446Strhodes @Override 109135446Strhodes public int getArgumentCount() { 110135446Strhodes return argCount; 111135446Strhodes } 112135446Strhodes 113135446Strhodes @Override 114135446Strhodes public String getDescription() { 115135446Strhodes return "description[" + name + "]"; 116135446Strhodes } 117135446Strhodes 118135446Strhodes @Override 119135446Strhodes public Kind getKind() { 120135446Strhodes return Doclet.Option.Kind.STANDARD; 121135446Strhodes } 122135446Strhodes 123135446Strhodes @Override 124135446Strhodes public String getName() { 125135446Strhodes return name; 126135446Strhodes } 127135446Strhodes 128135446Strhodes @Override 129135446Strhodes public String getParameters() { 130135446Strhodes return argCount > 0 ? "parameters[" + name + "," + argCount + "]" : null; 131135446Strhodes } 132135446Strhodes 133135446Strhodes @Override 134135446Strhodes public boolean matches(String option) { 135135446Strhodes return option.equals(name); 136135446Strhodes } 137135446Strhodes 138135446Strhodes @Override 139135446Strhodes public boolean process(String option, ListIterator<String> arguments) { 140135446Strhodes List<String> args = new ArrayList<>(); 141135446Strhodes for (int i = 0; i < argCount && arguments.hasNext(); i++) { 142135446Strhodes args.add(arguments.next()); 143135446Strhodes } 144135446Strhodes System.out.println("process " + option + " " + args); 145135446Strhodes return args.stream().filter(s -> s.startsWith("arg")).count() == argCount; 146135446Strhodes } 147135446Strhodes } 148135446Strhodes 149135446Strhodes public static void main(String... args) throws Exception { 150135446Strhodes OptionSyntaxTest t = new OptionSyntaxTest(); 151135446Strhodes t.runTests(); 152135446Strhodes } 153135446Strhodes 154135446Strhodes private final ToolBox tb = new ToolBox(); 155135446Strhodes private final Path src = Paths.get("src"); 156135446Strhodes private final Path modules = Paths.get("modules"); 157135446Strhodes 158135446Strhodes OptionSyntaxTest() throws IOException { 159135446Strhodes super(System.err); 160135446Strhodes initModules(); 161135446Strhodes } 162135446Strhodes 163135446Strhodes void initModules() throws IOException { 164135446Strhodes new ModuleBuilder(tb, "m1") 165135446Strhodes .exports("p1") 166135446Strhodes .classes("package p1; public class C1 { }") 167135446Strhodes .write(src); 168135446Strhodes 169135446Strhodes new ModuleBuilder(tb, "m2") 170135446Strhodes .exports("p2") 171135446Strhodes .classes("package p2; public class C2 { }") 172135446Strhodes .build(modules); 173135446Strhodes 174135446Strhodes } 175135446Strhodes 176135446Strhodes @Test 177135446Strhodes public void testBasic() { 178135446Strhodes new JavadocTask(tb, Task.Mode.CMDLINE) 179135446Strhodes .options("-docletpath", System.getProperty("test.classes"), 180135446Strhodes "-doclet", TestDoclet.class.getName(), 181135446Strhodes "-sourcepath", "src/m1", 182135446Strhodes "p1") 183135446Strhodes .run() 184135446Strhodes .writeAll(); 185135446Strhodes } 186135446Strhodes 187135446Strhodes @Test 188135446Strhodes public void testNewSourcePath() { 189135446Strhodes new JavadocTask(tb, Task.Mode.CMDLINE) 190135446Strhodes .options("-docletpath", System.getProperty("test.classes"), 191135446Strhodes "-doclet", TestDoclet.class.getName(), 192135446Strhodes "--source-path", "src/m1", 193135446Strhodes "p1") 194135446Strhodes .run() 195135446Strhodes .writeAll(); 196135446Strhodes } 197135446Strhodes 198135446Strhodes @Test 199135446Strhodes public void testNewSourcePathEquals() { 200135446Strhodes new JavadocTask(tb, Task.Mode.CMDLINE) 201135446Strhodes .options("-docletpath", System.getProperty("test.classes"), 202135446Strhodes "-doclet", TestDoclet.class.getName(), 203135446Strhodes "--source-path=src/m1", 204135446Strhodes "p1") 205135446Strhodes .run() 206135446Strhodes .writeAll(); 207135446Strhodes } 208135446Strhodes 209135446Strhodes @Test 210135446Strhodes public void testOldDocletArgs() { 211135446Strhodes new JavadocTask(tb, Task.Mode.CMDLINE) 212135446Strhodes .options("-docletpath", System.getProperty("test.classes"), 213135446Strhodes "-doclet", TestDoclet.class.getName(), 214135446Strhodes "-sourcepath", "src/m1", 215135446Strhodes "-old", 216135446Strhodes "-oldWithArg", "arg", 217135446Strhodes "-oldWithArgs", "arg1", "arg2", 218135446Strhodes "p1") 219135446Strhodes .run() 220135446Strhodes .writeAll(); 221135446Strhodes } 222135446Strhodes 223135446Strhodes @Test 224135446Strhodes public void testNewDocletArgs() { 225135446Strhodes new JavadocTask(tb, Task.Mode.CMDLINE) 226135446Strhodes .options("-docletpath", System.getProperty("test.classes"), 227135446Strhodes "-doclet", TestDoclet.class.getName(), 228135446Strhodes "-sourcepath", "src/m1", 229135446Strhodes "--new", 230135446Strhodes "--newWithArg", "arg", 231135446Strhodes "--newWithArgs", "arg1", "arg2", 232135446Strhodes "p1") 233135446Strhodes .run() 234135446Strhodes .writeAll(); 235135446Strhodes } 236135446Strhodes 237135446Strhodes @Test 238135446Strhodes public void testNewDocletArgsEquals() { 239135446Strhodes new JavadocTask(tb, Task.Mode.CMDLINE) 240135446Strhodes .options("-docletpath", System.getProperty("test.classes"), 241135446Strhodes "-doclet", TestDoclet.class.getName(), 242135446Strhodes "-sourcepath", "src/m1", 243135446Strhodes "--new", "--newWithArg=arg", 244135446Strhodes "p1") 245135446Strhodes .run() 246135446Strhodes .writeAll(); 247135446Strhodes } 248135446Strhodes 249135446Strhodes @Test 250135446Strhodes public void testNewDocletArgsMissingArgs() throws Exception { 251135446Strhodes String log = new JavadocTask(tb, Task.Mode.CMDLINE) 252135446Strhodes .options("-docletpath", System.getProperty("test.classes"), 253135446Strhodes "-doclet", TestDoclet.class.getName(), 254135446Strhodes "-sourcepath", "src/m1", 255135446Strhodes "--newWithArg") 256135446Strhodes .run(Task.Expect.FAIL) 257135446Strhodes .writeAll() 258135446Strhodes .getOutput(Task.OutputKind.DIRECT); 259135446Strhodes if (!log.contains("option --newWithArg requires an argument")) 260135446Strhodes throw new Exception("expected output not found"); 261135446Strhodes } 262135446Strhodes 263135446Strhodes @Test 264135446Strhodes public void testNewDocletArgsExtraArgs() throws Exception { 265135446Strhodes String log = new JavadocTask(tb, Task.Mode.CMDLINE) 266135446Strhodes .options("-docletpath", System.getProperty("test.classes"), 267135446Strhodes "-doclet", TestDoclet.class.getName(), 268135446Strhodes "-sourcepath", "src/m1", 269135446Strhodes "--new=arg", 270135446Strhodes "p1") 271135446Strhodes .run(Task.Expect.FAIL) 272135446Strhodes .writeAll() 273135446Strhodes .getOutput(Task.OutputKind.DIRECT); 274135446Strhodes if (!log.contains("option --new does not require an argument")) 275135446Strhodes throw new Exception("expected output not found"); 276135446Strhodes } 277135446Strhodes 278135446Strhodes @Test 279135446Strhodes public void testNewDocletArgsExtraArgs2() throws Exception { 280135446Strhodes String log = new JavadocTask(tb, Task.Mode.CMDLINE) 281135446Strhodes .options("-docletpath", System.getProperty("test.classes"), 282135446Strhodes "-doclet", TestDoclet.class.getName(), 283135446Strhodes "-sourcepath", "src/m1", 284135446Strhodes "--newWithArgs=arg1 arg2", 285135446Strhodes "p1") 286135446Strhodes .run(Task.Expect.FAIL) 287135446Strhodes .writeAll() 288135446Strhodes .getOutput(Task.OutputKind.DIRECT); 289135446Strhodes if (!log.contains("cannot use '=' syntax for options that require multiple arguments")) 290135446Strhodes throw new Exception("expected output not found"); 291135446Strhodes } 292135446Strhodes 293135446Strhodes} 294135446Strhodes