Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/Java/Openjdk/test/langtools/jdk/jshell/   (Apache JAVA IDE Version 28©)  Datei vom 13.11.2022 mit Größe 19 kB image not shown  

Quellcode-Bibliothek CommandCompletionTest.java   Sprache: JAVA

 
/*
 * Copyright (c) 2015, 2021, 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 8144095 8164825 8169818 8153402 8165405 8177079 8178013 8167554 8166232 8277328
 * @summary Test Command Completion
 * @modules jdk.compiler/com.sun.tools.javac.api
 *          jdk.compiler/com.sun.tools.javac.main
 *          jdk.jdeps/com.sun.tools.javap
 *          jdk.jshell/jdk.internal.jshell.tool
 * @library /tools/lib
 * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask
 * @build ReplToolTesting TestingInputStream Compiler
 * @run testng CommandCompletionTest
 */


import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.testng.SkipException;
import org.testng.annotations.Test;

import jdk.internal.jshell.tool.JShellTool;
import jdk.internal.jshell.tool.JShellToolBuilder;
import jdk.jshell.SourceCodeAnalysis.Suggestion;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;

public class CommandCompletionTest extends ReplToolTesting {


    private JShellTool repl;

    @Override
    protected void testRawRun(Locale locale, String[] args) {
        repl = ((JShellToolBuilder) builder(locale))
                .rawTool();
        try {
            repl.start(args);
        } catch (Exception ex) {
            fail("Repl tool died with exception", ex);
        }
    }

    public void assertCompletion(boolean after, String code, int minElements) {
        if (!after) {
            setCommandInput("\n");
        } else {
            List<String> completions = computeCompletions(code, false);
            assertTrue(completions.size() >= minElements, "Command: " + code + ", output: " +
                    completions.toString() + ", expected output with at least " + minElements + " elements");
        }
    }

    public void assertCompletion(boolean after, String code, boolean isSmart, String... expected) {
        if (!after) {
            setCommandInput("\n");
        } else {
            assertCompletion(code, isSmart, expected);
        }
    }

    public void assertCompletion(String code, boolean isSmart, String... expected) {
        List<String> completions = computeCompletions(code, isSmart);
        List<String> expectedL = Arrays.asList(expected);
        assertEquals(completions, expectedL, "Command: " + code + ", output: " +
                completions.toString() + ", expected: " + expectedL.toString());
    }

    private List<String> computeCompletions(String code, boolean isSmart) {
        int cursor =  code.indexOf('|');
        code = code.replace("|""");
        assertTrue(cursor > -1, "'|' not found: " + code);
        List<Suggestion> completions =
                repl.commandCompletionSuggestions(code, cursor, new int[] {-1}); //XXX: ignoring anchor for now
        return completions.stream()
                          .filter(s -> isSmart == s.matchesType())
                          .map(s -> s.continuation())
                          .distinct()
                          .collect(Collectors.toList());
    }

    @Test
    public void testCommand() {
        testNoStartUp(
                a -> assertCompletion(a, "/deb|"false),
                a -> assertCompletion(a, "/re|"false"/reload ""/reset "),
                a -> assertCompletion(a, "/h|"false"/help ""/history ")
        );
    }

    @Test
    public void testList() {
        test(falsenew String[] {"--no-startup"},
                a -> assertCompletion(a, "/l|"false"/list "),
                a -> assertCompletion(a, "/list |"false"-all""-history""-start "),
                a -> assertCompletion(a, "/list -h|"false"-history"),
                a -> assertCompletion(a, "/list q|"false),
                a -> assertVariable(a, "int""xray"),
                a -> assertCompletion(a, "/list |"false"-all""-history""-start ""1 ""xray "),
                a -> assertCompletion(a, "/list x|"false"xray "),
                a -> assertCompletion(a, "/list xray |"false)
        );
    }

    @Test
    public void testHistory() {
        test(falsenew String[] {"--no-startup"},
                a -> assertCompletion(a, "/hi|"false"/history "),
                a -> assertCompletion(a, "/history |"false"-all")
        );
    }

    @Test
    public void testDrop() {
        test(falsenew String[] {"--no-startup"},
                a -> assertCompletion(a, "/d|"false"/drop "),
                a -> assertClass(a, "class cTest {}""class""cTest"),
                a -> assertMethod(a, "int mTest() { return 0; }""()I""mTest"),
                a -> assertVariable(a, "int""fTest"),
                a -> assertCompletion(a, "/drop |"false"1 ""2 ""3 ""cTest ""fTest ""mTest "),
                a -> assertCompletion(a, "/drop f|"false"fTest ")
        );
    }

    @Test
    public void testEdit() {
        test(falsenew String[]{"--no-startup"},
                a -> assertCompletion(a, "/e|"false"/edit ""/env ""/exit "),
                a -> assertCompletion(a, "/ed|"false"/edit "),
                a -> assertClass(a, "class cTest {}""class""cTest"),
                a -> assertMethod(a, "int mTest() { return 0; }""()I""mTest"),
                a -> assertVariable(a, "int""fTest"),
                a -> assertCompletion(a, "/edit |"false,
                        "-all" , "-start " , "1 ""2 ""3 ""cTest ""fTest ""mTest "),
                a -> assertCompletion(a, "/edit cTest |"false,
                        "2 ""3 ""fTest ""mTest "),
                a -> assertCompletion(a, "/edit 1 fTest |"false,
                        "2 ""mTest "),
                a -> assertCompletion(a, "/edit f|"false"fTest "),
                a -> assertCompletion(a, "/edit mTest f|"false"fTest ")
        );
    }

    @Test
    public void testHelp() {
        testNoStartUp(
                a -> assertCompletion(a, "/help |"false,
                "/! ""/- ""/ ""/? ""/drop ",
                "/edit ""/env ""/exit ",
                "/help ""/history ""/imports ",
                "/list ""/methods ""/open ""/reload ""/reset ",
                "/save ""/set ""/types ""/vars ""context ",
                "id ""intro ""keys ""rerun ""shortcuts "),
                a -> assertCompletion(a, "/? |"false,
                "/! ""/- ""/ ""/? ""/drop ",
                "/edit ""/env ""/exit ",
                "/help ""/history ""/imports ",
                "/list ""/methods ""/open ""/reload ""/reset ",
                "/save ""/set ""/types ""/vars ""context ",
                "id ""intro ""keys ""rerun ""shortcuts "),
                a -> assertCompletion(a, "/help /s|"false,
                "/save ""/set "),
                a -> assertCompletion(a, "/help /set |"false,
                "editor""feedback""format""indent""mode""prompt""start""truncation"),
                a -> assertCompletion(a, "/help set |"false,
                "editor""feedback""format""indent""mode""prompt""start""truncation"),
                a -> assertCompletion(a, "/help /edit |"false),
                a -> assertCompletion(a, "/help dr|"false,
                "drop ")
        );
    }

    @Test
    public void testReload() {
        String[] ropts = new String[] { "-add-exports ""-add-modules ",
            "-class-path ""-module-path ""-quiet ""-restore " };
        String[] dropts = new String[] { "--add-exports ""--add-modules ",
            "--class-path ""--module-path ""--quiet ""--restore " };
        testNoStartUp(
                a -> assertCompletion(a, "/reloa |"false, ropts),
                a -> assertCompletion(a, "/relo |"false, ropts),
                a -> assertCompletion(a, "/reload -|"false, ropts),
                a -> assertCompletion(a, "/reload --|"false, dropts),
                a -> assertCompletion(a, "/reload -restore |"false, ropts),
                a -> assertCompletion(a, "/reload -restore --|"false, dropts),
                a -> assertCompletion(a, "/reload -rest|"false"-restore "),
                a -> assertCompletion(a, "/reload --r|"false"--restore "),
                a -> assertCompletion(a, "/reload -q|"false"-quiet "),
                a -> assertCompletion(a, "/reload -add|"false"-add-exports ""-add-modules "),
                a -> assertCompletion(a, "/reload -class-path . -quiet |"false, ropts)
        );
    }

    @Test
    public void testEnv() {
        String[] ropts = new String[] { "-add-exports ""-add-modules ",
            "-class-path ""-module-path " };
        String[] dropts = new String[] { "--add-exports ""--add-modules ",
            "--class-path ""--module-path " };
        testNoStartUp(
                a -> assertCompletion(a, "/env |"false, ropts),
                a -> assertCompletion(a, "/env -|"false, ropts),
                a -> assertCompletion(a, "/env --|"false, dropts),
                a -> assertCompletion(a, "/env --a|"false"--add-exports ""--add-modules "),
                a -> assertCompletion(a, "/env -add-|"false"-add-exports ""-add-modules "),
                a -> assertCompletion(a, "/env -class-path . |"false, ropts),
                a -> assertCompletion(a, "/env -class-path . --|"false, dropts)
        );
    }

    @Test
    public void testReset() {
        String[] ropts = new String[] { "-add-exports ""-add-modules ",
            "-class-path ""-module-path " };
        String[] dropts = new String[] { "--add-exports ""--add-modules ",
            "--class-path ""--module-path " };
        testNoStartUp(
                a -> assertCompletion(a, "/reset |"false, ropts),
                a -> assertCompletion(a, "/res -m|"false"-module-path "),
                a -> assertCompletion(a, "/res -module-|"false"-module-path "),
                a -> assertCompletion(a, "/res --m|"false"--module-path "),
                a -> assertCompletion(a, "/res --module-|"false"--module-path "),
                a -> assertCompletion(a, "/reset -add|"false"-add-exports ""-add-modules "),
                a -> assertCompletion(a, "/rese -class-path . |"false, ropts),
                a -> assertCompletion(a, "/rese -class-path . --|"false, dropts)
        );
    }

    @Test
    public void testVarsMethodsTypes() {
        testNoStartUp(
                a -> assertCompletion(a, "/v|"false"/vars "),
                a -> assertCompletion(a, "/m|"false"/methods "),
                a -> assertCompletion(a, "/t|"false"/types "),
                a -> assertClass(a, "class cTest {}""class""cTest"),
                a -> assertMethod(a, "int mTest() { return 0; }""()I""mTest"),
                a -> assertVariable(a, "int""fTest"),
                a -> assertCompletion(a, "/vars |"false"-all""-start ""3 ""fTest "),
                a -> assertCompletion(a, "/meth |"false"-all""-start ""2 ""mTest "),
                a -> assertCompletion(a, "/typ |"false"-all""-start ""1 ""cTest "),
                a -> assertCompletion(a, "/var f|"false"fTest ")
        );
    }

    @Test
    public void testOpen() throws IOException {
        Compiler compiler = new Compiler();
        testNoStartUp(
                a -> assertCompletion(a, "/o|"false"/open ")
        );
        testNoStartUp(
                a -> assertCompletion(a, "/open |", 1)
        );
        Path classDir = compiler.getClassDir();
        testNoStartUp(
                a -> assertCompletion(a, "/open " + classDir + "/|", 1)
        );
    }

    @Test
    public void testSave() throws IOException {
        Compiler compiler = new Compiler();
        testNoStartUp(
                a -> assertCompletion(a, "/s|"false"/save ""/set ")
        );
        testNoStartUp(
                a -> assertCompletion(a, "/save |", 4)
        );
        Path classDir = compiler.getClassDir();
        testNoStartUp(
                a -> assertCompletion(a, "/save " + classDir + "/|", 1),
                a -> assertCompletion(a, "/save -all " + classDir + "/|", 1)
        );
    }

    @Test
    public void testClassPath() throws IOException {
        Compiler compiler = new Compiler();
        Path outDir = compiler.getPath("testClasspathCompletion");
        Files.createDirectories(outDir);
        Files.createDirectories(outDir.resolve("dir"));
        createIfNeeded(outDir.resolve("test.jar"));
        createIfNeeded(outDir.resolve("test.zip"));
        compiler.compile(outDir, "package pkg; public class A { public String toString() { return \"A\"; } }");
        String jarName = "test.jar";
        compiler.jar(outDir, jarName, "pkg/A.class");
        compiler.getPath(outDir).resolve(jarName);
        List<String> paths = listFiles(outDir, CLASSPATH_FILTER);
        String[] pathArray = paths.toArray(new String[paths.size()]);
        testNoStartUp(
                a -> assertCompletion(a, "/env -class-path " + outDir + "/|"false, pathArray),
                a -> assertCompletion(a, "/env --class-path " + outDir + "/|"false, pathArray),
                a -> assertCompletion(a, "/env -clas " + outDir + "/|"false, pathArray),
                a -> assertCompletion(a, "/env --class-p " + outDir + "/|"false, pathArray),
                a -> assertCompletion(a, "/env --module-path . --class-p " + outDir + "/|"false, pathArray)
        );
    }

    @Test
    public void testClassPathWithSpace() throws IOException {
        Compiler compiler = new Compiler();
        Path outDir = compiler.getPath("testClassPathWithSpace");
        Path dirWithSpace = Files.createDirectories(outDir.resolve("dir with space"));
        Files.createDirectories(dirWithSpace.resolve("nested with space"));
        String[] pathArray = new String[] {"dir\\ with\\ space/"};
        String[] pathArray2 = new String[] {"nested\\ with\\ space/"};
        testNoStartUp(
                a -> assertCompletion(a, "/env -class-path " + outDir + "/|"false, pathArray),
                a -> assertCompletion(a, "/env -class-path " + outDir + "/dir|"false, pathArray),
                a -> assertCompletion(a, "/env -class-path " + outDir + "/dir\\ with|"false, pathArray),
                a -> assertCompletion(a, "/env -class-path " + outDir + "/dir\\ with\\ space/|"false, pathArray2)
        );
    }

    @Test
    public void testUserHome() throws IOException {
        List<String> completions;
        Path home = Paths.get(System.getProperty("user.home"));
        String selectedFile;
        try (Stream<Path> content = Files.list(home)) {
            selectedFile = content.filter(CLASSPATH_FILTER)
                                  .filter(file -> file.getFileName().toString().contains(" "))
                                  .findAny()
                                  .map(file -> file.getFileName().toString().replace(" ""\\ "))
                                  .orElse(null);
        }
        if (selectedFile == null) {
            throw new SkipException("No suitable file(s) found for this test in " + home);
        }
        try (Stream<Path> content = Files.list(home)) {
            completions = content.filter(CLASSPATH_FILTER)
                                 .filter(file -> file.getFileName().toString().startsWith(selectedFile.replace("\\ "" ")))
                                 .map(file -> file.getFileName().toString().replace(" ""\\ ") + (Files.isDirectory(file) ? "/" : ""))
                                 .sorted()
                                 .collect(Collectors.toList());
        }
        testNoStartUp(
                a -> assertCompletion(a, "/env --class-path ~/" + selectedFile + "|"false, completions.toArray(new String[completions.size()]))
        );
    }

    @Test
    public void testSet() throws IOException {

        String[] modes = {"concise ""normal ""silent ""verbose "};
        String[] options = {"-command""-delete""-quiet"};
        String[] modesWithOptions = Stream.concat(Arrays.stream(options), Arrays.stream(modes)).sorted().toArray(String[]::new);
        test(falsenew String[] {"--no-startup"},
                a -> assertCompletion(a, "/se|"false"/set "),
                a -> assertCompletion(a, "/set |"false"editor ""feedback ""format ""indent ""mode ""prompt ""start ""truncation "),

                // /set editor
                a -> assertCompletion(a, "/set e|"false"editor "),
                a -> assertCompletion(a, "/set editor |", 1),

                // /set feedback
                a -> assertCompletion(a, "/set fe|"false"feedback "),
                a -> assertCompletion(a, "/set fe |"false, modes),

                // /set format
                a -> assertCompletion(a, "/set fo|"false"format "),
                a -> assertCompletion(a, "/set fo |"false, modes),

                // /set mode
                a -> assertCompletion(a, "/set mo|"false"mode "),
                a -> assertCompletion(a, "/set mo |"false),
                a -> assertCompletion(a, "/set mo newmode |"false, modesWithOptions),
                a -> assertCompletion(a, "/set mo newmode -|"false, options),
                a -> assertCompletion(a, "/set mo newmode -command |"false),
                a -> assertCompletion(a, "/set mo newmode normal |"false, options),

                // /set prompt
                a -> assertCompletion(a, "/set pro|"false"prompt "),
                a -> assertCompletion(a, "/set pro |"false, modes),

                // /set start
                a -> assertCompletion(a, "/set st|"false"start "),
                a -> assertCompletion(a, "/set st |", 1),

                // /set truncation
                a -> assertCompletion(a, "/set tr|"false"truncation "),
                a -> assertCompletion(a, "/set tr |"false, modes)
        );
    }

    private void createIfNeeded(Path file) throws IOException {
        if (!Files.exists(file))
            Files.createFile(file);
    }
    private List<String> listFiles(Path path) throws IOException {
        return listFiles(path, ACCEPT_ALL);
    }

    private List<String> listFiles(Path path, Predicate<? super Path> filter) throws IOException {
        try (Stream<Path> stream = Files.list(path)) {
            return stream.filter(filter)
                         .map(p -> p.getFileName().toString() + (Files.isDirectory(p) ? "/" : ""))
                         .sorted()
                         .collect(Collectors.toList());
        }
    }

    private static final Predicate<? super Path> ACCEPT_ALL =
            (file) -> !file.endsWith(".") && !file.endsWith("..");

    private static final Predicate<? super Path> CLASSPATH_FILTER =
            (file) -> ACCEPT_ALL.test(file) &&
                    (Files.isDirectory(file) ||
                     file.getFileName().toString().endsWith(".jar") ||
                     file.getFileName().toString().endsWith(".zip"));

}

93%


¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.15Bemerkung:  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.