test/langtools/jdk/jshell/ToolBasicTest.java
author xyin
Tue, 08 May 2018 09:51:42 +0800
changeset 50043 2d1952d4d067
parent 50019 e2dc18484400
child 52282 003c062e16ea
permissions -rw-r--r--
8202690: jdk/jshell/ToolBasicTest.java failed in testOpenFileOverHttp() and testOpenLocalFileUrl() Reviewed-by: rfield, jlahoda
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
     1
/*
50019
e2dc18484400 8202599: Mark intermittently failing jshell tests
darcy
parents: 50017
diff changeset
     2
 * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
     4
 *
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
     7
 * published by the Free Software Foundation.
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
     8
 *
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    13
 * accompanied this code).
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    14
 *
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    18
 *
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    21
 * questions.
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    22
 */
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    23
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    24
/*
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    25
 * @test
50017
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
    26
 * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347 8154714 8166649 8167643 8170162 8172102 8165405 8174796 8174797 8175304 8167554 8180508 8166232 8196133 8199912
36778
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents: 36718
diff changeset
    27
 * @summary Tests for Basic tests for REPL tool
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
    28
 * @modules jdk.compiler/com.sun.tools.javac.api
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
    29
 *          jdk.compiler/com.sun.tools.javac.main
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
    30
 *          jdk.jdeps/com.sun.tools.javap
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
    31
 *          jdk.jshell/jdk.internal.jshell.tool
34570
8a8f52a733dd 8144095: jshell tool: normalize command parameter handling
rfield
parents: 34481
diff changeset
    32
 * @library /tools/lib
36778
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents: 36718
diff changeset
    33
 * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask
e04318f39f92 8152897: refactor ToolBox to allow reduced documented dependencies
jjg
parents: 36718
diff changeset
    34
 * @build KullaTesting TestingInputStream Compiler
35002
209d72239196 8144906: Fix jshell's ToolBasicTest
jlahoda
parents: 34570
diff changeset
    35
 * @run testng/timeout=600 ToolBasicTest
50019
e2dc18484400 8202599: Mark intermittently failing jshell tests
darcy
parents: 50017
diff changeset
    36
 * @key intermittent
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    37
 */
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    38
43856
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
    39
import java.io.File;
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    40
import java.io.IOException;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    41
import java.io.PrintWriter;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    42
import java.io.StringWriter;
50017
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
    43
import java.net.InetAddress;
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
    44
import java.net.InetSocketAddress;
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    45
import java.nio.file.Files;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    46
import java.nio.file.Path;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    47
import java.nio.file.Paths;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    48
import java.util.ArrayList;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    49
import java.util.Arrays;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    50
import java.util.List;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    51
import java.util.Scanner;
34477
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
    52
import java.util.function.BiFunction;
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    53
import java.util.function.Consumer;
34477
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
    54
import java.util.function.Function;
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    55
import java.util.stream.Collectors;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    56
import java.util.stream.Stream;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    57
50017
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
    58
import com.sun.net.httpserver.HttpServer;
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    59
import org.testng.annotations.Test;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    60
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    61
import static org.testng.Assert.assertEquals;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    62
import static org.testng.Assert.assertTrue;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    63
import static org.testng.Assert.fail;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    64
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    65
@Test
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    66
public class ToolBasicTest extends ReplToolTesting {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    67
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    68
    public void elideStartUpFromList() {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    69
        test(
38613
2a8e50869b08 8157953: JShell tests: reenable ToolBasicTest
rfield
parents: 38531
diff changeset
    70
                (a) -> assertCommandOutputContains(a, "123", "==> 123"),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    71
                (a) -> assertCommandCheckOutput(a, "/list", (s) -> {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    72
                    int cnt;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    73
                    try (Scanner scanner = new Scanner(s)) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    74
                        cnt = 0;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    75
                        while (scanner.hasNextLine()) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    76
                            String line = scanner.nextLine();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    77
                            if (!line.trim().isEmpty()) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    78
                                ++cnt;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    79
                            }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    80
                        }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    81
                    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    82
                    assertEquals(cnt, 1, "Expected only one listed line");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    83
                })
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    84
        );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    85
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    86
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    87
    public void elideStartUpFromSave() throws IOException {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    88
        Compiler compiler = new Compiler();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    89
        Path path = compiler.getPath("myfile");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    90
        test(
38613
2a8e50869b08 8157953: JShell tests: reenable ToolBasicTest
rfield
parents: 38531
diff changeset
    91
                (a) -> assertCommandOutputContains(a, "123", "==> 123"),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    92
                (a) -> assertCommand(a, "/save " + path.toString(), "")
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    93
        );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    94
        try (Stream<String> lines = Files.lines(path)) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    95
            assertEquals(lines.count(), 1, "Expected only one saved line");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    96
        }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    97
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    98
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
    99
    public void testInterrupt() {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   100
        ReplTest interrupt = (a) -> assertCommand(a, "\u0003", "");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   101
        for (String s : new String[] { "", "\u0003" }) {
40588
b5c32bfa9710 8160089: jshell tool: use new double-dash long-form command-line options
rfield
parents: 40516
diff changeset
   102
            test(false, new String[]{"--no-startup"},
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   103
                    (a) -> assertCommand(a, "int a = 2 +" + s, ""),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   104
                    interrupt,
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   105
                    (a) -> assertCommand(a, "int a\u0003", ""),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   106
                    (a) -> assertCommand(a, "int a = 2 + 2\u0003", ""),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   107
                    (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   108
                    (a) -> evaluateExpression(a, "int", "2", "2"),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   109
                    (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   110
                    (a) -> assertCommand(a, "void f() {", ""),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   111
                    (a) -> assertCommand(a, "int q = 10;" + s, ""),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   112
                    interrupt,
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   113
                    (a) -> assertCommand(a, "void f() {}\u0003", ""),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   114
                    (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   115
                    (a) -> assertMethod(a, "int f() { return 0; }", "()int", "f"),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   116
                    (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   117
                    (a) -> assertCommand(a, "class A {" + s, ""),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   118
                    interrupt,
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   119
                    (a) -> assertCommand(a, "class A {}\u0003", ""),
38514
f7df9ab653b0 8153920: jshell tool: allow a parameter on the /vars /methods /classes commands
rfield
parents: 37389
diff changeset
   120
                    (a) -> assertCommandCheckOutput(a, "/types", assertClasses()),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   121
                    (a) -> assertClass(a, "interface A {}", "interface", "A"),
38514
f7df9ab653b0 8153920: jshell tool: allow a parameter on the /vars /methods /classes commands
rfield
parents: 37389
diff changeset
   122
                    (a) -> assertCommandCheckOutput(a, "/types", assertClasses()),
33714
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   123
                    (a) -> assertCommand(a, "import java.util.stream." + s, ""),
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   124
                    interrupt,
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   125
                    (a) -> assertCommand(a, "import java.util.stream.\u0003", ""),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   126
                    (a) -> assertCommandCheckOutput(a, "/imports", assertImports()),
33714
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   127
                    (a) -> assertImport(a, "import java.util.stream.Stream", "", "java.util.stream.Stream"),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   128
                    (a) -> assertCommandCheckOutput(a, "/imports", assertImports())
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   129
            );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   130
        }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   131
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   132
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   133
    private final Object lock = new Object();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   134
    private PrintWriter out;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   135
    private boolean isStopped;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   136
    private Thread t;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   137
    private void assertStop(boolean after, String cmd, String output) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   138
        if (!after) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   139
            isStopped = false;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   140
            StringWriter writer = new StringWriter();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   141
            out = new PrintWriter(writer);
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   142
            setCommandInput(cmd + "\n");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   143
            t = new Thread(() -> {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   144
                try {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   145
                    // no chance to know whether cmd is being evaluated
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   146
                    Thread.sleep(5000);
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   147
                } catch (InterruptedException ignored) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   148
                }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   149
                int i = 1;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   150
                int n = 30;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   151
                synchronized (lock) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   152
                    do {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   153
                        setCommandInput("\u0003");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   154
                        if (!isStopped) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   155
                            out.println("Not stopped. Try again: " + i);
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   156
                            try {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   157
                                lock.wait(1000);
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   158
                            } catch (InterruptedException ignored) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   159
                            }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   160
                        }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   161
                    } while (i++ < n && !isStopped);
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   162
                    if (!isStopped) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   163
                        System.err.println(writer.toString());
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   164
                        fail("Evaluation was not stopped: '" + cmd + "'");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   165
                    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   166
                }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   167
            });
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   168
            t.start();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   169
        } else {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   170
            synchronized (lock)  {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   171
                out.println("Evaluation was stopped successfully: '" + cmd + "'");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   172
                isStopped = true;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   173
                lock.notify();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   174
            }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   175
            try {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   176
                t.join();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   177
                t = null;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   178
            } catch (InterruptedException ignored) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   179
            }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   180
            assertOutput(getCommandOutput(), "", "command");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   181
            assertOutput(getCommandErrorOutput(), "", "command error");
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   182
            assertOutput(getUserOutput().trim(), output, "user");
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   183
            assertOutput(getUserErrorOutput(), "", "user error");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   184
        }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   185
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   186
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   187
    public void testStop() {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   188
        test(
38613
2a8e50869b08 8157953: JShell tests: reenable ToolBasicTest
rfield
parents: 38531
diff changeset
   189
                (a) -> assertStop(a, "while (true) {}", ""),
2a8e50869b08 8157953: JShell tests: reenable ToolBasicTest
rfield
parents: 38531
diff changeset
   190
                (a) -> assertStop(a, "while (true) { try { Thread.sleep(100); } catch (InterruptedException ex) { } }", "")
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   191
        );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   192
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   193
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   194
    public void testRerun() {
40588
b5c32bfa9710 8160089: jshell tool: use new double-dash long-form command-line options
rfield
parents: 40516
diff changeset
   195
        test(false, new String[] {"--no-startup"},
48349
3d4e8f5a2a69 8179858: jshell tool: sync nomenclature from reference to online /help
rfield
parents: 47504
diff changeset
   196
                (a) -> assertCommand(a, "/0", "|  No snippet with ID: 0"),
3d4e8f5a2a69 8179858: jshell tool: sync nomenclature from reference to online /help
rfield
parents: 47504
diff changeset
   197
                (a) -> assertCommand(a, "/5", "|  No snippet with ID: 5")
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   198
        );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   199
        String[] codes = new String[] {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   200
                "int a = 0;", // var
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   201
                "class A {}", // class
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   202
                "void f() {}", // method
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   203
                "bool b;", // active failed
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   204
                "void g() { h(); }", // active corralled
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   205
        };
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   206
        List<ReplTest> tests = new ArrayList<>();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   207
        for (String s : codes) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   208
            tests.add((a) -> assertCommand(a, s, null));
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   209
        }
38613
2a8e50869b08 8157953: JShell tests: reenable ToolBasicTest
rfield
parents: 38531
diff changeset
   210
        // Test /1 through /5 -- assure references are correct
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   211
        for (int i = 0; i < codes.length; ++i) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   212
            final int finalI = i;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   213
            Consumer<String> check = (s) -> {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   214
                String[] ss = s.split("\n");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   215
                assertEquals(ss[0], codes[finalI]);
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   216
                assertTrue(ss.length > 1, s);
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   217
            };
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   218
            tests.add((a) -> assertCommandCheckOutput(a, "/" + (finalI + 1), check));
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   219
        }
38613
2a8e50869b08 8157953: JShell tests: reenable ToolBasicTest
rfield
parents: 38531
diff changeset
   220
        // Test /-1 ... note that the snippets added by history must be stepped over
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   221
        for (int i = 0; i < codes.length; ++i) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   222
            final int finalI = i;
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   223
            Consumer<String> check = (s) -> {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   224
                String[] ss = s.split("\n");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   225
                assertEquals(ss[0], codes[codes.length - finalI - 1]);
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   226
                assertTrue(ss.length > 1, s);
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   227
            };
38613
2a8e50869b08 8157953: JShell tests: reenable ToolBasicTest
rfield
parents: 38531
diff changeset
   228
            tests.add((a) -> assertCommandCheckOutput(a, "/-" + (2 * finalI + 1), check));
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   229
        }
38613
2a8e50869b08 8157953: JShell tests: reenable ToolBasicTest
rfield
parents: 38531
diff changeset
   230
        tests.add((a) -> assertCommandCheckOutput(a, "/!", assertStartsWith("int a = 0;")));
40588
b5c32bfa9710 8160089: jshell tool: use new double-dash long-form command-line options
rfield
parents: 40516
diff changeset
   231
        test(false, new String[]{"--no-startup"},
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   232
                tests.toArray(new ReplTest[tests.size()]));
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   233
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   234
34477
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   235
    public void test8142447() {
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   236
        Function<String, BiFunction<String, Integer, ReplTest>> assertRerun = cmd -> (code, assertionCount) ->
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   237
                (a) -> assertCommandCheckOutput(a, cmd, s -> {
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   238
                            String[] ss = s.split("\n");
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   239
                            assertEquals(ss[0], code);
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   240
                            loadVariable(a, "int", "assertionCount", Integer.toString(assertionCount), Integer.toString(assertionCount));
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   241
                        });
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   242
        ReplTest assertVariables = (a) -> assertCommandCheckOutput(a, "/v", assertVariables());
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   243
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   244
        Compiler compiler = new Compiler();
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   245
        Path startup = compiler.getPath("StartupFileOption/startup.txt");
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   246
        compiler.writeToFile(startup, "int assertionCount = 0;\n" + // id: s1
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   247
                "void add(int n) { assertionCount += n; }");
40588
b5c32bfa9710 8160089: jshell tool: use new double-dash long-form command-line options
rfield
parents: 40516
diff changeset
   248
        test(new String[]{"--startup", startup.toString()},
34477
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   249
                (a) -> assertCommand(a, "add(1)", ""), // id: 1
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   250
                (a) -> assertCommandCheckOutput(a, "add(ONE)", s -> assertEquals(s.split("\n")[0], "|  Error:")), // id: e1
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   251
                (a) -> assertVariable(a, "int", "ONE", "1", "1"),
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   252
                assertRerun.apply("/1").apply("add(1)", 2), assertVariables,
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   253
                assertRerun.apply("/e1").apply("add(ONE)", 3), assertVariables,
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   254
                assertRerun.apply("/s1").apply("int assertionCount = 0;", 0), assertVariables
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   255
        );
64001b0533a2 8142447: JShell tool: Command change: re-run n-th command should be re-run by id
rfield
parents: 34475
diff changeset
   256
40588
b5c32bfa9710 8160089: jshell tool: use new double-dash long-form command-line options
rfield
parents: 40516
diff changeset
   257
        test(false, new String[] {"--no-startup"},
48349
3d4e8f5a2a69 8179858: jshell tool: sync nomenclature from reference to online /help
rfield
parents: 47504
diff changeset
   258
                (a) -> assertCommand(a, "/s1", "|  No snippet with ID: s1"),
3d4e8f5a2a69 8179858: jshell tool: sync nomenclature from reference to online /help
rfield
parents: 47504
diff changeset
   259
                (a) -> assertCommand(a, "/1", "|  No snippet with ID: 1"),
3d4e8f5a2a69 8179858: jshell tool: sync nomenclature from reference to online /help
rfield
parents: 47504
diff changeset
   260
                (a) -> assertCommand(a, "/e1", "|  No snippet with ID: e1")
33714
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   261
        );
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   262
    }
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   263
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   264
    public void testClasspathDirectory() {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   265
        Compiler compiler = new Compiler();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   266
        Path outDir = Paths.get("testClasspathDirectory");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   267
        compiler.compile(outDir, "package pkg; public class A { public String toString() { return \"A\"; } }");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   268
        Path classpath = compiler.getPath(outDir);
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   269
        test(
43038
7b8b8750a78e 8165405: jshell tool: /classpath is inconsistent
rfield
parents: 42972
diff changeset
   270
                (a) -> assertCommand(a, "/env --class-path " + classpath,
7b8b8750a78e 8165405: jshell tool: /classpath is inconsistent
rfield
parents: 42972
diff changeset
   271
                        "|  Setting new options and restoring state."),
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   272
                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A")
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   273
        );
40588
b5c32bfa9710 8160089: jshell tool: use new double-dash long-form command-line options
rfield
parents: 40516
diff changeset
   274
        test(new String[] { "--class-path", classpath.toString() },
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   275
                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A")
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   276
        );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   277
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   278
44065
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   279
    public void testEnvInStartUp() {
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   280
        Compiler compiler = new Compiler();
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   281
        Path outDir = Paths.get("testClasspathDirectory");
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   282
        compiler.compile(outDir, "package pkg; public class A { public String toString() { return \"A\"; } }");
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   283
        Path classpath = compiler.getPath(outDir);
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   284
        Path sup = compiler.getPath("startup.jsh");
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   285
        compiler.writeToFile(sup,
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   286
                "int xxx;\n" +
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   287
                "/env -class-path " + classpath + "\n" +
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   288
                "int aaa = 735;\n"
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   289
        );
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   290
        test(
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   291
                (a) -> assertCommand(a, "/set start -retain " + sup, ""),
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   292
                (a) -> assertCommand(a, "/reset",
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   293
                        "|  Resetting state."),
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   294
                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A"),
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   295
                (a) -> assertCommand(a, "aaa", "aaa ==> 735")
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   296
        );
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   297
        test(
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   298
                (a) -> assertCommandOutputContains(a, "/env", "--class-path"),
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   299
                (a) -> assertCommandOutputContains(a, "xxx", "cannot find symbol", "variable xxx"),
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   300
                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A"),
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   301
                (a) -> assertCommand(a, "aaa", "aaa ==> 735")
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   302
        );
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   303
    }
d0a8a4c41c85 8175304: JShell tool: The /reset command hangs after setting a startup script
rfield
parents: 43856
diff changeset
   304
43856
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   305
    private String makeSimpleJar() {
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   306
        Compiler compiler = new Compiler();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   307
        Path outDir = Paths.get("testClasspathJar");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   308
        compiler.compile(outDir, "package pkg; public class A { public String toString() { return \"A\"; } }");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   309
        String jarName = "test.jar";
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   310
        compiler.jar(outDir, jarName, "pkg/A.class");
43856
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   311
        return compiler.getPath(outDir).resolve(jarName).toString();
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   312
    }
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   313
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   314
    public void testClasspathJar() {
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   315
        String jarPath = makeSimpleJar();
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   316
        test(
43038
7b8b8750a78e 8165405: jshell tool: /classpath is inconsistent
rfield
parents: 42972
diff changeset
   317
                (a) -> assertCommand(a, "/env --class-path " + jarPath,
7b8b8750a78e 8165405: jshell tool: /classpath is inconsistent
rfield
parents: 42972
diff changeset
   318
                        "|  Setting new options and restoring state."),
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   319
                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A")
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   320
        );
43856
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   321
        test(new String[] { "--class-path", jarPath },
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   322
                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A")
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   323
        );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   324
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   325
43856
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   326
    public void testClasspathUserHomeExpansion() {
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   327
        String jarPath = makeSimpleJar();
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   328
        String tilde = "~" + File.separator;
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   329
        test(
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   330
                (a) -> assertCommand(a, "/env --class-path " + tilde + "forblato",
45757
1017cd5d6506 8183021: JShell tests: Fix failing tests on Windows
jlahoda
parents: 45215
diff changeset
   331
                        "|  File '" + Paths.get(System.getProperty("user.home"), "forblato").toString()
1017cd5d6506 8183021: JShell tests: Fix failing tests on Windows
jlahoda
parents: 45215
diff changeset
   332
                                + "' for '--class-path' is not found."),
43856
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   333
                (a) -> assertCommand(a, "/env --class-path " + jarPath + File.pathSeparator
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   334
                                                            + tilde + "forblato",
45757
1017cd5d6506 8183021: JShell tests: Fix failing tests on Windows
jlahoda
parents: 45215
diff changeset
   335
                        "|  File '" + Paths.get(System.getProperty("user.home"), "forblato").toString()
1017cd5d6506 8183021: JShell tests: Fix failing tests on Windows
jlahoda
parents: 45215
diff changeset
   336
                                + "' for '--class-path' is not found.")
43856
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   337
        );
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   338
    }
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   339
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   340
    public void testBadClasspath() {
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   341
        String jarPath = makeSimpleJar();
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   342
        Compiler compiler = new Compiler();
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   343
        Path t1 = compiler.getPath("whatever/thing.zip");
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   344
        compiler.writeToFile(t1, "");
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   345
        Path t2 = compiler.getPath("whatever/thing.jmod");
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   346
        compiler.writeToFile(t2, "");
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   347
        test(
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   348
                (a) -> assertCommand(a, "/env --class-path " + t1.toString(),
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   349
                        "|  Invalid '--class-path' argument: " + t1.toString()),
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   350
                (a) -> assertCommand(a, "/env --class-path " + jarPath + File.pathSeparator + t1.toString(),
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   351
                        "|  Invalid '--class-path' argument: " + t1.toString()),
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   352
                (a) -> assertCommand(a, "/env --class-path " + t2.toString(),
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   353
                        "|  Invalid '--class-path' argument: " + t2.toString())
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   354
        );
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   355
    }
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   356
49092
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   357
    private String makeBadSourceJar() {
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   358
        Compiler compiler = new Compiler();
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   359
        Path outDir = Paths.get("testClasspathJar");
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   360
        Path src = compiler.getPath(outDir.resolve("pkg/A.java"));
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   361
        compiler.writeToFile(src, "package pkg; /** \u0086 */public class A { public String toString() { return \"A\"; } }");
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   362
        String jarName = "test.jar";
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   363
        compiler.jar(outDir, jarName, "pkg/A.java");
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   364
        return compiler.getPath(outDir).resolve(jarName).toString();
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   365
    }
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   366
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   367
    public void testBadSourceJarClasspath() {
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   368
        String jarPath = makeBadSourceJar();
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   369
        test(
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   370
                (a) -> assertCommand(a, "/env --class-path " + jarPath,
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   371
                        "|  Setting new options and restoring state."),
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   372
                (a) -> assertCommandOutputStartsWith(a, "new pkg.A();",
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   373
                        "|  Error:\n"
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   374
                        + "|  cannot find symbol\n"
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   375
                        + "|    symbol:   class A")
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   376
        );
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   377
        test(new String[]{"--class-path", jarPath},
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   378
                (a) -> assertCommandOutputStartsWith(a, "new pkg.A();",
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   379
                        "|  Error:\n"
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   380
                        + "|  cannot find symbol\n"
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   381
                        + "|    symbol:   class A")
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   382
        );
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   383
    }
6dc5e0cdb44c 8196133: JShell crashes when attempting to use bad source file in class path
rfield
parents: 48349
diff changeset
   384
41852
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   385
    public void testModulePath() {
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   386
        Compiler compiler = new Compiler();
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   387
        Path modsDir = Paths.get("mods");
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   388
        Path outDir = Paths.get("mods", "org.astro");
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   389
        compiler.compile(outDir, "package org.astro; public class World { public static String name() { return \"world\"; } }");
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   390
        compiler.compile(outDir, "module org.astro { exports org.astro; }");
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   391
        Path modsPath = compiler.getPath(modsDir);
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   392
        test(new String[] { "--module-path", modsPath.toString(), "--add-modules", "org.astro" },
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   393
                (a) -> assertCommand(a, "import org.astro.World;", ""),
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   394
                (a) -> evaluateExpression(a, "String",
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   395
                        "String.format(\"Greetings %s!\", World.name());",
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   396
                        "\"Greetings world!\"")
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   397
        );
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   398
    }
448273b190ad 8166649: jshell tool: missing --add-modules and --module-path
rfield
parents: 41635
diff changeset
   399
43856
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   400
    public void testModulePathUserHomeExpansion() {
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   401
        String tilde = "~" + File.separatorChar;
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   402
        test(
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   403
                (a) -> assertCommand(a, "/env --module-path " + tilde + "snardugol",
45757
1017cd5d6506 8183021: JShell tests: Fix failing tests on Windows
jlahoda
parents: 45215
diff changeset
   404
                        "|  File '" + Paths.get(System.getProperty("user.home"), "snardugol").toString()
1017cd5d6506 8183021: JShell tests: Fix failing tests on Windows
jlahoda
parents: 45215
diff changeset
   405
                                + "' for '--module-path' is not found.")
43856
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   406
        );
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   407
    }
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   408
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   409
    public void testBadModulePath() {
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   410
        Compiler compiler = new Compiler();
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   411
        Path t1 = compiler.getPath("whatever/thing.zip");
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   412
        compiler.writeToFile(t1, "");
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   413
        test(
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   414
                (a) -> assertCommand(a, "/env --module-path " + t1.toString(),
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   415
                        "|  Invalid '--module-path' argument: " + t1.toString())
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   416
        );
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   417
    }
fcdebb803c62 8174797: jshell tool: invalid module path crashes tool
rfield
parents: 43038
diff changeset
   418
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   419
    public void testStartupFileOption() {
42843
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   420
        Compiler compiler = new Compiler();
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   421
        Path startup = compiler.getPath("StartupFileOption/startup.txt");
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   422
        compiler.writeToFile(startup, "class A { public String toString() { return \"A\"; } }");
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   423
        test(new String[]{"--startup", startup.toString()},
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   424
                (a) -> evaluateExpression(a, "A", "new A()", "A")
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   425
        );
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   426
        test(new String[]{"--no-startup"},
42972
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   427
                (a) -> assertCommandCheckOutput(a, "Pattern.compile(\"x+\")", assertStartsWith("|  Error:\n|  cannot find symbol"))
42843
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   428
        );
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   429
        test(
42972
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   430
                (a) -> assertCommand(a, "Pattern.compile(\"x+\")", "$1 ==> x+", "", null, "", "")
42843
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   431
        );
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   432
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   433
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   434
    public void testLoadingFromArgs() {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   435
        Compiler compiler = new Compiler();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   436
        Path path = compiler.getPath("loading.repl");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   437
        compiler.writeToFile(path, "int a = 10; double x = 20; double a = 10;");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   438
        test(new String[] { path.toString() },
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   439
                (a) -> assertCommand(a, "x", "x ==> 20.0"),
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   440
                (a) -> assertCommand(a, "a", "a ==> 10.0")
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   441
        );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   442
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   443
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   444
    public void testReset() {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   445
        test(
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   446
                (a) -> assertReset(a, "/res"),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   447
                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   448
                (a) -> assertVariable(a, "int", "x"),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   449
                (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   450
                (a) -> assertMethod(a, "void f() { }", "()void", "f"),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   451
                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   452
                (a) -> assertClass(a, "class A { }", "class", "A"),
38514
f7df9ab653b0 8153920: jshell tool: allow a parameter on the /vars /methods /classes commands
rfield
parents: 37389
diff changeset
   453
                (a) -> assertCommandCheckOutput(a, "/types", assertClasses()),
33714
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   454
                (a) -> assertImport(a, "import java.util.stream.*;", "", "java.util.stream.*"),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   455
                (a) -> assertCommandCheckOutput(a, "/imports", assertImports()),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   456
                (a) -> assertReset(a, "/reset"),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   457
                (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   458
                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
38514
f7df9ab653b0 8153920: jshell tool: allow a parameter on the /vars /methods /classes commands
rfield
parents: 37389
diff changeset
   459
                (a) -> assertCommandCheckOutput(a, "/types", assertClasses()),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   460
                (a) -> assertCommandCheckOutput(a, "/imports", assertImports())
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   461
        );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   462
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   463
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   464
    public void testOpen() {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   465
        Compiler compiler = new Compiler();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   466
        Path path = compiler.getPath("testOpen.repl");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   467
        compiler.writeToFile(path,
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   468
                "int a = 10;\ndouble x = 20;\ndouble a = 10;\n" +
33714
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   469
                        "class A { public String toString() { return \"A\"; } }\nimport java.util.stream.*;");
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   470
        for (String s : new String[]{"/o", "/open"}) {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   471
            test(
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   472
                    (a) -> assertCommand(a, s + " " + path.toString(), ""),
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   473
                    (a) -> assertCommand(a, "a", "a ==> 10.0"),
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   474
                    (a) -> evaluateExpression(a, "A", "new A();", "A"),
33714
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   475
                    (a) -> evaluateExpression(a, "long", "Stream.of(\"A\").count();", "1"),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   476
                    (a) -> {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   477
                        loadVariable(a, "double", "x", "20.0", "20.0");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   478
                        loadVariable(a, "double", "a", "10.0", "10.0");
33714
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   479
                        loadVariable(a, "A", "$7", "new A();", "A");
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   480
                        loadVariable(a, "long", "$8", "Stream.of(\"A\").count();", "1");
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   481
                        loadClass(a, "class A { public String toString() { return \"A\"; } }",
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   482
                                "class", "A");
33714
8064f484590e 8142384: JShell tool: New command: /imports, /i which show the list of imported packages or classes, etc...
shinyafox
parents: 33362
diff changeset
   483
                        loadImport(a, "import java.util.stream.*;", "", "java.util.stream.*");
38514
f7df9ab653b0 8153920: jshell tool: allow a parameter on the /vars /methods /classes commands
rfield
parents: 37389
diff changeset
   484
                        assertCommandCheckOutput(a, "/types", assertClasses());
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   485
                    },
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   486
                    (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   487
                    (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   488
                    (a) -> assertCommandCheckOutput(a, "/imports", assertImports())
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   489
            );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   490
            Path unknown = compiler.getPath("UNKNOWN.repl");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   491
            test(
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   492
                    (a) -> assertCommand(a, s + " " + unknown,
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   493
                            "|  File '" + unknown + "' for '/open' is not found.")
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   494
            );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   495
        }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   496
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   497
50017
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   498
    public void testOpenLocalFileUrl() {
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   499
        Compiler compiler = new Compiler();
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   500
        Path path = compiler.getPath("testOpen.repl");
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   501
        compiler.writeToFile(path, "int a = 10;int b = 20;int c = a + b;\n");
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   502
        for (String s : new String[]{"/o", "/open"}) {
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   503
            test(
50043
2d1952d4d067 8202690: jdk/jshell/ToolBasicTest.java failed in testOpenFileOverHttp() and testOpenLocalFileUrl()
xyin
parents: 50019
diff changeset
   504
                    (a) -> assertCommand(a, s + " " + path.toUri(), ""),
50017
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   505
                    (a) -> assertCommand(a, "a", "a ==> 10"),
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   506
                    (a) -> assertCommand(a, "b", "b ==> 20"),
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   507
                    (a) -> assertCommand(a, "c", "c ==> 30")
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   508
            );
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   509
        }
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   510
    }
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   511
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   512
    public void testOpenFileOverHttp() throws IOException {
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   513
        var script = "int a = 10;int b = 20;int c = a + b;";
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   514
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   515
        var localhostAddress = new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), 0);
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   516
        var httpServer = HttpServer.create(localhostAddress, 0);
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   517
        try {
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   518
            httpServer.createContext("/script", exchange -> {
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   519
                exchange.sendResponseHeaders(200, script.length());
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   520
                try (var output = exchange.getResponseBody()) {
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   521
                    output.write(script.getBytes());
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   522
                }
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   523
            });
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   524
            httpServer.setExecutor(null);
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   525
            httpServer.start();
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   526
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   527
            var urlAddress = "http:/" + httpServer.getAddress().toString() + "/script";
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   528
            for (String s : new String[]{"/o", "/open"}) {
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   529
                test(
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   530
                        (a) -> assertCommand(a, s + " " + urlAddress, ""),
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   531
                        (a) -> assertCommand(a, "a", "a ==> 10"),
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   532
                        (a) -> assertCommand(a, "b", "b ==> 20"),
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   533
                        (a) -> assertCommand(a, "c", "c ==> 30")
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   534
                );
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   535
            }
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   536
        } finally {
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   537
            httpServer.stop(0);
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   538
        }
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   539
    }
88cc95780b6e 8199912: jshell tool: /open from URI
rfield
parents: 49101
diff changeset
   540
42972
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   541
    public void testOpenResource() {
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   542
        test(
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   543
                (a) -> assertCommand(a, "/open PRINTING", ""),
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   544
                (a) -> assertCommandOutputContains(a, "/list",
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   545
                        "void println", "System.out.printf"),
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   546
                (a) -> assertCommand(a, "printf(\"%4.2f\", Math.PI)",
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   547
                        "", "", null, "3.14", "")
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   548
        );
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   549
    }
47ca49eee534 8172102: jshell tool: remove print method forwarding to System.out from default startup
rfield
parents: 42843
diff changeset
   550
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   551
    public void testSave() throws IOException {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   552
        Compiler compiler = new Compiler();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   553
        Path path = compiler.getPath("testSave.repl");
45215
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   554
        {
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   555
            List<String> list = Arrays.asList(
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   556
                    "int a;",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   557
                    "class A { public String toString() { return \"A\"; } }"
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   558
            );
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   559
            test(
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   560
                    (a) -> assertVariable(a, "int", "a"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   561
                    (a) -> assertCommand(a, "()", null, null, null, "", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   562
                    (a) -> assertClass(a, "class A { public String toString() { return \"A\"; } }", "class", "A"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   563
                    (a) -> assertCommand(a, "/save " + path.toString(), "")
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   564
            );
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   565
            assertEquals(Files.readAllLines(path), list);
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   566
        }
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   567
        {
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   568
            List<String> output = new ArrayList<>();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   569
            test(
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   570
                    (a) -> assertCommand(a, "int a;", null),
34570
8a8f52a733dd 8144095: jshell tool: normalize command parameter handling
rfield
parents: 34481
diff changeset
   571
                    (a) -> assertCommand(a, "()", null, null, null, "", ""),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   572
                    (a) -> assertClass(a, "class A { public String toString() { return \"A\"; } }", "class", "A"),
38520
17e72b872ffd 8157185: jshell tool: ambiguous format -- distinguished arguments should be options
rfield
parents: 38514
diff changeset
   573
                    (a) -> assertCommandCheckOutput(a, "/list -all", (out) ->
45215
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   574
                                    output.addAll(Stream.of(out.split("\n"))
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   575
                            .filter(str -> !str.isEmpty())
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   576
                            .map(str -> str.substring(str.indexOf(':') + 2))
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   577
                            .filter(str -> !str.startsWith("/"))
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   578
                            .collect(Collectors.toList()))),
38520
17e72b872ffd 8157185: jshell tool: ambiguous format -- distinguished arguments should be options
rfield
parents: 38514
diff changeset
   579
                    (a) -> assertCommand(a, "/save -all " + path.toString(), "")
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   580
            );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   581
            assertEquals(Files.readAllLines(path), output);
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   582
        }
45215
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   583
        {
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   584
            List<String> output = new ArrayList<>();
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   585
            test(
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   586
                    (a) -> assertCommand(a, "int a;", null),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   587
                    (a) -> assertCommand(a, "int b;", null),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   588
                    (a) -> assertCommand(a, "int c;", null),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   589
                    (a) -> assertClass(a, "class A { public String toString() { return \"A\"; } }", "class", "A"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   590
                    (a) -> assertCommandCheckOutput(a, "/list b c a A", (out) ->
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   591
                                    output.addAll(Stream.of(out.split("\n"))
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   592
                            .filter(str -> !str.isEmpty())
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   593
                            .map(str -> str.substring(str.indexOf(':') + 2))
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   594
                            .filter(str -> !str.startsWith("/"))
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   595
                            .collect(Collectors.toList()))),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   596
                    (a) -> assertCommand(a, "/save 2-3 1 4 " + path.toString(), "")
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   597
            );
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   598
            assertEquals(Files.readAllLines(path), output);
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   599
        }
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   600
        {
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   601
            List<String> output = new ArrayList<>();
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   602
            test(
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   603
                    (a) -> assertVariable(a, "int", "a"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   604
                    (a) -> assertCommand(a, "()", null, null, null, "", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   605
                    (a) -> assertClass(a, "class A { public String toString() { return \"A\"; } }", "class", "A"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   606
                    (a) -> assertCommandCheckOutput(a, "/history", (out) ->
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   607
                                output.addAll(Stream.of(out.split("\n"))
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   608
                            .filter(str -> !str.isEmpty())
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   609
                            .collect(Collectors.toList()))),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   610
                    (a) -> assertCommand(a, "/save -history " + path.toString(), "")
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   611
            );
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   612
            output.add("/save -history " + path.toString());
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   613
            assertEquals(Files.readAllLines(path), output);
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   614
        }
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   615
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   616
42843
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   617
    public void testStartRetain() {
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   618
        Compiler compiler = new Compiler();
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   619
        Path startUpFile = compiler.getPath("startUp.txt");
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   620
        test(
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   621
                (a) -> assertVariable(a, "int", "a"),
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   622
                (a) -> assertVariable(a, "double", "b", "10", "10.0"),
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   623
                (a) -> assertMethod(a, "void f() {}", "()V", "f"),
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   624
                (a) -> assertImport(a, "import java.util.stream.*;", "", "java.util.stream.*"),
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   625
                (a) -> assertCommand(a, "/save " + startUpFile.toString(), null),
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   626
                (a) -> assertCommand(a, "/set start -retain " + startUpFile.toString(), null)
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   627
        );
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   628
        Path unknown = compiler.getPath("UNKNOWN");
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   629
        test(
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   630
                (a) -> assertCommandOutputStartsWith(a, "/set start -retain " + unknown.toString(),
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   631
                        "|  File '" + unknown + "' for '/set start' is not found.")
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   632
        );
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   633
        test(false, new String[0],
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   634
                (a) -> {
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   635
                    loadVariable(a, "int", "a");
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   636
                    loadVariable(a, "double", "b", "10.0", "10.0");
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   637
                    loadMethod(a, "void f() {}", "()void", "f");
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   638
                    loadImport(a, "import java.util.stream.*;", "", "java.util.stream.*");
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   639
                    assertCommandCheckOutput(a, "/types", assertClasses());
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   640
                },
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   641
                (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   642
                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   643
                (a) -> assertCommandCheckOutput(a, "/imports", assertImports())
a8d83044a192 8170162: jshell tool: no mechanism to programmatically launch
rfield
parents: 41858
diff changeset
   644
        );
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   645
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   646
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   647
    public void testStartSave() throws IOException {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   648
        Compiler compiler = new Compiler();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   649
        Path startSave = compiler.getPath("startSave.txt");
38520
17e72b872ffd 8157185: jshell tool: ambiguous format -- distinguished arguments should be options
rfield
parents: 38514
diff changeset
   650
        test(a -> assertCommand(a, "/save -start " + startSave.toString(), null));
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   651
        List<String> lines = Files.lines(startSave)
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   652
                .filter(s -> !s.isEmpty())
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   653
                .collect(Collectors.toList());
34570
8a8f52a733dd 8144095: jshell tool: normalize command parameter handling
rfield
parents: 34481
diff changeset
   654
        assertEquals(lines, START_UP);
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   655
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   656
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   657
    public void testConstrainedUpdates() {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   658
        test(
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   659
                a -> assertClass(a, "class XYZZY { }", "class", "XYZZY"),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   660
                a -> assertVariable(a, "XYZZY", "xyzzy"),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   661
                a -> assertCommandCheckOutput(a, "import java.util.stream.*",
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   662
                        (out) -> assertTrue(out.trim().isEmpty(), "Expected no output, got: " + out))
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   663
        );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   664
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   665
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   666
    public void testRemoteExit() {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   667
        test(
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   668
                a -> assertVariable(a, "int", "x"),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   669
                a -> assertCommandCheckOutput(a, "/vars", assertVariables()),
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents: 35812
diff changeset
   670
                a -> assertCommandOutputContains(a, "System.exit(5);", "terminated"),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   671
                a -> assertCommandCheckOutput(a, "/vars", s ->
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   672
                        assertTrue(s.trim().isEmpty(), s)),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   673
                a -> assertMethod(a, "void f() { }", "()void", "f"),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   674
                a -> assertCommandCheckOutput(a, "/methods", assertMethods())
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   675
        );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   676
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   677
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   678
    public void testFeedbackNegative() {
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents: 35812
diff changeset
   679
        test(a -> assertCommandCheckOutput(a, "/set feedback aaaa",
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents: 35812
diff changeset
   680
                assertStartsWith("|  Does not match any current feedback mode")));
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   681
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   682
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   683
    public void testFeedbackSilent() {
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   684
        for (String off : new String[]{"s", "silent"}) {
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   685
            test(
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents: 35812
diff changeset
   686
                    a -> assertCommand(a, "/set feedback " + off, ""),
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   687
                    a -> assertCommand(a, "int a", ""),
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   688
                    a -> assertCommand(a, "void f() {}", ""),
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   689
                    a -> assertCommandCheckOutput(a, "aaaa", assertStartsWith("|  Error:")),
41858
5843b57ce3a6 8167643: JShell: silently ignore access modifiers (as semantically irrelevant)
rfield
parents: 41852
diff changeset
   690
                    a -> assertCommandCheckOutput(a, "static void f() {}", assertStartsWith("|  Warning:"))
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   691
            );
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   692
        }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   693
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   694
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   695
    public void testFeedbackNormal() {
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   696
        Compiler compiler = new Compiler();
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   697
        Path testNormalFile = compiler.getPath("testConciseNormal");
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   698
        String[] sources = new String[] {"int a", "void f() {}", "class A {}", "a = 10"};
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   699
        String[] sources2 = new String[] {"int a //again", "void f() {int y = 4;}", "class A {} //again", "a = 10"};
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   700
        String[] output = new String[] {
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   701
                "a ==> 0",
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   702
                "|  created method f()",
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   703
                "|  created class A",
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   704
                "a ==> 10"
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   705
        };
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   706
        compiler.writeToFile(testNormalFile, sources2);
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   707
        for (String feedback : new String[]{"/set fe", "/set feedback"}) {
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   708
            for (String feedbackState : new String[]{"n", "normal"}) {
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   709
                test(
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   710
                        a -> assertCommand(a, feedback + " " + feedbackState, "|  Feedback mode: normal"),
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   711
                        a -> assertCommand(a, sources[0], output[0]),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   712
                        a -> assertCommand(a, sources[1], output[1]),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   713
                        a -> assertCommand(a, sources[2], output[2]),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   714
                        a -> assertCommand(a, sources[3], output[3]),
36494
4175f47b2a50 8148316: jshell tool: Configurable output format
rfield
parents: 35812
diff changeset
   715
                        a -> assertCommand(a, "/o " + testNormalFile.toString(), "")
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   716
                );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   717
            }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   718
        }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   719
    }
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   720
40516
9e0e107c39dd 8154374: JShell: setContextClassLoader() for remote Snippet class loader
rfield
parents: 38836
diff changeset
   721
    public void testVarsWithNotActive() {
9e0e107c39dd 8154374: JShell: setContextClassLoader() for remote Snippet class loader
rfield
parents: 38836
diff changeset
   722
        test(
9e0e107c39dd 8154374: JShell: setContextClassLoader() for remote Snippet class loader
rfield
parents: 38836
diff changeset
   723
                a -> assertVariable(a, "Blath", "x"),
9e0e107c39dd 8154374: JShell: setContextClassLoader() for remote Snippet class loader
rfield
parents: 38836
diff changeset
   724
                a -> assertCommandOutputContains(a, "/var -all", "(not-active)")
9e0e107c39dd 8154374: JShell: setContextClassLoader() for remote Snippet class loader
rfield
parents: 38836
diff changeset
   725
        );
9e0e107c39dd 8154374: JShell: setContextClassLoader() for remote Snippet class loader
rfield
parents: 38836
diff changeset
   726
    }
9e0e107c39dd 8154374: JShell: setContextClassLoader() for remote Snippet class loader
rfield
parents: 38836
diff changeset
   727
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   728
    public void testHistoryReference() {
40588
b5c32bfa9710 8160089: jshell tool: use new double-dash long-form command-line options
rfield
parents: 40516
diff changeset
   729
        test(false, new String[]{"--no-startup"},
48939
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   730
                a -> assertCommand(a, "System.err.println(99)", "", "", null, "", "99\n"),
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   731
                a -> assertCommand(a, "/exit", "")
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   732
        );
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   733
        test(false, new String[]{"--no-startup"},
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   734
                a -> assertCommand(a, "System.err.println(1)", "", "", null, "", "1\n"),
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   735
                a -> assertCommand(a, "System.err.println(2)", "", "", null, "", "2\n"),
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   736
                a -> assertCommand(a, "/-2", "System.err.println(1)", "", null, "", "1\n"),
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   737
                a -> assertCommand(a, "/history",
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   738
                                                    "/debug 0\n" +
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   739
                                                    "System.err.println(1)\n" +
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   740
                                                    "System.err.println(2)\n" +
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   741
                                                    "System.err.println(1)\n" +
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   742
                                                    "/history\n"),
48939
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   743
                a -> assertCommand(a, "/history -all",
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   744
                                                    "/debug 0\n" +
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   745
                                                    "System.err.println(99)\n" +
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   746
                                                    "/exit\n" +
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   747
                                                    "/debug 0\n" +
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   748
                                                    "System.err.println(1)\n" +
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   749
                                                    "System.err.println(2)\n" +
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   750
                                                    "System.err.println(1)\n" +
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   751
                                                    "/history\n" +
ba545e52b932 8166232: jshell tool: cannot access previous history
rfield
parents: 48349
diff changeset
   752
                                                    "/history -all\n"),
37389
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   753
                a -> assertCommand(a, "/-2", "System.err.println(2)", "", null, "", "2\n"),
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   754
                a -> assertCommand(a, "/!", "System.err.println(2)", "", null, "", "2\n"),
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   755
                a -> assertCommand(a, "/2", "System.err.println(2)", "", null, "", "2\n"),
9c137b83a8b8 8143955: JShell tool (UX): Output structure
rfield
parents: 37007
diff changeset
   756
                a -> assertCommand(a, "/1", "System.err.println(1)", "", null, "", "1\n")
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   757
        );
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   758
    }
34475
7af94fd75ede 8143037: JShell should determine commands by prefix
jlahoda
parents: 33918
diff changeset
   759
45215
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   760
    public void testRerunIdRange() {
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   761
        Compiler compiler = new Compiler();
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   762
        Path startup = compiler.getPath("rangeStartup");
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   763
        String[] startupSources = new String[] {
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   764
            "boolean go = false",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   765
            "void println(String s) { if (go) System.out.println(s); }",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   766
            "void println(int i) { if (go) System.out.println(i); }",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   767
            "println(\"s4\")",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   768
            "println(\"s5\")",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   769
            "println(\"s6\")"
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   770
        };
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   771
        String[] sources = new String[] {
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   772
            "frog",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   773
            "go = true",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   774
            "println(2)",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   775
            "println(3)",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   776
            "println(4)",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   777
            "querty"
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   778
        };
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   779
        compiler.writeToFile(startup, startupSources);
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   780
        test(false, new String[]{"--startup", startup.toString()},
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   781
                a -> assertCommandOutputStartsWith(a, sources[0], "|  Error:"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   782
                a -> assertCommand(a, sources[1], "go ==> true", "", null, "", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   783
                a -> assertCommand(a, sources[2], "", "", null, "2\n", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   784
                a -> assertCommand(a, sources[3], "", "", null, "3\n", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   785
                a -> assertCommand(a, sources[4], "", "", null, "4\n", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   786
                a -> assertCommandOutputStartsWith(a, sources[5], "|  Error:"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   787
                a -> assertCommand(a, "/3", "println(3)", "", null, "3\n", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   788
                a -> assertCommand(a, "/s4", "println(\"s4\")", "", null, "s4\n", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   789
                a -> assertCommandOutputStartsWith(a, "/e1", "frog\n|  Error:"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   790
                a -> assertCommand(a, "/2-4",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   791
                        "println(2)\nprintln(3)\nprintln(4)",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   792
                        "", null, "2\n3\n4\n", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   793
                a -> assertCommand(a, "/s4-s6",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   794
                        startupSources[3] + "\n" +startupSources[4] + "\n" +startupSources[5],
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   795
                        "", null, "s4\ns5\ns6\n", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   796
                a -> assertCommand(a, "/s4-4", null,
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   797
                        "", null, "s4\ns5\ns6\n2\n3\n4\n", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   798
                a -> assertCommandCheckOutput(a, "/e1-e2",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   799
                        s -> {
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   800
                            assertTrue(s.trim().startsWith("frog\n|  Error:"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   801
                                    "Output: \'" + s + "' does not start with: " + "|  Error:");
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   802
                            assertTrue(s.trim().lastIndexOf("|  Error:") > 10,
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   803
                                    "Output: \'" + s + "' does not have second: " + "|  Error:");
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   804
                        }),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   805
                a -> assertCommand(a, "/4  s4 2",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   806
                        "println(4)\nprintln(\"s4\")\nprintln(2)",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   807
                        "", null, "4\ns4\n2\n", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   808
                a -> assertCommand(a, "/s5 2-4 3",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   809
                        "println(\"s5\")\nprintln(2)\nprintln(3)\nprintln(4)\nprintln(3)",
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   810
                        "", null, "s5\n2\n3\n4\n3\n", ""),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   811
                a -> assertCommand(a, "/2 ff", "|  No such snippet: ff"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   812
                a -> assertCommand(a, "/4-2", "|  End of snippet range less than start: 4 - 2"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   813
                a -> assertCommand(a, "/s5-s3", "|  End of snippet range less than start: s5 - s3"),
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   814
                a -> assertCommand(a, "/4-s5", "|  End of snippet range less than start: 4 - s5")
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   815
        );
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   816
    }
c9477e22877f 8167554: jshell tool: re-execute a range and/or sequence of snippets
rfield
parents: 44065
diff changeset
   817
38836
b09d1cfbf28c 8131029: JShell: recover from VMConnection launch failure
rfield
parents: 38613
diff changeset
   818
    @Test(enabled = false) // TODO 8158197
38531
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   819
    public void testHeadlessEditPad() {
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   820
        String prevHeadless = System.getProperty("java.awt.headless");
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   821
        try {
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   822
            System.setProperty("java.awt.headless", "true");
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   823
            test(
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   824
                (a) -> assertCommandOutputStartsWith(a, "/edit printf", "|  Cannot launch editor -- unexpected exception:")
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   825
            );
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   826
        } finally {
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   827
            System.setProperty("java.awt.headless", prevHeadless==null? "false" : prevHeadless);
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   828
        }
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   829
    }
c449daa25b45 8157200: jshell tool: Add /retain command to persist settings
rfield
parents: 38520
diff changeset
   830
41248
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   831
    public void testAddExports() {
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   832
        test(false, new String[]{"--no-startup"},
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   833
                a -> assertCommandOutputStartsWith(a, "import jdk.internal.misc.VM;", "|  Error:")
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   834
        );
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   835
        test(false, new String[]{"--no-startup",
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   836
            "-R--add-exports", "-Rjava.base/jdk.internal.misc=ALL-UNNAMED",
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   837
            "-C--add-exports", "-Cjava.base/jdk.internal.misc=ALL-UNNAMED"},
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   838
                a -> assertImport(a, "import jdk.internal.misc.VM;", "", "jdk.internal.misc.VM"),
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   839
                a -> assertCommand(a, "System.err.println(VM.isBooted())", "", "", null, "", "true\n")
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   840
        );
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   841
        test(false, new String[]{"--no-startup", "--add-exports", "java.base/jdk.internal.misc"},
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   842
                a -> assertImport(a, "import jdk.internal.misc.VM;", "", "jdk.internal.misc.VM"),
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   843
                a -> assertCommand(a, "System.err.println(VM.isBooted())", "", "", null, "", "true\n")
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   844
        );
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   845
    }
2a3e74c5ad8a 8154714: jshell tool: add exports support
shinyafox
parents: 40588
diff changeset
   846
33362
65ec6de1d6b4 8134254: JShell API/tool: REPL for Java into JDK9
jlahoda
parents:
diff changeset
   847
}