test/langtools/tools/javac/preview/PreviewErrors.java
changeset 58713 ad69fd32778e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/preview/PreviewErrors.java	Mon Oct 21 15:38:26 2019 +0200
@@ -0,0 +1,274 @@
+/*
+ * Copyright (c) 2019, 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 8226585
+ * @summary Verify behavior w.r.t. preview feature API errors and warnings
+ * @library /tools/lib /tools/javac/lib
+ * @modules
+ *      java.base/jdk.internal
+ *      jdk.compiler/com.sun.tools.javac.api
+ *      jdk.compiler/com.sun.tools.javac.file
+ *      jdk.compiler/com.sun.tools.javac.main
+ *      jdk.compiler/com.sun.tools.javac.util
+ * @build toolbox.ToolBox toolbox.JavacTask
+ * @build combo.ComboTestHelper
+ * @compile --enable-preview -source ${jdk.version} PreviewErrors.java
+ * @run main/othervm --enable-preview PreviewErrors
+ */
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import combo.ComboInstance;
+import combo.ComboParameter;
+import combo.ComboTask;
+import combo.ComboTestHelper;
+import java.util.Arrays;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javax.tools.Diagnostic;
+
+import jdk.internal.PreviewFeature;
+
+import toolbox.JavacTask;
+import toolbox.ToolBox;
+
+public class PreviewErrors extends ComboInstance<PreviewErrors> {
+
+    protected ToolBox tb;
+
+    PreviewErrors() {
+        super();
+        tb = new ToolBox();
+    }
+
+    public static void main(String... args) throws Exception {
+        new ComboTestHelper<PreviewErrors>()
+                .withDimension("ESSENTIAL", (x, essential) -> x.essential = essential, EssentialAPI.values())
+                .withDimension("PREVIEW", (x, preview) -> x.preview = preview, Preview.values())
+                .withDimension("LINT", (x, lint) -> x.lint = lint, Lint.values())
+                .withDimension("SUPPRESS", (x, suppress) -> x.suppress = suppress, Suppress.values())
+                .withDimension("FROM", (x, from) -> x.from = from, PreviewFrom.values())
+                .run(PreviewErrors::new);
+    }
+
+    private EssentialAPI essential;
+    private Preview preview;
+    private Lint lint;
+    private Suppress suppress;
+    private PreviewFrom from;
+
+    @Override
+    public void doWork() throws IOException {
+        Path base = Paths.get(".");
+        Path src = base.resolve("src");
+        Path srcJavaBase = src.resolve("java.base");
+        Path classes = base.resolve("classes");
+        Path classesJavaBase = classes.resolve("java.base");
+
+        Files.createDirectories(classesJavaBase);
+
+        String previewAPI = """
+                            package preview.api;
+                            public class Extra {
+                                @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.${preview}
+                                                             ${essential})
+                                public static void test() { }
+                                @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.${preview}
+                                                             ${essential})
+                                public static class Clazz {}
+                            }
+                            """.replace("${preview}", PreviewFeature.Feature.values()[0].name())
+                               .replace("${essential}", essential.expand(null));
+
+         if (from == PreviewFrom.CLASS) {
+            tb.writeJavaFiles(srcJavaBase, previewAPI);
+
+            new JavacTask(tb)
+                    .outdir(classesJavaBase)
+                    .options("--patch-module", "java.base=" + srcJavaBase.toString())
+                    .files(tb.findJavaFiles(srcJavaBase))
+                    .run()
+                    .writeAll();
+         }
+
+        ComboTask task = newCompilationTask()
+                .withSourceFromTemplate("""
+                                        package test;
+                                        public class Test {
+                                            #{SUPPRESS}
+                                            public void test() {
+                                                preview.api.Extra.test();
+                                                preview.api.Extra.Clazz c;
+                                            }
+                                        }
+                                        """)
+                .withOption("-XDrawDiagnostics")
+                .withOption("-source")
+                .withOption(String.valueOf(Runtime.version().feature()));
+
+        if (from == PreviewFrom.CLASS) {
+            task.withOption("--patch-module")
+                .withOption("java.base=" + classesJavaBase.toString())
+                .withOption("--add-exports")
+                .withOption("java.base/preview.api=ALL-UNNAMED");
+        } else {
+            task.withSourceFromTemplate("Extra", previewAPI)
+                .withOption("--add-exports")
+                .withOption("java.base/jdk.internal=ALL-UNNAMED");
+        }
+
+        if (preview.expand(null)!= null) {
+            task = task.withOption(preview.expand(null));
+        }
+
+        if (lint.expand(null) != null) {
+            task = task.withOption(lint.expand(null));
+        }
+
+        task.generate(result -> {
+                Set<String> actual = Arrays.stream(Diagnostic.Kind.values())
+                                            .flatMap(kind -> result.diagnosticsForKind(kind).stream())
+                                            .map(d -> d.getLineNumber() + ":" + d.getColumnNumber() + ":" + d.getCode())
+                                            .collect(Collectors.toSet());
+                Set<String> expected;
+                boolean ok;
+                if (essential == EssentialAPI.YES) {
+                    if (preview == Preview.YES) {
+                        if (suppress == Suppress.YES) {
+                            expected = Set.of();
+                        } else if (lint == Lint.ENABLE_PREVIEW) {
+                            expected = Set.of("5:26:compiler.warn.is.preview", "6:26:compiler.warn.is.preview");
+                        } else {
+                            expected = Set.of("-1:-1:compiler.note.preview.filename",
+                                              "-1:-1:compiler.note.preview.recompile");
+                        }
+                        ok = true;
+                    } else {
+                        expected = Set.of("5:26:compiler.err.is.preview", "6:26:compiler.err.is.preview");
+                        ok = false;
+                    }
+                } else {
+                    if (suppress == Suppress.YES) {
+                        expected = Set.of();
+                    } else if ((preview == Preview.YES && (lint == Lint.NONE || lint == Lint.DISABLE_PREVIEW)) ||
+                               (preview == Preview.NO && lint == Lint.DISABLE_PREVIEW)) {
+                        expected = Set.of("-1:-1:compiler.note.preview.filename",
+                                          "-1:-1:compiler.note.preview.recompile");
+                    } else {
+                        expected = Set.of("5:26:compiler.warn.is.preview", "6:26:compiler.warn.is.preview");
+                    }
+                    ok = true;
+                }
+                if (ok) {
+                    if (!result.get().iterator().hasNext()) {
+                        throw new IllegalStateException("Did not succeed as expected." + actual);
+                    }
+                } else {
+                    if (result.get().iterator().hasNext()) {
+                        throw new IllegalStateException("Succeed unexpectedly.");
+                    }
+                }
+                if (!expected.equals(actual)) {
+                    throw new IllegalStateException("Unexpected output for " + essential + ", " + preview + ", " + lint + ", " + suppress + ", " + from + ": actual: \"" + actual + "\", expected: \"" + expected + "\"");
+                }
+            });
+    }
+
+    public enum EssentialAPI implements ComboParameter {
+        YES(", essentialAPI=true"),
+        NO(", essentialAPI=false");
+
+        private final String code;
+
+        private EssentialAPI(String code) {
+            this.code = code;
+        }
+
+        public String expand(String optParameter) {
+            return code;
+        }
+    }
+
+    public enum Preview implements ComboParameter {
+        YES("--enable-preview"),
+        NO(null);
+
+        private final String opt;
+
+        private Preview(String opt) {
+            this.opt = opt;
+        }
+
+        public String expand(String optParameter) {
+            return opt;
+        }
+    }
+
+    public enum Lint implements ComboParameter {
+        NONE(null),
+        ENABLE_PREVIEW("-Xlint:preview"),
+        DISABLE_PREVIEW("-Xlint:-preview");
+
+        private final String opt;
+
+        private Lint(String opt) {
+            this.opt = opt;
+        }
+
+        public String expand(String optParameter) {
+            return opt;
+        }
+    }
+
+    public enum Suppress implements ComboParameter {
+        YES("@SuppressWarnings(\"preview\")"),
+        NO("");
+
+        private final String code;
+
+        private Suppress(String code) {
+            this.code = code;
+        }
+
+        public String expand(String optParameter) {
+            return code;
+        }
+    }
+
+    public enum PreviewFrom implements ComboParameter {
+        CLASS,
+        SOURCE;
+
+        private PreviewFrom() {
+        }
+
+        public String expand(String optParameter) {
+            throw new IllegalStateException();
+        }
+    }
+}