From 2d15a851e4b8350de24c9c53e8de6b1cd7848484 Mon Sep 17 00:00:00 2001 From: Tomas Hofman Date: Tue, 30 Aug 2016 17:16:35 +0200 Subject: [PATCH] [AESH-400] Not displaying all possibilities for completion clears the buffer --- .../jboss/aesh/readline/actions/Complete.java | 12 ++-- .../completion/CompletionConsoleTest.java | 58 +++++++++++++++++++ 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jboss/aesh/readline/actions/Complete.java b/src/main/java/org/jboss/aesh/readline/actions/Complete.java index 94aa1904a..7521e86d8 100644 --- a/src/main/java/org/jboss/aesh/readline/actions/Complete.java +++ b/src/main/java/org/jboss/aesh/readline/actions/Complete.java @@ -20,6 +20,7 @@ package org.jboss.aesh.readline.actions; import org.jboss.aesh.console.Config; +import org.jboss.aesh.console.ConsoleBuffer; import org.jboss.aesh.console.InputProcessor; import org.jboss.aesh.readline.Action; import org.jboss.aesh.readline.ActionEvent; @@ -49,11 +50,12 @@ public void apply(InputProcessor inputProcessor) { } else { inputProcessor.getCompleter().setAskDisplayCompletion(false); - inputProcessor.getBuffer().getUndoManager().clear(); - inputProcessor.getBuffer().out().print(Config.getLineSeparator()); - inputProcessor.clearBufferAndDisplayPrompt(); - inputProcessor.getBuffer().drawLine(); - inputProcessor.getBuffer().moveCursor(inputProcessor.getBuffer().getBuffer().getMultiCursor()); + ConsoleBuffer buffer = inputProcessor.getBuffer(); + buffer.getUndoManager().clear(); + buffer.out().print(Config.getLineSeparator()); + buffer.displayPrompt(); + buffer.out().print(buffer.getBuffer().getLine()); + buffer.moveCursor(buffer.getBuffer().getMultiCursor()); } } else { diff --git a/src/test/java/org/jboss/aesh/console/completion/CompletionConsoleTest.java b/src/test/java/org/jboss/aesh/console/completion/CompletionConsoleTest.java index 5584ac59a..e1716e458 100644 --- a/src/test/java/org/jboss/aesh/console/completion/CompletionConsoleTest.java +++ b/src/test/java/org/jboss/aesh/console/completion/CompletionConsoleTest.java @@ -43,6 +43,7 @@ import org.jboss.aesh.console.Config; import org.jboss.aesh.console.Console; import org.jboss.aesh.console.ConsoleOperation; +import org.jboss.aesh.console.Prompt; import org.jboss.aesh.console.command.Command; import org.jboss.aesh.console.settings.Settings; import org.jboss.aesh.console.settings.SettingsBuilder; @@ -345,6 +346,63 @@ else if(co.getBuffer().endsWith(" -")) { console.stop(); } + @Test + public void askDisplayCompletion() throws Exception { + Completion completion = new Completion() { + @Override + public void complete(CompleteOperation co) { + if(co.getBuffer().equals("file")) { + for (int i = 0; i < 105; i++) { + co.addCompletionCandidate("file" + i); + } + } + } + }; + + PipedOutputStream outputStream = new PipedOutputStream(); + PipedInputStream pipedInputStream = new PipedInputStream(outputStream); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + + Settings settings = new SettingsBuilder() + .inputStream(pipedInputStream) + .outputStream(new PrintStream(byteArrayOutputStream)) + .logging(true) + .create(); + + Console console = new Console(settings); + + console.addCompletion(completion); + + console.setConsoleCallback(new CompletionConsoleCallback2(console)); + console.setPrompt(new Prompt("# ")); + console.start(); + + try { + outputStream.write("file".getBytes()); + outputStream.write(completeChar.getFirstValue()); + outputStream.flush(); + Thread.sleep(200); + + assertEquals("file", console.getBuffer()); + assertEquals("Display all 105 possibilities? (y or n)", getLastOutputLine(byteArrayOutputStream)); + + outputStream.write("n".getBytes()); + outputStream.flush(); + + Thread.sleep(200); + + assertEquals("file", console.getBuffer()); + } finally { + console.stop(); + } + } + + String getLastOutputLine(ByteArrayOutputStream os) { + String output = new String(os.toByteArray()); + String[] lines = output.split("\n"); + return lines[lines.length - 1]; + } + class CompletionConsoleCallback extends AeshConsoleCallback { private transient int count = 0; final Console console;