/* * Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
publicvoid testRerun() {
test(false, new String[] {"--no-startup"},
(a) -> assertCommand(a, "/0", "| No snippet with ID: 0"),
(a) -> assertCommand(a, "/5", "| No snippet with ID: 5")
);
String[] codes = new String[] { "int a = 0;", // var "class A {}", // class "void f() {}", // method "bool b;", // active failed "void g() { h(); }", // active corralled
};
List<ReplTest> tests = new ArrayList<>(); for (String s : codes) {
tests.add((a) -> assertCommand(a, s, null));
} // Test /1 through /5 -- assure references are correct for (int i = 0; i < codes.length; ++i) { finalint finalI = i;
Consumer<String> check = (s) -> {
String[] ss = s.split("\n");
assertEquals(ss[0], codes[finalI]);
assertTrue(ss.length > 1, s);
};
tests.add((a) -> assertCommandCheckOutput(a, "/" + (finalI + 1), check));
} // Test /-1 ... note that the snippets added by history must be stepped over for (int i = 0; i < codes.length; ++i) { finalint finalI = i;
Consumer<String> check = (s) -> {
String[] ss = s.split("\n");
assertEquals(ss[0], codes[codes.length - finalI - 1]);
assertTrue(ss.length > 1, s);
};
tests.add((a) -> assertCommandCheckOutput(a, "/-" + (2 * finalI + 1), check));
}
tests.add((a) -> assertCommandCheckOutput(a, "/!", assertStartsWith("int a = 0;")));
test(false, new String[]{"--no-startup"},
tests.toArray(new ReplTest[tests.size()]));
}
publicvoid testConstrainedUpdates() {
test(
a -> assertClass(a, "class XYZZY { }", "class", "XYZZY"),
a -> assertVariable(a, "XYZZY", "xyzzy"),
a -> assertCommandCheckOutput(a, "import java.util.stream.*",
(out) -> assertTrue(out.trim().isEmpty(), "Expected no output, got: " + out))
);
}
publicvoid testRemoteExit() {
test(
a -> assertVariable(a, "int", "x"),
a -> assertCommandCheckOutput(a, "/vars", assertVariables()),
a -> assertCommandOutputContains(a, "System.exit(5);", "terminated"),
a -> assertCommandCheckOutput(a, "/vars", s ->
assertTrue(s.trim().isEmpty(), s)),
a -> assertMethod(a, "void f() { }", "()void", "f"),
a -> assertCommandCheckOutput(a, "/methods", assertMethods())
);
}
publicvoid testFeedbackNegative() {
test(a -> assertCommandCheckOutput(a, "/set feedback aaaa",
assertStartsWith("| Does not match any current feedback mode")));
}
publicvoid testFeedbackSilent() { for (String off : new String[]{"s", "silent"}) {
test(
a -> assertCommand(a, "/set feedback " + off, ""),
a -> assertCommand(a, "int a", ""),
a -> assertCommand(a, "void f() {}", ""),
a -> assertCommandCheckOutput(a, "aaaa", assertStartsWith("| Error:"))
);
}
}
publicvoid testFeedbackNormal() {
Compiler compiler = new Compiler();
Path testNormalFile = compiler.getPath("testConciseNormal");
String[] sources = new String[] {"int a", "void f() {}", "class A {}", "a = 10"};
String[] sources2 = new String[] {"int a //again", "void f() {int y = 4;}", "class A {} //again", "a = 10"};
String[] output = new String[] { "a ==> 0", "| created method f()", "| created class A", "a ==> 10"
};
compiler.writeToFile(testNormalFile, sources2); for (String feedback : new String[]{"/set fe", "/set feedback"}) { for (String feedbackState : new String[]{"n", "normal"}) {
test(
a -> assertCommand(a, feedback + " " + feedbackState, "| Feedback mode: normal"),
a -> assertCommand(a, sources[0], output[0]),
a -> assertCommand(a, sources[1], output[1]),
a -> assertCommand(a, sources[2], output[2]),
a -> assertCommand(a, sources[3], output[3]),
a -> assertCommand(a, "/o " + testNormalFile.toString(), "")
);
}
}
}
publicvoid testVarsWithNotActive() {
test(
a -> assertVariable(a, "Blath", "x"),
a -> assertCommandOutputContains(a, "/var -all", "(not-active)")
);
}
publicvoid testHistoryReference() {
test(false, new String[]{"--no-startup"},
a -> assertCommand(a, "System.err.println(99)", "", "", null, "", "99\n"),
a -> assertCommand(a, "/exit", "")
);
test(false, new String[]{"--no-startup"},
a -> assertCommand(a, "System.err.println(1)", "", "", null, "", "1\n"),
a -> assertCommand(a, "System.err.println(2)", "", "", null, "", "2\n"),
a -> assertCommand(a, "/-2", "System.err.println(1)", "", null, "", "1\n"),
a -> assertCommand(a, "/history", "/debug 0\n" + "System.err.println(1)\n" + "System.err.println(2)\n" + "System.err.println(1)\n" + "/history\n"),
a -> assertCommand(a, "/history -all", "/debug 0\n" + "System.err.println(99)\n" + "/exit\n" + "/debug 0\n" + "System.err.println(1)\n" + "System.err.println(2)\n" + "System.err.println(1)\n" + "/history\n" + "/history -all\n"),
a -> assertCommand(a, "/-2", "System.err.println(2)", "", null, "", "2\n"),
a -> assertCommand(a, "/!", "System.err.println(2)", "", null, "", "2\n"),
a -> assertCommand(a, "/2", "System.err.println(2)", "", null, "", "2\n"),
a -> assertCommand(a, "/1", "System.err.println(1)", "", null, "", "1\n")
);
}
publicvoid testRerunIdRange() {
Compiler compiler = new Compiler();
Path startup = compiler.getPath("rangeStartup");
String[] startupSources = new String[] { "boolean go = false", "void println(String s) { if (go) System.out.println(s); }", "void println(int i) { if (go) System.out.println(i); }", "println(\"s4\")", "println(\"s5\")", "println(\"s6\")"
};
String[] sources = new String[] { "frog", "go = true", "println(2)", "println(3)", "println(4)", "querty"
};
compiler.writeToFile(startup, startupSources);
test(false, new String[]{"--startup", startup.toString()},
a -> assertCommandOutputStartsWith(a, sources[0], "| Error:"),
a -> assertCommand(a, sources[1], "go ==> true", "", null, "", ""),
a -> assertCommand(a, sources[2], "", "", null, "2\n", ""),
a -> assertCommand(a, sources[3], "", "", null, "3\n", ""),
a -> assertCommand(a, sources[4], "", "", null, "4\n", ""),
a -> assertCommandOutputStartsWith(a, sources[5], "| Error:"),
a -> assertCommand(a, "/3", "println(3)", "", null, "3\n", ""),
a -> assertCommand(a, "/s4", "println(\"s4\")", "", null, "s4\n", ""),
a -> assertCommandOutputStartsWith(a, "/e1", "frog\n| Error:"),
a -> assertCommand(a, "/2-4", "println(2)\nprintln(3)\nprintln(4)", "", null, "2\n3\n4\n", ""),
a -> assertCommand(a, "/s4-s6",
startupSources[3] + "\n" +startupSources[4] + "\n" +startupSources[5], "", null, "s4\ns5\ns6\n", ""),
a -> assertCommand(a, "/s4-4", null, "", null, "s4\ns5\ns6\n2\n3\n4\n", ""),
a -> assertCommandCheckOutput(a, "/e1-e2",
s -> {
assertTrue(s.trim().startsWith("frog\n| Error:"), "Output: \'" + s + "' does not start with: " + "| Error:");
assertTrue(s.trim().lastIndexOf("| Error:") > 10, "Output: \'" + s + "' does not have second: " + "| Error:");
}),
a -> assertCommand(a, "/4 s4 2", "println(4)\nprintln(\"s4\")\nprintln(2)", "", null, "4\ns4\n2\n", ""),
a -> assertCommand(a, "/s5 2-4 3", "println(\"s5\")\nprintln(2)\nprintln(3)\nprintln(4)\nprintln(3)", "", null, "s5\n2\n3\n4\n3\n", ""),
a -> assertCommand(a, "/2 ff", "| No such snippet: ff"),
a -> assertCommand(a, "/4-2", "| End of snippet range less than start: 4 - 2"),
a -> assertCommand(a, "/s5-s3", "| End of snippet range less than start: s5 - s3"),
a -> assertCommand(a, "/4-s5", "| End of snippet range less than start: 4 - s5")
);
}
publicvoid testAddExports() {
test(false, new String[]{"--no-startup"},
a -> assertCommandOutputStartsWith(a, "import jdk.internal.misc.VM;", "| Error:")
);
test(false, new String[]{"--no-startup", "-R--add-exports", "-Rjava.base/jdk.internal.misc=ALL-UNNAMED", "-C--add-exports", "-Cjava.base/jdk.internal.misc=ALL-UNNAMED"},
a -> assertImport(a, "import jdk.internal.misc.VM;", "", "jdk.internal.misc.VM"),
a -> assertCommand(a, "System.err.println(VM.isBooted())", "", "", null, "", "true\n")
);
test(false, new String[]{"--no-startup", "--add-exports", "java.base/jdk.internal.misc"},
a -> assertImport(a, "import jdk.internal.misc.VM;", "", "jdk.internal.misc.VM"),
a -> assertCommand(a, "System.err.println(VM.isBooted())", "", "", null, "", "true\n")
);
}
publicvoid testRedeclareVariableNoInit() {
test(
a -> assertCommand(a, "Integer a;", "a ==> null"),
a -> assertCommand(a, "a instanceof Integer;", "$2 ==> false"),
a -> assertCommand(a, "a = 1;", "a ==> 1"),
a -> assertCommand(a, "Integer a;", "a ==> null"),
a -> assertCommand(a, "a instanceof Integer;", "$5 ==> false"),
a -> assertCommand(a, "a", "a ==> null")
);
}
publicvoid testWarningUnchecked() { //8223688
test(false, new String[]{"--no-startup"},
a -> assertCommand(a, "abstract class A { A(T t){} }", "| created class A"),
a -> assertCommandCheckOutput(a, "new A(\"\") {}", s -> {
assertStartsWith("| Warning:");
assertTrue(s.contains("unchecked call"));
assertFalse(s.contains("Exception"));
})
);
}
publicvoid testIndent() { //8223688
prefsMap.remove("INDENT");
test(false, new String[]{"--no-startup"},
a -> assertCommand(a, "/set indent", "| /set indent 4"),
a -> assertCommand(a, "/set indent 2", "| Indent level set to: 2"),
a -> assertCommand(a, "/set indent", "| /set indent 2"),
a -> assertCommand(a, "/set indent broken", "| Invalid indent level: broken"),
a -> assertCommandOutputContains(a, "/set", "| /set indent 2")
);
}