diff options
author | Paul Pazderski | 2019-03-27 12:40:00 +0000 |
---|---|---|
committer | Paul Pazderski | 2019-11-16 21:05:56 +0000 |
commit | 2048c0e37525189f7ae0760944e56d90339758e6 (patch) | |
tree | bb0cd32479b3c358d3fb6f5d73b1a3fa553a4fe5 /org.eclipse.debug.tests | |
parent | 0fcbf89cc35b852138f2fe7750773bb9eb59457e (diff) | |
download | eclipse.platform.debug-2048c0e37525189f7ae0760944e56d90339758e6.tar.gz eclipse.platform.debug-2048c0e37525189f7ae0760944e56d90339758e6.tar.xz eclipse.platform.debug-2048c0e37525189f7ae0760944e56d90339758e6.zip |
Bug 76936 - [console] Handle \b and \r in console outputY20191126-0500I20191126-0600I20191125-1800I20191125-0600I20191124-1800I20191124-0600I20191123-1800I20191123-1115I20191123-0600I20191123-0100I20191122-1800I20191120-2335I20191120-1800I20191120-0840I20191120-0600I20191119-2200I20191119-1800I20191119-1250I20191119-1235I20191119-1215I20191119-1155I20191119-0850I20191119-0725I20191119-0510I20191119-0315I20191119-0020I20191118-2230I20191118-1800
Change-Id: Ia5e5b2760a0a9a097c003c41e3229e149003f22b
Signed-off-by: Paul Pazderski <paul-eclipse@ppazderski.de>
Diffstat (limited to 'org.eclipse.debug.tests')
-rw-r--r-- | org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java index e244d2fbb..eb0cb0aa6 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java @@ -382,6 +382,160 @@ public class IOConsoleTests extends AbstractDebugTest { } /** + * Test enabling/disabling control character interpretation. + */ + public void testControlCharacterSettings() throws Exception { + final IOConsoleTestUtil c = getTestUtil("Test options"); + + c.getConsole().setHandleControlCharacters(false); + c.getConsole().setCarriageReturnAsControlCharacter(false); + c.write("\r.."); + assertEquals("Wrong number of lines.", 2, c.getDocument().getNumberOfLines()); + + c.getConsole().setCarriageReturnAsControlCharacter(true); + c.write("\r.."); + assertEquals("Wrong number of lines.", 3, c.getDocument().getNumberOfLines()); + + c.getConsole().setHandleControlCharacters(true); + c.getConsole().setCarriageReturnAsControlCharacter(false); + c.write("\r.."); + assertEquals("Wrong number of lines.", 4, c.getDocument().getNumberOfLines()); + + c.getConsole().setCarriageReturnAsControlCharacter(true); + c.write("\r.."); + assertEquals("Wrong number of lines.", 4, c.getDocument().getNumberOfLines()); + + closeConsole(c); + assertEquals("Test triggered errors in IOConsole.", 0, loggedErrors.get()); + } + + /** + * Test handling of <code>\b</code>. + */ + public void testBackspaceControlCharacter() throws Exception { + final IOConsoleTestUtil c = getTestUtil("Test \\b"); + c.getConsole().setCarriageReturnAsControlCharacter(false); + c.getConsole().setHandleControlCharacters(true); + try (IOConsoleOutputStream err = c.getConsole().newOutputStream()) { + // test simple backspace cases + c.write("\b").write("|").verifyContent("|").verifyPartitions(); + c.writeFast("\b").write("/").verifyContent("/").verifyPartitions(); + c.writeFast("\b\b\b").write("-\b").verifyContent("-").verifyPartitions(); + c.writeFast("\b1\b2\b3\b").write("\\").verifyContent("\\").verifyPartitions(); + + // test existing output is overwritten independent from stream + c.clear(); + c.writeFast("out").write("err", err).verifyContent("outerr").verifyPartitions(2); + c.writeFast("\b\b\b\b\b\b\b\b\b\b\b\b\b"); + c.writeFast("err", err).write("out").verifyContent("errout").verifyPartitions(2); + c.writeFast("\b\b\b\b\b\b\b\b\b\b\b\b\b"); + c.writeFast("12", err).writeFast("345").write("6789", err).verifyContent("123456789").verifyPartitions(3); + + // test backspace stops at line start + c.clear(); + c.writeFast("First line\n").writeFast("\b\b", err).writeFast("Zecond line"); + c.writeFast("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); + c.write("S", err).verifyContentByLine("First line", 0).verifyContentByLine("Second line", 1).verifyPartitions(2); + + // test in combination with input partitions + c.clear(); + c.writeAndVerify("out").insertTyping("input").writeAndVerify("err", err).verifyContent("outinputerr").verifyPartitions(3); + c.setCaretOffset(6).backspace().backspace().writeAndVerify("~~~").verifyContentByOffset("~~~", -3).verifyPartitions(3); + c.verifyContent("outiuterr~~~"); + c.writeFast("\b\b\b\b\b\b\b\b\b\b\b\b\b"); + c.write("output").verifyContent("outiutput~~~").verifyPartitions(3); + c.setCaretOffset(4).insertTyping("np").verifyContent("outinputput~~~").verifyPartitions(3); + c.write("+++++", err).verifyContent("outinputput+++++").verifyPartitions(3); + c.writeFast(String.join("", Collections.nCopies(11, "\b"))); + c.write("err", err).verifyContent("errinputput+++++").verifyPartitions(3); + + c.clear(); + c.writeAndVerify("ooooo").insertTyping("iii").write("eeee", err).moveCaretToEnd().insertTyping("i").write("oo"); + c.verifyContent("oooooiiieeeeioo").verifyPartitions(3); + c.writeFast(String.join("", Collections.nCopies(7, "\b"))); + c.write("xx").verifyContent("ooooxiiixeeeioo").verifyPartitions(3); + + c.clear(); + c.insert("iiii").writeFast("\b").write("o").verifyContent("iiiio").verifyPartitions(2); + c.write("\b\bee", err).verifyContentByOffset("iiiiee", 0).verifyPartitions(2); + c.writeFast("\b\b\b\b\b\b\b\b", err).write("o").verifyContent("iiiioe").verifyPartitions(3); + + // test if backspace overruns line breaks introduced by input + // (at the moment it should overrun those line breaks) + c.clear(); + c.writeAndVerify("1", err).insertTyping("input").enter().write("2"); + c.verifyContentByLine("1input", 0).verifyContentByLine("2", 1).verifyPartitions(3); + c.writeFast("\b\b\b\b\b\b\b\b\b\b\b\b\b", err); + c.write("???").verifyContentByLine("?input", 0).verifyContentByLine("??", 1).verifyPartitions(3); + c.writeFast("\b\b").writeFast("\b", err).write("><~"); + c.verifyContentByLine(">input", 0).verifyContentByLine("<~", 1).verifyPartitions(3); + + // test output cursor moves according to changed input + c.clear(); + c.writeAndVerify("abc", err).insert("<>").write("def").verifyContent("abc<>def").verifyPartitions(3); + c.write("\b\b").setCaretOffset(4).insertTypingAndVerify("-=-").verifyContent("abc<-=->def").verifyPartitions(3); + c.moveCaret(-1).backspace().verifyContent("abc<-->def").verifyPartitions(3); + c.write("e\b\b\b\b", err).insertTyping("++").verifyContent("abc<-++->def").verifyPartitions(3); + c.select(0, c.getDocument().getLength()).backspace().write("b").verifyContent("abcdef").verifyPartitions(3); + + // break output line + // NOTE: this may not be the desired behavior + c.clear(); + c.writeFast("1.2.").writeFast("\b\b").write("\n"); + c.verifyContentByLine("1.", 0).verifyContentByLine(".", 1).verifyPartitions(); + c.writeFast("\b\b\b\b").write("2."); + c.verifyContentByLine("1.", 0).verifyContentByLine("2.", 1).verifyPartitions(); + } + closeConsole(c); + assertEquals("Test triggered errors in IOConsole.", 0, loggedErrors.get()); + } + + /** + * Test handling of <code>\r</code>. + */ + public void testCarriageReturnControlCharacter() throws Exception { + final IOConsoleTestUtil c = getTestUtil("Test \\r"); + c.getConsole().setCarriageReturnAsControlCharacter(true); + c.getConsole().setHandleControlCharacters(true); + try (IOConsoleOutputStream err = c.getConsole().newOutputStream()) { + // test simple carriage return cases + c.write("\r"); + assertEquals("Wrong number of lines.", 1, c.getDocument().getNumberOfLines()); + c.writeFast("bad", err).write("\rgood").verifyContent("good").verifyPartitions(1); + assertEquals("Wrong number of lines.", 1, c.getDocument().getNumberOfLines()); + + // test carriage return stops at line start + c.clear(); + c.writeFast("First line\r\n").write("Zecond line", err); + c.verifyContentByLine("First line", 0).verifyContentByLine("Zecond line", 1).verifyPartitions(2); + assertEquals("Wrong number of lines.", 2, c.getDocument().getNumberOfLines()); + c.writeFast("\r").write("3. ").verifyContentByLine("3. line", 1).verifyPartitions(2); + assertEquals("Wrong number of lines.", 2, c.getDocument().getNumberOfLines()); + c.writeFast("\r\r\r", err).write("Second").verifyContentByLine("Second line", 1).verifyPartitions(2); + assertEquals("Wrong number of lines.", 2, c.getDocument().getNumberOfLines()); + + // test carriage return with input partitions + c.clear(); + c.insertTypingAndVerify("input").writeFast("out\r").write("err", err); + c.verifyContent("inputerr").verifyPartitions(2); + c.enter().write("\rout").verifyContentByLine("inputout", 0).verifyPartitions(2); + c.write("err", err).verifyContentByLine("err", 1).verifyPartitions(3); + c.write("\roooooo").verifyContentByLine("inputooo", 0).verifyContentByLine("ooo", 1).verifyPartitions(2); + + // test in combination with \r\n + c.clear(); + c.write("\r\n"); + assertEquals("Wrong number of lines.", 2, c.getDocument().getNumberOfLines()); + c.writeFast("err", err).writeFast("\r\r\r\r\r\r\r\r\n\n").write("out"); + assertEquals("Wrong number of lines.", 4, c.getDocument().getNumberOfLines()); + c.verifyContentByLine("out", -1).verifyPartitions(); + assertTrue("Line breaks did not overwrite text.", !c.getDocument().get().contains("err")); + } + closeConsole(c); + assertEquals("Test triggered errors in IOConsole.", 0, loggedErrors.get()); + } + + /** * Test larger number of partitions with pseudo random console content. */ public void testManyPartitions() throws IOException { |