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