8161969: jshell tool: /var value is not truncated per feedback setting

8166637: jshell tool: confusing truncation of long result values
8154513: JShell tool: welcome message should match feedback mode
8167552: jshell tool: Typo in jshell command '/? /reload' description

Reviewed-by: jlahoda
This commit is contained in:
Robert Field 2016-11-03 09:12:02 -07:00
parent 3d46ad34e0
commit 836024d6f9
6 changed files with 65 additions and 45 deletions

View File

@ -116,6 +116,10 @@ class Feedback {
name, type, value, unresolved, errorLines);
}
public String truncateVarValue(String value) {
return mode.truncateVarValue(value);
}
public String getPrompt(String nextId) {
return mode.getPrompt(nextId);
}
@ -416,6 +420,45 @@ class Feedback {
return sb.toString();
}
String truncateVarValue(String value) {
return truncateValue(value,
bits(FormatCase.VARVALUE, FormatAction.ADDED,
FormatWhen.PRIMARY, FormatResolve.OK,
FormatUnresolved.UNRESOLVED0, FormatErrors.ERROR0));
}
String truncateValue(String value, long bits) {
if (value==null) {
return "";
} else {
// Retrieve the truncation length
String truncField = format(TRUNCATION_FIELD, bits);
if (truncField.isEmpty()) {
// No truncation set, use whole value
return value;
} else {
// Convert truncation length to int
// this is safe since it has been tested before it is set
int trunc = Integer.parseUnsignedInt(truncField);
int len = value.length();
if (len > trunc) {
if (trunc <= 13) {
// Very short truncations have no room for "..."
return value.substring(0, trunc);
} else {
// Normal truncation, make total length equal truncation length
int endLen = trunc / 3;
int startLen = trunc - 5 - endLen;
return value.substring(0, startLen) + " ... " + value.substring(len -endLen);
}
} else {
// Within truncation length, use whole value
return value;
}
}
}
}
// Compute the display output given full context and values
String format(FormatCase fc, FormatAction fa, FormatWhen fw,
FormatResolve fr, FormatUnresolved fu, FormatErrors fe,
@ -425,33 +468,7 @@ class Feedback {
String fname = name==null? "" : name;
String ftype = type==null? "" : type;
// Compute the representation of value
String fvalue;
if (value==null) {
fvalue = "";
} else {
// Retrieve the truncation length
String truncField = format(TRUNCATION_FIELD, bits);
if (truncField.isEmpty()) {
// No truncation set, use whole value
fvalue = value;
} else {
// Convert truncation length to int
// this is safe since it has been tested before it is set
int trunc = Integer.parseUnsignedInt(truncField);
if (value.length() > trunc) {
if (trunc <= 5) {
// Very short truncations have no room for "..."
fvalue = value.substring(0, trunc);
} else {
// Normal truncation, make total length equal truncation length
fvalue = value.substring(0, trunc - 4) + " ...";
}
} else {
// Within truncation length, use whole value
fvalue = value;
}
}
}
String fvalue = truncateValue(value, bits);
String funresolved = unresolved==null? "" : unresolved;
String errors = errorLines.stream()
.map(el -> String.format(

View File

@ -526,7 +526,7 @@ public class JShellTool implements MessageHandler {
runFile(loadFile, "jshell");
}
if (regenerateOnDeath) {
if (regenerateOnDeath && feedback.shouldDisplayCommandFluff()) {
hardmsg("jshell.msg.welcome", version());
}
@ -2240,7 +2240,7 @@ public class JShellTool implements MessageHandler {
stream.forEachOrdered(vk ->
{
String val = state.status(vk) == Status.VALID
? state.varValue(vk)
? feedback.truncateVarValue(state.varValue(vk))
: getResourceString("jshell.msg.vars.not.active");
hard(" %s %s = %s", vk.typeName(), vk.name(), val);
});

View File

@ -338,7 +338,7 @@ and any /drop or /classpath commands in the order they were entered.\n\
Reset and replay the valid history between the previous and most\n\t\
recent time that jshell was entered, or a /reset, or /reload\n\t\
command was executed. This can thus be used to restore a previous\n\t\
jshell tool sesson.\n\n\
jshell tool session.\n\n\
/reload [-restore] -quiet\n\t\
With the '-quiet' argument the replay is not shown. Errors will display.

View File

@ -23,7 +23,7 @@
/*
* @test
* @bug 8148316 8148317 8151755 8152246 8153551 8154812 8157261 8163840
* @bug 8148316 8148317 8151755 8152246 8153551 8154812 8157261 8163840 8166637 8161969
* @summary Tests for output customization
* @library /tools/lib
* @modules jdk.compiler/com.sun.tools.javac.api
@ -220,8 +220,8 @@ public class ToolFormatTest extends ReplToolTesting {
test(
(a) -> assertCommandOutputStartsWith(a, "/set feedback normal", ""),
(a) -> assertCommand(a, "String s = java.util.stream.IntStream.range(65, 74)"+
".mapToObj(i -> \"\"+(char)i).reduce((a,b) -> a + b + a).get()",
"s ==> \"ABACABADABACABAEABACABADABACABAFABACABADABACABAEABACABADABACABAGABACABADABA ..."),
".mapToObj(i -> \"\"+(char)i).reduce((a,b) -> a + b + a).get() + \"XYZ\"",
"s ==> \"ABACABADABACABAEABACABADABACABAFABACABADABACABAE ... BACABAEABACABADABACABAXYZ\""),
(a) -> assertCommandOutputStartsWith(a, "/set mode test -quiet", ""),
(a) -> assertCommandOutputStartsWith(a, "/set feedback test", ""),
(a) -> assertCommand(a, "/set format test display '{type}:{value}' primary", ""),
@ -234,8 +234,9 @@ public class ToolFormatTest extends ReplToolTesting {
"/set truncation test 10 varvalue"),
(a) -> assertCommandOutputContains(a, "/set truncation test",
"/set truncation test 10 varvalue"),
(a) -> assertCommand(a, "String r = s", "String:\"ABACABADABACABA ..."),
(a) -> assertCommand(a, "r", "String:\"ABACA ..."),
(a) -> assertCommand(a, "/var", "| String s = \"ABACABADA"),
(a) -> assertCommand(a, "String r = s", "String:\"ABACABAD ... BAXYZ\""),
(a) -> assertCommand(a, "r", "String:\"ABACABADA"),
(a) -> assertCommand(a, "r=s", "String:\"AB")
);
} finally {

View File

@ -23,13 +23,14 @@
/*
* @test
* @bug 8157200 8163840
* @bug 8157200 8163840 8154513
* @summary Tests of what information is retained across jshell tool runs
* @modules jdk.jshell/jdk.internal.jshell.tool
* @build ToolRetainTest ReplToolTesting
* @run testng ToolRetainTest
*/
import java.util.Locale;
import org.testng.annotations.Test;
@Test
@ -62,14 +63,14 @@ public class ToolRetainTest extends ReplToolTesting {
(a) -> assertCommand(a, "/set mode -retain trm1", ""),
(a) -> assertCommand(a, "/exit", "")
);
test(
test(Locale.ROOT, true, new String[0], "",
(a) -> assertCommand(a, "/set mode trm2 -quiet", ""),
(a) -> assertCommand(a, "/set format trm2 display '{name}={value}'", ""),
(a) -> assertCommand(a, "int x = 45", "x:45"),
(a) -> assertCommand(a, "/set mode -retain trm2", ""),
(a) -> assertCommand(a, "/exit", "")
);
test(
test(Locale.ROOT, true, new String[0], "",
(a) -> assertCommandOutputContains(a, "/set mode trm1",
"/set format trm1 display \"{name}:{value}\""),
(a) -> assertCommand(a, "/set format trm2 display",

View File

@ -23,7 +23,7 @@
/*
* @test
* @bug 8153716 8143955 8151754 8150382 8153920 8156910 8131024 8160089 8153897 8167128
* @bug 8153716 8143955 8151754 8150382 8153920 8156910 8131024 8160089 8153897 8167128 8154513
* @summary Simple jshell tool tests
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.main
@ -35,6 +35,7 @@
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ -465,14 +466,14 @@ public class ToolSimpleTest extends ReplToolTesting {
}
public void testOptionQ() {
test(new String[]{"-q", "--no-startup"},
test(Locale.ROOT, false, new String[]{"-q", "--no-startup"}, "",
(a) -> assertCommand(a, "1+1", "$1 ==> 2"),
(a) -> assertCommand(a, "int x = 5", "")
);
}
public void testOptionS() {
test(new String[]{"-s", "--no-startup"},
test(Locale.ROOT, false, new String[]{"-s", "--no-startup"}, "",
(a) -> assertCommand(a, "1+1", "")
);
}
@ -486,7 +487,7 @@ public class ToolSimpleTest extends ReplToolTesting {
}
public void testOptionFeedback() {
test(new String[]{"--feedback", "concise", "--no-startup"},
test(Locale.ROOT, false, new String[]{"--feedback", "concise", "--no-startup"}, "",
(a) -> assertCommand(a, "1+1", "$1 ==> 2"),
(a) -> assertCommand(a, "int x = 5", "")
);
@ -498,17 +499,17 @@ public class ToolSimpleTest extends ReplToolTesting {
.filter(l -> !l.isEmpty())
.count(), "Expected no lines: " + s);
};
test(new String[]{"-nq"},
test(Locale.ROOT, false, new String[]{"-nq"}, "",
(a) -> assertCommandCheckOutput(a, "/list -all", confirmNoStartup),
(a) -> assertCommand(a, "1+1", "$1 ==> 2"),
(a) -> assertCommand(a, "int x = 5", "")
);
test(new String[]{"-qn"},
test(Locale.ROOT, false, new String[]{"-qn"}, "",
(a) -> assertCommandCheckOutput(a, "/list -all", confirmNoStartup),
(a) -> assertCommand(a, "1+1", "$1 ==> 2"),
(a) -> assertCommand(a, "int x = 5", "")
);
test(new String[]{"-ns"},
test(Locale.ROOT, false, new String[]{"-ns"}, "",
(a) -> assertCommandCheckOutput(a, "/list -all", confirmNoStartup),
(a) -> assertCommand(a, "1+1", "")
);